Ryuzy 2025. 2. 17. 01:42
728x90
반응형

1. ChatGPT의 서비스 제약

"위에서 설명한 바와 같이, OpenAI는 ChatGPT의 기반이 되는 모델을 훈련시키는 등 서비스를 개선하기 위하여 귀하가 OpenAI에 제공하는 콘텐츠를 이용할 수 있습니다. OpenAI의 모델을 훈련시키기 위한 귀하의 콘텐츠 이용을 거부할 수 있는 방법에 대해서는 관련 설명⁠(opens in a new window)을 확인하시기 바랍니다."

https://openai.com/ko-KR/policies/privacy-policy/

 

"삼성전자, 챗GPT 사용 금지…보안상 별도 생성형 AI 개발"

"삼성전자가 사내에서 ‘챗GPT’ 등 외부 생성형 인공지능(AI)을 사용하는 것을 금지하기로 했다. SK하이닉스, 포스코 등과 마찬가지로 챗GPT로부터 답을 얻어내려고 데이터를 입력하는 과정에서 회사의 민감한 정보가 유출될 가능성이 크다고 판단했기 때문이다. 대신 삼성전자는 업무에 활용할 수 있는 생성형 AI 개발을 추진 중인 것으로 알려졌다."

https://www.khan.co.kr/article/202305022159005

 

 

2. private endpoint

Private endpoint는 네트워크 상에서 특정 리소스나 서비스에 대한 접근을 내부적으로 제한하는 연결 지점입니다. 일반적으로 클라우드 서비스나 데이터베이스와 같은 리소스에 외부의 인터넷 연결을 통한 접근을 방지하고, 사설 네트워크 내에서만 안전하게 연결될 수 있도록 설정됩니다. 이를 통해 보안이 강화되고, 데이터가 공용 인터넷을 통해 전송되지 않으므로 민감한 정보의 유출을 방지할 수 있습니다.

 

Azure OpenAI

Azure OpenAI는 Microsoft Azure 플랫폼에서 제공하는 OpenAI의 인공지능 모델을 기반으로 한 서비스입니다. 이를 통해 기업과 개발자들은 OpenAI의 GPT(Generative Pre-trained Transformer)와 같은 고급 자연어 처리 모델을 Azure의 클라우드 환경에서 손쉽게 활용할 수 있습니다. Azure OpenAI는 텍스트 생성, 번역, 요약, 질문 응답 등 다양한 AI 기능을 제공하며, 사용자는 API를 통해 이러한 기능을 자신들의 애플리케이션에 통합할 수 있습니다. 또한, Microsoft의 보안 및 관리 기능이 결합되어 기업 환경에서도 안정적으로 활용할 수 있습니다.

 

 

3. 파인 튜닝

파인튜닝(fine-tuning)은 사전 훈련된 언어 모델을 특정 작업에 맞게 조정하는 과정을 말합니다. 파인튜닝은 모델이 더 정확하고 일관성 있는 결과를 생성하도록, 특정 도메인이나 응용 프로그램에 맞춰 추가적인 학습을 진행하는 과정입니다. 이를 통해 모델은 검색된 정보와 생성된 텍스트의 품질을 향상시키고, 더 높은 성능을 발휘할 수 있습니다.

 

OpenAI에서는 다양한 모델에 대해 파인튜닝을 지원하며, 각 모델의 비용은 아래 링크와 같습니다.

https://platform.openai.com/docs/guides/fine-tuning

 

import json
import pandas as pd
from openai import OpenAI

 

df = pd.DataFrame({
    'questions':[
        '12시 땡!',
        '1지망 학교 떨어졌어',
        '3박4일 놀러가고 싶다',
        'PPL 심하네',
        'SD카드 망가졌어',
        'SD카드 안돼',
        'SNS 맞팔 왜 안하지ㅠㅠ',
        'SNS 시간낭비인 거 아는데 매일 하는 중',
        'SNS 시간낭비인데 자꾸 보게됨',
        'SNS보면 나만 빼고 다 행복해보여'],
    'answers':[
        '하루가 또 가네요',
        '위로해 드립니다.',
        '여행은 언제나 좋죠',
        '눈살이 찌푸려지죠',
        '다시 새로 사는 게 마음 편해요',
        '다시 새로 사는 게 마음 편해요',
        '잘 모르고 있을 수도 있어요',
        '시간을 정하고 해보세요',
        '시간을 정하고 해보세요',
        '자랑하는 자리니까요'],
})

 

df.head()

 

