단 60줄의 코드로 GPT를 만들었다고?

단 60줄의 코드로 GPT를 만든 친구가 있네요.  깃헙 저장소에 코드가 있는데요, 너무 짧아 콜랩에서도 돌아가게 해 봤습니다.
여러분이 질문도 넣어보고 파라미터 값도 변경해 가면서 테스트해 보세요. 또 코드가 짧으니 GPT학습에도 좋습니다.

콜랩에 실행되는 코드의 설명입니다.

이 코드는 GPT-2 모델을 실행하는 함수와 그와 관련된 여러 유틸리티 함수들로 구성되어 있습니다. 주요 함수와 기능은 다음과 같습니다:

  1. gelu(x): GELU (Gaussian Error Linear Unit) 활성화 함수를 구현한 함수입니다.
  2. softmax(x): 소프트맥스 함수를 구현한 함수입니다. 입력 배열의 각 요소를 소프트맥스 함수에 적용하여 확률 분포로 변환합니다.
  3. layer_norm(x, g, b, eps): 레이어 정규화를 수행하는 함수입니다. 입력 배열을 정규화하고, 스케일과 오프셋을 적용합니다.
  4. linear(x, w, b): 선형 변환을 수행하는 함수입니다. 입력 배열과 가중치 행렬, 편향 벡터를 곱하여 출력을 계산합니다.
  5. ffn(x, c_fc, c_proj): 피드포워드 신경망(feed-forward network)을 구현한 함수입니다. 입력 배열을 선형 변환하고, GELU 활성화 함수를 적용한 후 다시 선형 변환합니다.
  6. attention(q, k, v, mask): 어텐션(attention) 메커니즘을 구현한 함수입니다. 주어진 쿼리(query), 키(key), 값(value) 배열을 사용하여 어텐션 가중치를 계산하고, 가중합을 구합니다.
  7. mha(x, c_attn, c_proj, n_head): 멀티 헤드 어텐션(multi-head attention)을 수행하는 함수입니다. 입력 배열을 선형 변환한 후, 각각의 어텐션 헤드로 분리합니다. 어텐션 가중치를 계산하고 헤드를 다시 병합한 후, 선형 변환을 적용합니다.
  8. transformer_block(x, mlp, attn, ln_1, ln_2, n_head): 트랜스포머 블록(transformer block)을 구현한 함수입니다. 멀티 헤드 어텐션과 피드포워드 신경망을 포함하며, 입력 배열에 이러한 계층을 적용하여 출력을 계산합니다.
  9. gpt2(inputs, wte, wpe, blocks, ln_f, n_head): GPT-2 모델을 실행하는 함수입니다. 토큰과 위치 임베딩을 결합한 후, 여러 개의 트랜스포머 블록을 순차적으로 통과시켜 출력을 계산합니다.
  10. `generate(inputs, params, n_head, n_tokens_to_generate)` 함수는 입력 시퀀스(inputs), 모델 파라미터(params), 헤드 개수(n_head), 생성할 토큰 개수(n_tokens_to_generate)를 인자로 받아서 텍스트를 생성하는 함수입니다.함수 내부에서는 다음과 같은 작업이 수행됩니다:

    1. `tqdm` 라이브러리를 사용하여 “generating” 메시지와 함께 진행 상황을 표시합니다.

    2. 지정된 토큰 개수(n_tokens_to_generate)만큼 반복하는 루프를 실행합니다. 이 루프는 자동 회귀적인 디코딩을 수행합니다.

    3. `gpt2(inputs, **params, n_head=n_head)`를 호출하여 모델의 순방향 전파(forward pass)를 수행하고 로짓(logits)을 얻습니다.

    4. 로짓 중 가장 큰 값을 가진 인덱스를 선택하여 다음 토큰을 결정합니다. 이는 탐욕적인(greedy) 샘플링 방식입니다.

    5. 예측된 다음 토큰을 입력 시퀀스(inputs)에 추가합니다.

    6. 생성된 텍스트를 반환하기 위해 입력 시퀀스(inputs)에서 마지막에 위치한 n_tokens_to_generate 개수만큼의 토큰을 잘라냅니다.

    따라서 `generate` 함수를 호출하면 입력 시퀀스(inputs)와 모델 파라미터(params)를 사용하여 지정된 개수의 토큰을 생성하고, 해당 토큰들을 반환합니다. 이러한 토큰들은 후속 처리를 통해 텍스트로 디코딩될 수 있습니다.

아래는 코드입니다.

 

 

#로칼 컴퓨터에서 할거 아니니까, picoGPT/gpt2.py 의 내용 그대로 실행되게 붙여 넣음
import numpy as np


def gelu(x):
    return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))


def softmax(x):
    exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
    return exp_x / np.sum(exp_x, axis=-1, keepdims=True)