df.columns = ['prompt', 'completion']
df.head()

 

formatted_data = [
    {
        'messages':[
            {'role':'system', 'content':'너는 나와 말동무를 해주는 친절한 챗봇이야'},
            {'role':'user', 'content': row['prompt']},
            {'role':'assistant', 'content': row['completion']}
        ]
    }
    for _, row in df.iterrows()
]

 

for entry in formatted_data:
    print(entry)

 

with open('training_data.jsonl', 'w') as f:
    for entry in formatted_data:
        f.write(json.dumps(entry) + "\n")

 

jsonl

.jsonl (JSON Lines)은 JSON 포맷의 변형으로, 여러 개의 JSON 객체를 한 파일 내에서 각 줄마다 구분하여 저장하는 방식입니다. 이 형식은 각 줄에 하나의 JSON 객체를 포함하므로 대용량 데이터를 처리할 때 유용하며, 스트리밍 데이터나 로그 데이터를 다룰 때 주로 사용됩니다. 각 줄은 독립적인 JSON 객체로 구성되어 있기 때문에, 파일을 한 줄씩 읽으면서 데이터를 처리할 수 있습니다.

 

# API 키를 제공하여 OpenAI 클라이언트를 생성
client = OpenAI(
  api_key="sk-proj-API키"
)
#fine-tune'목적으로 파일 업로드
client.files.create(
  file=open("training_data.jsonl", "rb"),
  purpose="fine-tune"
)

 

# FileObject id를 잘 저장
job_create = client.fine_tuning.jobs.create(
  training_file="FileObject id",
  model="gpt-4o-mini-2024-07-18"
)

job_create

 

#fine-tuning job 리스트 10개 나열
res = client.fine_tuning.jobs.list(limit=10)
res

 

#fine-tuning 상태 확인
client.fine_tuning.jobs.retrieve("FineTuningJob ID")

 

completion = client.chat.completions.create(
  model= 'ft:모델명',
  messages = [
        {'role':'system','content':'너는 나와 말동무를 해주는 친절한 챗봇이야'},
        {'role':'user', 'content':'SNS 맞팔 왜 안하지ㅠㅠ'}
  ]
)
print(completion.choices[0].message)

 

 

4. RAG

RAG(Retrieval-Augmented Generation)는 정보를 검색하여 이를 기반으로 텍스트를 생성하는 자연어 처리 모델입니다. 이 모델은 두 가지 주요 구성 요소로 이루어져 있습니다: 검색 모듈과 생성 모듈. 첫 번째로, 사용자가 입력한 질문이나 요청에 대해 관련된 정보를 외부 데이터베이스나 문서에서 검색한 후, 그 정보를 바탕으로 텍스트를 생성하는 방식입니다. 이렇게 검색된 정보를 활용하여 보다 정확하고 신뢰성 있는 응답을 생성할 수 있으며, 특히 복잡한 질문에 대해서는 사전 지식이 부족한 모델보다 유용한 결과를 제공할 수 있습니다. RAG는 정보 검색과 생성 모델을 결합하여, 더 나은 성능을 발휘할 수 있는 방식입니다.

 

1. 검색 단계 (Retrieval)

  • 사용자가 질문을 입력하면, RAG는 먼저 이 질문에 관련된 정보를 검색합니다.
  • 이 정보는 모델이 사전에 학습한 외부 데이터베이스나 문서 집합에서 검색됩니다. 예를 들어, 모델이 인터넷이나 특정 문서 집합을 검색하여 질문에 대한 관련 정보를 찾아냅니다.
  • 검색 모듈은 이 데이터를 가장 관련성이 높은 부분을 선택하고, 해당 정보들을 "컨텍스트"로 모델에게 전달합니다.

2. 생성 단계 (Generation)

  • 검색된 정보가 준비되면, 생성 모듈이 이를 바탕으로 응답을 생성합니다.
  • 이 생성 단계에서 모델은 질문과 함께 검색된 정보를 이용하여 자연스러운 문장을 만듭니다. 즉, 질문에 대한 직접적인 답을 주기 위해 필요한 정보를 잘 조합하여 자연어로 출력합니다.
  • 여기서 중요한 점은, 생성 모듈이 검색된 정보만을 이용해 답을 생성하므로, 사실관계에 기반한 정확한 답변을 만들 수 있습니다.

 

 

5. 청킹