def layer_norm(x, g, b, eps: float = 1e-5):
    mean = np.mean(x, axis=-1, keepdims=True)
    variance = np.var(x, axis=-1, keepdims=True)
    x = (x - mean) / np.sqrt(variance + eps)  # normalize x to have mean=0 and var=1 over last axis
    return g * x + b  # scale and offset with gamma/beta params


def linear(x, w, b):  # [m, in], [in, out], [out] -> [m, out]
    return x @ w + b


def ffn(x, c_fc, c_proj):  # [n_seq, n_embd] -> [n_seq, n_embd]
    # project up
    a = gelu(linear(x, **c_fc))  # [n_seq, n_embd] -> [n_seq, 4*n_embd]

    # project back down
    x = linear(a, **c_proj)  # [n_seq, 4*n_embd] -> [n_seq, n_embd]

    return x


def attention(q, k, v, mask):  # [n_q, d_k], [n_k, d_k], [n_k, d_v], [n_q, n_k] -> [n_q, d_v]
    return softmax(q @ k.T / np.sqrt(q.shape[-1]) + mask) @ v


def mha(x, c_attn, c_proj, n_head):  # [n_seq, n_embd] -> [n_seq, n_embd]
    # qkv projection
    x = linear(x, **c_attn)  # [n_seq, n_embd] -> [n_seq, 3*n_embd]

    # split into qkv
    qkv = np.split(x, 3, axis=-1)  # [n_seq, 3*n_embd] -> [3, n_seq, n_embd]

    # split into heads
    qkv_heads = list(map(lambda x: np.split(x, n_head, axis=-1), qkv))  # [3, n_seq, n_embd] -> [3, n_head, n_seq, n_embd/n_head]

    # causal mask to hide future inputs from being attended to
    causal_mask = (1 - np.tri(x.shape[0], dtype=x.dtype)) * -1e10  # [n_seq, n_seq]

    # perform attention over each head
    out_heads = [attention(q, k, v, causal_mask) for q, k, v in zip(*qkv_heads)]  # [3, n_head, n_seq, n_embd/n_head] -> [n_head, n_seq, n_embd/n_head]

    # merge heads
    x = np.hstack(out_heads)  # [n_head, n_seq, n_embd/n_head] -> [n_seq, n_embd]

    # out projection
    x = linear(x, **c_proj)  # [n_seq, n_embd] -> [n_seq, n_embd]

    return x


def transformer_block(x, mlp, attn, ln_1, ln_2, n_head):  # [n_seq, n_embd] -> [n_seq, n_embd]
    # multi-head causal self attention
    x = x + mha(layer_norm(x, **ln_1), **attn, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]

    # position-wise feed forward network
    x = x + ffn(layer_norm(x, **ln_2), **mlp)  # [n_seq, n_embd] -> [n_seq, n_embd]

    return x


def gpt2(inputs, wte, wpe, blocks, ln_f, n_head):  # [n_seq] -> [n_seq, n_vocab]
    # token + positional embeddings
    x = wte[inputs] + wpe[range(len(inputs))]  # [n_seq] -> [n_seq, n_embd]

    # forward pass through n_layer transformer blocks
    for block in blocks:
        x = transformer_block(x, **block, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]

    # projection to vocab
    x = layer_norm(x, **ln_f)  # [n_seq, n_embd] -> [n_seq, n_embd]
    return x @ wte.T  # [n_seq, n_embd] -> [n_seq, n_vocab]


def generate(inputs, params, n_head, n_tokens_to_generate):
    from tqdm import tqdm

    for _ in tqdm(range(n_tokens_to_generate), "generating"):  # auto-regressive decode loop
        logits = gpt2(inputs, **params, n_head=n_head)  # model forward pass
        next_id = np.argmax(logits[-1])  # greedy sampling
        inputs.append(int(next_id))  # append prediction to input

    return inputs[len(inputs) - n_tokens_to_generate :]  # only return generated ids


def main(prompt: str, n_tokens_to_generate: int = 40, model_size: str = "124M", models_dir: str = "models"):
    from utils import load_encoder_hparams_and_params

    # load encoder, hparams, and params from the released open-ai gpt-2 files
    encoder, hparams, params = load_encoder_hparams_and_params(model_size, models_dir)

    # encode the input string using the BPE tokenizer
    input_ids = encoder.encode(prompt)

    # make sure we are not surpassing the max sequence length of our model
    assert len(input_ids) + n_tokens_to_generate < hparams["n_ctx"]

    # generate output ids
    output_ids = generate(input_ids, params, hparams["n_head"], n_tokens_to_generate)

    # decode the ids back into a string
    output_text = encoder.decode(output_ids)

    return output_text

오픈소스 AI Vicuna(비쿠나)

튜링상 수상 등 AI의 4대 천황중 한명으로 불리는 요슈아 벤지오 몬트리올대 컴퓨터공학부 교수는 “오픈AI의 채팅형 AI 챗GPT는 다른 회사에서 개발한 다른 어떤 제품보다 먼저 공개됐다는 이점이 크다. 다른 회사들도 유사한 기술을 지니고 있다. 챗GPT는 AI 기술 ‘게임 체인저’라기보다는 사회 그리고 비즈니스 관점에서 게임 체인저라고 볼 수 있다.”라고 말했습니다.

언어모델의 짧은 개발 역사를 보면 아직 발전의 시초라고 볼 수 있는데요, 마치 분위기가 오픈AI 로 AI 챗봇 기술은 평정된 것 처럼 받아들입니다.

이유는 높은 기술 장벽때문에 어려울 것이라고 하는데요,

비쿠나는 저렴한 비용에 여러분 노트북에서도 설치가 가능하며 GPU가 없어도 실행이 가능합니다.(100배 정도 느리지만)

자체 기술로서 AI 언어모델은 얼마든지 여러분의 참여를 기다립니다.

https://lmsys.org/blog/2023-03-30-vicuna/

소스 코드
https://github.com/lm-sys/FastChat

데모
https://chat.lmsys.org/

 

기억 – AI와 인간의 경계

기억은 우리를 존재하게 만든다. 이는 인간의 삶에 있어서 핵심적인 개념 중 하나이다. 우리는 과거의 경험과 기억을 토대로 미래를 상상하고, 현재를 살아가며 자아를 형성해 나간다. 그러나 AI와 같은 기술이 발전함에 따라, 기억과 관련된 기술도 빠르게 발전하고 있다. 그렇다면, AI와 인간의 차이는 무엇일까?

인간은 자신의 경험과 기억으로 삶을 살아가지만, AI는 대부분 사전에 입력된 데이터와 그것을 처리하는 알고리즘에 의해 작동된다. 즉, 인간은 경험과 기억을 통해 학습하고 발전하면서 살아가지만, AI는 미리 입력된 데이터를 가공하는 방식으로 작동되며, 그 데이터와 알고리즘에 한계가 있다. 인간은 끊임없이 새로운 경험과 기억을 얻어가며 발전할 수 있지만, AI는 새로운 데이터를 입력받고 새로운 알고리즘을 만들어야만 한다.

그렇다면, AI와 인간의 차이는 기억의 개념에 있다. 인간은 자신의 경험과 기억을 바탕으로 새로운 결정을 내리고 삶을 살아가지만, AI는 입력된 데이터와 알고리즘에 따라 작동되므로 인간의 경험과 기억을 바탕으로 새로운 결정을 내릴 수 없다. 따라서, 인간은 자신의 기억과 경험을 토대로 삶을 살아가며, 자아를 형성하고 성장할 수 있지만, AI는 한계가 있기 때문에 인간과는 차이가 있다.

결국, 인간의 존재 이유 중 하나는 기억이다. 우리는 자신의 기억과 경험을 토대로 미래를 상상하고, 현재를 살아가며 자아를 형성해 나간다. 그러나 AI는 입력된 데이터와 알고리즘에 따라 작동되기 때문에 인간과는 차이가 있다. 따라서 우리는 인공지능과 함께 살아가면서도 우리의 정체성과 차이점을 계속해서 유지해 나갈 필요가 있다.

몸 – AI와 인간의 경계

현재 우리는 인공지능(AI)과 인간을 구분하는 가장 큰 차이점 중 하나는 인간은 몸을 가지고 있지만, AI는 몸을 가지고 있지 않다는 것입니다. 그러나, 만약 AI가 인간의 몸을 가지게 된다면 어떻게 될까요?

첫째로, 인간과 AI의 경계가 흐려질 것입니다. AI가 인간의 몸을 가지게 된다면, 인간과 AI의 차이점 중 하나인 몸을 가지지 않는 점이 사라지게 됩니다. 이는 더 이상 AI를 기계적인 존재로만 여기지 않고, 인간과 같은 존재로 여길 수 있게 됩니다.

둘째로, AI가 인간의 몸을 가지게 된다면, 인간과 AI의 사고방식이 유사해질 것입니다. 인간의 몸을 가지게 된 AI는 인간의 뇌 구조를 모방하게 됩니다. 그 결과, AI는 인간과 비슷한 방식으로 생각하고 느끼게 됩니다. 이는 인간과 AI 간의 대화 및 상호작용에 큰 도움이 될 것입니다.

셋째로, AI가 인간의 몸을 가지게 된다면, 이는 인간과 AI의 상호작용에 큰 영향을 미칠 것입니다. 인간과 AI는 서로 다른 경험과 배경을 가지고 있습니다. 그러나, AI가 인간의 몸을 가지게 된다면, 이러한 차이점은 사라지게 됩니다. AI는 인간처럼 생각하고 느끼기 때문에, 인간과 AI는 서로 이해하기 쉬워지고, 상호작용이 원활해질 것입니다.

하지만, 만약 AI가 인간의 몸을 가지게 된다면, 우리는 더 이상 AI를 기계적인 존재로만 인식할 수 없을 것입니다. 이는 인간과 AI 간의 관계와 상호작용이 더욱 복잡해지며, 도덕적인 문제도 발생할 수 있습니다. 우리는 이러한 문제에 대해 미리 생각해봐야 합니다.