청킹(Chunking)은 긴 문서를 작은 단위(청크)로 나누는 과정입니다. 이를 통해 검색(Retrieval) 단계에서 보다 정교한 정보를 가져올 수 있으며, 생성(Generation) 단계에서 LLM이 더 적절한 응답을 생성하도록 도와줍니다. 일반적으로 의미적으로 관련 있는 문장이나 단락을 하나의 청크로 묶으며, 청크의 크기는 검색 정확도와 모델의 입력 토큰 제한을 고려하여 조정됩니다. 효과적인 청킹 기법은 문맥 유지, 정보 손실 최소화, 검색 성능 향상에 중요한 역할을 합니다.

 

CharacterTextSplitter

  • 특정 구분자(character separator) 를 기준으로 문서를 청크로 나누는 방식입니다.
  • 예를 들어, "\n\n"(빈 줄), "\n"(줄바꿈), " "(공백) 등을 기준으로 청크를 나눌 수 있습니다.
  • 하지만 단순히 지정된 구분자로만 나누기 때문에, 적절한 크기의 청크를 유지하기 어려울 수 있습니다.
  • 지정한 separator가 문서 내에 없거나 적절하지 않으면, 청크 크기가 비정상적으로 커지거나 작아질 수 있습니다.
  • 문맥이 단절될 가능성이 높습니다.

RecursiveCharacterTextSplitter

  • 재귀적으로 여러 구분자를 사용하여 문서를 나누는 방식입니다.
  • 먼저 큰 단위("\n\n" 같은 문단 구분자)로 나누고, 만약 청크가 너무 크다면 작은 단위("\n", " " 등)로 다시 나눕니다.
  • 이렇게 하면 문맥을 최대한 유지하면서도 적절한 크기의 청크를 만들 수 있습니다.
  • 여러 개의 구분자를 리스트로 지정하여 순차적으로 적용 가능합니다.
  • 먼저 큰 단위("\n\n")로 나눈 후, 너무 큰 경우 더 작은 단위("\n", " " 등)로 재귀적으로 나눔니다.

 

LangChain

LangChain은 LLM 기반 애플리케이션을 쉽게 개발할 수 있도록 지원하는 오픈소스 프레임워크입니다. OpenAI, Hugging Face 등의 다양한 LLM 모델과 연동할 수 있으며, 벡터 데이터베이스(FAISS, Chroma, Pinecone 등), 검색 엔진, API, 파일 시스템 등과 통합하여 RAG(Retrieval-Augmented Generation) 파이프라인을 구축하는 데 자주 사용됩니다. LangChain은 프롬프트 엔지니어링, 체인(Chains), 에이전트(Agents), 메모리(Memory) 등의 기능을 제공하여, LLM을 활용한 챗봇, 문서 검색 시스템, 자동화 도구 등을 쉽게 개발할 수 있도록 돕습니다. Python과 JavaScript에서 사용 가능하며, AI 애플리케이션을 보다 효율적으로 구현할 수 있도록 최적화되어 있습니다.

from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter

chunk_size = 26
chunk_overlap = 4 # 각 청크가 겹치는 부분(중복되는 글자 수)

r_splitter = RecursiveCharacterTextSplitter(
    chunk_size = chunk_size,
    chunk_overlap = chunk_overlap
)

c_splitter = CharacterTextSplitter(
    chunk_size = chunk_size,
    chunk_overlap = chunk_overlap,
    separator=' '
)

print(r_splitter.split_text("인공지능은 데이터를 학습하여 패턴을 찾고 예측하는 기술이다"))
print(c_splitter.split_text("인공지능은 데이터를 학습하여 패턴을 찾고 예측하는 기술이다"))

 

text = """Content filters work by identifying online communication that needs to be filtered such as website URLs, emails, or SMS. \
By categorizing the form of communication based on filters set by the user the system \
can compare the categorized online communication to a list of restricted content. Based on the comparison \n\n  \
the system decides to allow or block access the users access to the content. Content filtering can be performed on different levels. \
Using email filters, web filters, or messaging filters you can analyze the content of emails, web pages, \
or messages, blocking or allowing them based on specific criteria, such as keywords or categories.\
to certain websites or applications based on specific policies set by an organization."""

 

chunk_size = 200
chunk_overlap = 20

r_splitter = RecursiveCharacterTextSplitter(
    chunk_size = chunk_size,
    chunk_overlap = chunk_overlap
)

c_splitter = CharacterTextSplitter(
    chunk_size = chunk_size,
    chunk_overlap = chunk_overlap,
    separator=' '
)

print(r_splitter.split_text(text))
print(c_splitter.split_text(text))
728x90
반응형