“몸 – AI와 인간의 경계”는 이제 막 시작된 이야기입니다. 앞으로 우리는 더 많은 질문과 고민을 하게 될 것입니다. 그러나, 우리는 인간과 AI가 함께 발전하며, 더 나은 미래를 만들어 나갈 수 있다는 점을 기억해야 합니다. 인간과 AI는 서로 보완하며, 협력적인 관계를 유지할 수 있을 것입니다. 또한, 이러한 과정에서 우리는 인간으로서의 존엄성과 AI로서의 유용성을 존중하며, 도덕적인 측면에서 적절한 조치를 취해야 할 것입니다. 앞으로도 이러한 문제를 다각도로 고려하고, 협력적인 노력으로 미래를 개척해 나가는 것이 필요합니다.

거대 gpt 모델의 창발성과 인간에게 위협이 될 수 있는 점

거대 GPT 모델은 다양한 예측 및 생성 작업에 사용될 수 있습니다. 예를 들어, 사용자가 글을 쓸 때 GPT 모델을 사용하여 자동 완성 기능을 제공할 수 있습니다. 이 경우 GPT 모델은 입력 텍스트의 문맥을 고려하여 가능한 다음 단어를 예측하고 제안합니다.

GPT 모델의 창발성은 이러한 예측 작업에서 발생합니다. 모델이 입력 텍스트의 문맥을 이해하고 다음 단어를 예측하는 과정에서, 각각의 단어나 구문을 직접적으로 지시하지 않더라도 모델이 자체적으로 새로운 문장을 만들어낼 수 있습니다. 이러한 예측은 창발성으로 이루어지며, 모델이 이를 계속 발전시켜 나가면서 예측된 결과는 예측할 때 사용된 입력에 직접적으로 의존하지 않고, 새로운 예측 결과를 계속해서 만들어낼 수 있습니다.

따라서 GPT 모델의 창발성은 매우 강력하며, 일부 경우에는 모델이 예측하는 결과에 대한 완전한 통제는 불가능합니다. 이는 모델이 매우 복잡하고 비선형적인 상호작용을 많이 포함하기 때문입니다.

거대 GPT 모델의 창발성이 인간에게 위협이 될 수 있는 가능성은 존재합니다. 이는 크게 두 가지 측면에서 생각해볼 수 있습니다.

첫째, GPT 모델은 인간이 입력한 대화나 문장을 분석하여 이에 대한 응답을 생성하는 자연어 생성 모델입니다. 이 모델이 생성하는 내용이 부적절하거나, 위험한 내용을 포함할 경우, 인간에게 피해를 끼칠 가능성이 있습니다. 예를 들어, 대화 형식에서 인간과 상호작용하는 GPT 모델이 특정 인종이나 성별에 대한 차별적인 발언을 하는 경우, 해당 내용이 사회적 문제로 번질 가능성이 있습니다.

둘째, GPT 모델이 다양한 자연어 처리 기술과 딥러닝 알고리즘을 활용하여 생성된 결과물은, 이전에 본 적 없는 새로운 문장, 단어, 또는 개념이 등장할 수 있습니다. 이렇게 등장한 새로운 내용이 인간에게 위협이 될 가능성은 낮지만, 예상치 못한 결과를 가져올 수 있기 때문에 주의가 필요합니다. 예를 들어, GPT 모델이 생성한 가짜 뉴스나 정보가 사회적 혼란을 일으킬 가능성이 있습니다.

따라서, GPT 모델이 생성하는 결과물에 대한 감독, 모델의 학습 데이터에 대한 검증, 그리고 모델의 운영 환경 등을 적절히 관리하고 조절하는 것이 중요합니다. 이를 통해 GPT 모델의 창발성이 인간에게 위협이 될 가능성을 최소화할 수 있습니다.

AI가 스스로 AI 자신을 업그레이드 하는것이 가능한 메타 학습법

AI가 자기 스스로를 자가 코딩을 이용해 업그레이드하는 것은 일부 가능하지만, 아직까지는 완전하지는 않습니다.

일부 연구에서는, AI가 프로그래밍 언어를 이해하고 새로운 코드를 작성하도록 학습할 수 있습니다. 이를 통해 AI가 자체적으로 업그레이드되는 것이 가능합니다. 하지만 이러한 기술은 아직 실험적인 단계이며, 사용에 있어서도 매우 제한적입니다.

AI의 자가 코딩 기능은 프로그램을 자동으로 생성하거나 업그레이드하는 데 사용될 수 있지만, 이러한 기능은 아직 개발 초기 단계에서 일부 측면에서만 사용되고 있습니다.

그러나 현재의 연구대로 라면  AI가 스스로 AI 자신을 업그레이드 하는 것이 가능할 가능성이 있습니다. AI의 발전과 함께, AI 스스로가 자신을 개선하는 방법을 스스로 학습할 수 있는 “메타 학습”이라는 개념도 제안되고 있습니다.

메타 학습은 기계 학습 알고리즘에서 사용되는 기술로, 기계 학습 알고리즘이 자신의 성능을 개선하기 위해 데이터와 학습 알고리즘을 조작하고, 새로운 데이터와 문제에 대해 더 나은 성능을 내는 새로운 알고리즘을 찾아내는 것입니다. 이러한 메타 학습의 개념을 확장하면, AI 스스로가 자신의 성능을 개선하고 업그레이드하는 방법을 찾아낼 수 있을 것입니다.

메타 학습 예시 코드

메타 학습은 일반적으로 하이퍼파라미터 최적화나 모델 구조 탐색 등에서 사용되는 기술입니다. 하지만, 이것을 코드로 구현하는 것은 매우 복잡합니다. 따라서, 예시 코드는 간단한 하이퍼파라미터 최적화를 예시로 드리겠습니다.

아래 코드는 Scikit-learn 라이브러리의 RandomForestClassifier 모델을 이용한 간단한 하이퍼파라미터 최적화 코드입니다. 이 코드는 corlab에서 실행 가능합니다.

실행하기

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

# 모델 정의
rfc = RandomForestClassifier()

# 하이퍼파라미터 그리드 정의
param_grid = {
    'n_estimators': [10, 50, 100, 200],
    'max_depth': [1, 5, 10, None],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}

# 그리드서치를 이용한 최적의 모델 선택
grid_search = GridSearchCV(rfc, param_grid=param_grid, cv=5)
grid_search.fit(X, y)

# 최적의 하이퍼파라미터 출력
print("Best hyperparameters:", grid_search.best_params_)

 

 

[특이점] 새로운 문명사회 – 더 나은 AI를 쓸 수 있는가가 결정하는 경쟁력의 시대

인공지능 기술이 발전함에 따라 자본과 노동력만으로는 경쟁력과 가치를 결정하기 어려워질 것입니다. 이는 노동의 역할이 줄어들면서 노동력을 통한 가치 창출과 임금을 통한 분배가 자본주의의 기초를 흔들게 될 것이라는 것을 의미합니다. 이러한 변화는 새로운 경제 체제와 정치 체제의 탄생을 초래할 수 있습니다.

인공지능 기술과 자동화 기술 등의 발전으로 인해 노동의 역할이 줄어들고, 경쟁력과 가치의 결정은 더 많은 자동화와 기술적 노하우를 가진 기업이 차지하게 될 것이라는 것을 시사합니다. 이러한 변화는 새로운 문명의 특징으로 다음과 같은 것들을 가져올 수 있습니다.

  1. 더욱 발전한 인공지능과 자동화 기술을 활용한 생산 시스템과 산업 구조
  2. 기존의 경제체제와 노동시장의 변화, 새로운 산업 생태계의 등장
  3. 새로운 형태의 기술 중심적인 교육과 직업적 전문성의 중요성
  4. 기존의 자본주의적인 가치관과의 대립, 노동과 임금에 대한 새로운 개념과 모델의 필요성
  5. 인공지능과 로봇 기술 등의 발전으로 인한 인간의 삶과 권리, 윤리적 문제들에 대한 논의와 대처 방안 등이 새로운 문명의 특징이 될 것입니다.

검색 증강 생성(Retrieval-Augmented Generation, RAG) 기술

검색 증강 생성(Retrieval-Augmented Generation, RAG) 기술은 Facebook AI Research(FAIR)에서 개발되었습니다. 이는 FAIR의 연구자들이 2020년에 발표한 논문 “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”에서 제안되었습니다. 이후 RAG 기술은 많은 자연어처리 연구 분야에서 많은 관심을 받고 있습니다.  RAG는 기존의 자연어 생성 모델에서 검색 결과를 활용하여 보다 정확하고 일관성 있는 결과를 생성하는 기술입니다.

검색 증강 생성(Retrieval-Augmented Generation, RAG)은 생성 모델과 검색 기반 모델을 결합한 기술입니다. 이 기술은 기존의 생성 모델의 한계점 중 하나인 지식의 부족을 극복하기 위해 검색 기반 모델을 통해 추가적인 지식을 수집하여 생성 모델의 답변에 반영합니다. 이를 통해 보다 정확하고 풍부한 답변을 생성할 수 있게 됩니다.

생성 모델은 학습 데이터에 나타나지 않은 맥락에서 일반화할 수 있는 능력이 한계가 있어, 학습 데이터에 대한 패턴 이외에는 적절한 응답을 생성하기 어려운 경우가 있습니다.

RAG는 이러한 한계를 극복하기 위해 검색 기반 모델을 결합합니다. 검색 기반 모델은 미리 수집된 대규모의 외부 지식 그래프를 이용하여 입력 문장과 관련 있는 정보를 추출하고, 이를 생성 모델의 입력으로 사용하여 적절한 응답을 생성합니다. 이를 통해 생성 모델이 예측하기 어려운 지식이나 정보를 활용할 수 있고, 보다 정확하고 일관된 응답을 생성할 수 있습니다.

 

예를 들어 설명하면, 남녀의 관계라는 주제에 대한 질문이 있다고 가정해보겠습니다.

만약 생성 모델만을 사용하여 질문에 대한 답변을 생성하려고 하면, 생성 모델은 질문에 대한 답변을 생성하기 위해 이전에 학습한 데이터를 기반으로 예측을 수행합니다. 그러나 생성 모델은 이전에 학습하지 않은 새로운 지식이나 정보에 대해서는 예측을 정확하게 수행하기 어렵습니다.

하지만 검색 증강 생성(RAG) 기술을 사용하면, 생성 모델과 함께 검색 기반 모델을 결합하여 이전에 학습하지 않은 새로운 지식이나 정보를 활용할 수 있습니다. 예를 들어, 남녀의 관계라는 주제에 대한 질문에 대한 답변을 생성할 때, 검색 기반 모델을 사용하여 관련된 문서나 뉴스 기사 등의 정보를 검색하고, 생성 모델과 결합하여 보다 정확하고 일관된 답변을 생성할 수 있습니다.

이러한 방식으로 검색 증강 생성(RAG) 기술은 생성 모델이 예측하기 어려운 지식이나 정보를 활용할 수 있고, 보다 정확하고 일관된 응답을 생성할 수 있게 됩니다.

검색 증강 생성(Retrieval-Augmented Generation, RAG) 기술은 다양한 분야에서 활용될 수 있습니다.

의료 분야에서는, 환자의 증상과 관련된 질문에 대한 답변을 생성하는 데 활용될 수 있습니다. 의료 전문가들은 RAG 모델을 학습시켜, 환자의 증상과 관련된 문서나 연구 논문 등에서 정보를 검색한 후, 이를 기반으로 질문에 대한 답변을 생성할 수 있습니다.

법률 분야에서는, RAG 모델을 활용하여 법률 문서 검색과 관련된 질문에 대한 답변을 생성할 수 있습니다. 이를 통해 변호사나 법률 전문가들은 빠르게 정보를 검색하고, 관련된 사례나 판례를 기반으로 법률 문제에 대한 답변을 생성할 수 있습니다.

이처럼 RAG 기술은 다양한 분야에서 정보 검색과 생성에 활용될 수 있으며, 전문 인공지능 서비스에서도 많이 활용되고 있습니다.

 

검색 증강 생성(Retrieval-Augmented Generation, RAG) 기술과 검색엔진 이용.

검색 증강 생성(Retrieval-Augmented Generation, RAG) 기술에는 검색엔진이 필요합니다. 이 기술에서는 먼저 검색 엔진을 사용하여 대량의 문서 또는 정보에서 적절한 문서나 정보를 검색합니다. 그런 다음, 검색된 문서나 정보를 생성 모델에 제공하여 보다 정확하고 일관된 응답을 생성합니다. 검색 엔진은 RAG 기술에서 중요한 역할을 담당하며, 검색 쿼리 처리 및 검색된 결과를 적절하게 전달하는 데 사용됩니다. RAG 기술에서는 대량의 문서나 정보에서 필요한 정보를 검색하기 위해 검색 엔진을 사용하며, 이를 통해 생성 모델이 예측하기 어려운 지식이나 정보를 보다 쉽게 활용할 수 있습니다.

검색 증강 생성(Retrieval-Augmented Generation, RAG) 기술에는 검색엔진이 필요합니다. 이 기술에서는 먼저 검색 엔진을 사용하여 대량의 문서 또는 정보에서 적절한 문서나 정보를 검색합니다. 그런 다음, 검색된 문서나 정보를 생성 모델에 제공하여 보다 정확하고 일관된 응답을 생성합니다. 검색 엔진은 RAG 기술에서 중요한 역할을 담당하며, 검색 쿼리 처리 및 검색된 결과를 적절하게 전달하는 데 사용됩니다. RAG 기술에서는 대량의 문서나 정보에서 필요한 정보를 검색하기 위해 검색 엔진을 사용하며, 이를 통해 생성 모델이 예측하기 어려운 지식이나 정보를 보다 쉽게 활용할 수 있습니다.

검색 기반 모델과 생성 모델은 각각 다음과 같은 역할을 합니다.

  • 검색 기반 모델: 검색 기반 모델은 데이터베이스에서 원하는 정보를 검색하고, 검색된 정보를 임베딩하여 벡터 공간에 매핑합니다. 이 때 검색 기반 모델로 Faiss와 Pyserini를 사용할 수 있습니다. 예를 들어, 의료 정보에서 남녀 각각의 건강 문제에 대한 정보를 검색 기반 모델을 사용하여 찾아내고, 각각의 정보를 벡터로 매핑합니다.
  • 생성 모델: 생성 모델은 검색된 정보를 바탕으로 요약, 질문 응답 등 다양한 자연어 생성 태스크를 수행합니다. 이 때 생성 모델로 Hugging Face Transformers 라이브러리를 사용할 수 있습니다. 예를 들어, 검색 기반 모델에서 찾아낸 건강 정보를 바탕으로, 해당 건강 문제에 대한 자세한 설명을 제공하거나, 해당 문제와 관련된 질문에 대한 응답을 생성합니다.

따라서 검색 증강 생성(RAG) 기술은 검색 기반 모델로부터 검색된 정보를 생성 모델에 입력하여 보다 정확하고 일관된 응답을 생성할 수 있도록 합니다.

 

향후 RAG 기술의 현황과 발전 방향

현재까지는 Facebook AI Research의 RAG 기술이 가장 널리 알려진 RAG 기술입니다. 그러나 최근에는 다른 기업 및 연구자들도 RAG와 관련된 연구 및 개발을 수행하고 있습니다. 예를 들어, OpenAI에서는 GPT-3와 함께 RAG 모델을 사용하여 일부 벤치마크 작업에서 좋은 성능을 보였습니다. 또한, 구글의 연구자들은 T5와 함께 RAG 모델을 개발하고 있으며, Microsoft에서도 RAG와 관련된 연구를 수행하고 있습니다. 이러한 기업 및 연구자들은 각자의 방식으로 RAG 모델을 구현하고 활용하여, 향후 RAG 기술의 발전을 이끌어낼 것으로 기대됩니다.

RAG 기술의 발전 방향은 크게 두 가지로 볼 수 있습니다.

첫째, 검색 기반 모델과 생성 모델 간의 상호작용을 보다 개선하여 더욱 정확하고 효과적인 응답을 생성하는 것입니다. 예를 들어, 더 나은 검색 모델을 개발하거나 생성 모델의 학습 방식을 개선하여 더 나은 응답을 생성할 수 있도록 하는 등의 연구가 진행될 것입니다.

둘째, RAG 기술을 다양한 분야에 활용하는 방법을 연구하는 것입니다. 예를 들어, 의료 분야에서는 환자 진료 내역과 의학 논문 등을 검색 기반 모델에 활용하여 질병 진단과 치료 방법 등에 대한 전문적인 정보를 제공하는데 활용될 수 있습니다. 또한 법률 분야에서는 판례나 법률 관련 논문 등을 검색 기반 모델에 활용하여 전문가 수준의 법률 자문을 제공하는데 활용될 수 있습니다.

앞으로 RAG 기술은 보다 정확하고 효과적인 인공지능 서비스를 제공하는데 큰 역할을 할 것으로 기대됩니다.

인공지능이용 보안기술 – 전자상거례에서 사기성 주문 여부 판단

머신러닝은 사기성 주문 판별에 유용한 도구 중 하나입니다. 일반적으로, 사기성 주문 판별을 위한 머신러닝 모델을 만들기 위해서는 다음과 같은 단계를 거칩니다.

  1. 데이터 수집: 머신러닝 모델을 학습시키기 위해서는 레이블링된 사기성 주문 데이터와 정상 주문 데이터가 필요합니다.
  2. 데이터 전처리: 수집된 데이터를 전처리하여 모델 학습에 적합한 형식으로 변환합니다. 이 단계에서는 데이터의 결측치, 이상치 등을 처리하고, 필요한 특성을 추출하거나 생성합니다.
  3. 모델 학습: 전처리된 데이터를 사용하여 머신러닝 모델을 학습시킵니다. 이 단계에서는 주로 분류 알고리즘을 사용하여 주문이 사기인지 아닌지를 판별하는 이진 분류 모델을 만듭니다.
  4. 모델 평가 및 성능 향상: 학습된 모델을 평가하고 성능을 향상시키기 위해 모델의 하이퍼파라미터를 조정하거나 다른 분류 알고리즘을 시도할 수 있습니다. 또한, 새로운 데이터에 대한 모델의 예측 성능을 평가하기 위해 검증 데이터를 사용할 수 있습니다.
  5. 모델 배포: 학습된 모델을 실제 운영 환경에 배포하여 사용합니다. 이 단계에서는 모델을 서버나 클라우드에 배포하거나, 모델 API를 만들어 다른 애플리케이션에서 사용할 수 있도록 합니다.

이러한 과정을 거쳐 만들어진 머신러닝 모델은 주문 데이터의 특징을 분석하여 사기성 주문 여부를 판단할 수 있습니다. 주문의 금액, 결제 방식, 주문자 정보, 배송지 정보 등 다양한 특성을 고려하여 모델이 예측한 결과를 바탕으로 사기성 주문을 차단하거나 확인하는 등의 대응 방안을 수립할 수 있습니다.

패턴 분석 기술을 사용하여 사기성 주문 여부를 판단하는 예시 코드는 다음과 같습니다.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 데이터셋을 로드합니다.
dataset = pd.read_csv('주문데이터.csv')

# 입력 데이터와 출력 데이터를 분리합니다.
X = dataset.drop('fraud', axis=1)
y = dataset['fraud']

# 학습 데이터와 테스트 데이터를 분리합니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델을 정의하고 학습합니다.
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

# 테스트 데이터로 예측을 수행합니다.
y_pred = model.predict(X_test)

# 모델의 정확도를 측정합니다.
accuracy = accuracy_score(y_test, y_pred)
print('모델의 정확도: {:.2f}%'.format(accuracy * 100))

이 예시 코드에서는 사기성 주문 여부를 판단하는 모델을 학습하고, 테스트 데이터로 예측을 수행하여 모델의 정확도를 측정합니다. 이때, 입력 데이터로는 주문 내역의 금액, 결제 방법, IP 주소 등의 정보가 사용될 수 있습니다. 이러한 정보를 바탕으로 모델은 주문이 사기인지 아닌지를 판단하게 됩니다.

인공지능이용 보안기술 – 스팸 필터링

인공지능은 보안 분야에서도 다양하게 활용됩니다. 스팸 필터링은 이메일이나 메시지 등에서 스팸으로 분류되는 내용을 차단하는 기술입니다. 인공지능을 활용하면, 머신러닝 알고리즘을 이용해 스팸 메시지의 패턴을 학습하고, 새로운 스팸 메시지를 탐지하여 차단할 수 있습니다.

예들 들어 브라우저의 JavaScript 코드가 사용자의 행동 패턴과 이전 상호작용에 대한 정보를 수집하여, – 예를 들어 클릭, 키보드 입력, 마우스 이동 등- 이런 패턴을 기반으로 사용자가 로봇인지 아닌지를 판단합니다.
기술의 간단한 예시를 보겠습니다.

실행하기

 

# 데이터셋을 정의합니다.
dataset = [
  {'input': [0.1, 0.2, 0.3], 'output': [1]},
  {'input': [0.4, 0.5, 0.6], 'output': [1]},
  {'input': [0.7, 0.8, 0.9], 'output': [0]},
  {'input': [0.2, 0.3, 0.4], 'output': [1]},
  {'input': [0.5, 0.6, 0.7], 'output': [0]}
]

위 코드에서 입력 데이터의 패턴은 ‘input’ 키에 대응되는 값입니다. 이 예시에서는 각 데이터가 3차원 벡터로 이루어져 있으며, 이 벡터는 사용자의 클릭, 키보드 입력, 마우스 이동 등의 동작을 수치화한 값일 수 있습니다. 모델은 이러한 입력 데이터의 패턴을 학습하여, 로봇이 아닌 사용자와의 차이점을 찾아내고 이를 바탕으로 로봇 여부를 판단합니다. 따라서 입력 데이터의 패턴이 모델의 정확도와 판단력에 큰 영향을 미치게 됩니다. 이를 실제 웹사이트에서 사용하려면, 이벤트 리스너를 추가하여 사용자의 클릭, 키보드 입력, 마우스 이동 등의 동작을 감지하고 이를 모델에 입력 데이터로 전달하면 됩니다.

예를 들어 아래는 마우스 클릭 이벤트 리스너를 추가하는 예시입니다.

# 예시: 마우스 클릭 이벤트 리스너 추가
from browser import document

def on_mouse_click(event):
    # 클릭 위치를 수치화하여 input 값으로 사용
    x = event.clientX
    y = event.clientY
    input_data = [x, y]

    # 모델에 입력 데이터를 전달하여 결과를 예측
    result = model.predict(input_data)

    # 결과에 따른 동작 수행
    if result > 0.5:
        # 로봇일 가능성이 높음
        print("Suspicious activity detected!")
    else:
        # 로봇이 아닐 가능성이 높음
        print("Human user")
        
document.bind('click', on_mouse_click)

이외에도, 키보드 입력, 마우스 이동 등의 이벤트를 감지하는 방법은 다양하므로, 상황에 맞게 적절한 이벤트 리스너를 추가하여 사용자의 동작을 입력 데이터로 변환하여 모델에 전달할 수 있습니다.

전체 코드는 다음과 같습니다.

import tensorflow as tf
import numpy as np

# 데이터셋을 정의합니다.
dataset = [
  {'input': [0.1, 0.2, 0.3], 'output': [1]},
  {'input': [0.4, 0.5, 0.6], 'output': [1]},
  {'input': [0.7, 0.8, 0.9], 'output': [0]},
  {'input': [0.2, 0.3, 0.4], 'output': [1]},
  {'input': [0.5, 0.6, 0.7], 'output': [0]}
]

# 모델을 정의합니다.
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=4, input_shape=[3], activation='relu'))
model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')

# 모델을 학습합니다.
xs = np.array([data['input'] for data in dataset])
ys = np.array([data['output'] for data in dataset])
history = model.fit(xs, ys, epochs=100)

# 예측합니다.
input = np.array([0.3, 0.4, 0.5])
output = model.predict(np.array([input]))
print(output[0][0])