LangChain과 OpenAI 임베딩을 활용한 CSV 기반 문서 임베딩 및 GPT-4o 소설 생성

GoGoComputer·2024년 11월 9일

studyEct

목록 보기
1/12
post-thumbnail

이 코드는 LangChain과 OpenAI의 API를 사용하여 텍스트와 문서를 임베딩하고, 임베딩된 데이터를 활용하여 채팅 모델을 통해 소설을 생성하는 예제입니다. 코드의 각 부분을 단계별로 설명해드리겠습니다.

1. 필요한 모듈 임포트

from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import CSVLoader
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
import os
from dotenv import load_dotenv

이 코드에서는 LangChain의 임베딩 기능, 문서 로더, 채팅 모델 등을 가져옵니다. OpenAI API 키를 안전하게 관리하기 위해 dotenv를 사용하여 환경 변수에서 API 키를 불러옵니다.

2. .env 파일에서 API 키 로드

load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

이 부분은 .env 파일에서 API 키를 로드하는 부분입니다. .env 파일에 OPENAI_API_KEY를 정의해 두었다면 load_dotenv()로 불러올 수 있습니다. 이후 OpenAI와의 통신에 필요한 키가 OPENAI_API_KEY 변수에 저장됩니다.

3. OpenAI 임베딩 인스턴스 생성

embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)

OpenAIEmbeddings 클래스의 인스턴스를 생성하여 OpenAI API를 통해 임베딩을 수행할 수 있게 준비합니다.

4. 임베딩할 텍스트 예시와 임베딩 수행

text = "OpenAI를 사용하여 텍스트를 N차원 벡터로 임베딩합니다."
embedded_text = embeddings.embed_query(text)

여기서 예제 텍스트를 임베딩합니다. embed_query 메서드를 통해 텍스트가 임베딩되며, 텍스트는 다차원 벡터로 변환됩니다.

5. 임베딩 결과 확인

print(f"임베딩 벡터의 차원: {len(embedded_text)}")
print(f"임베딩 벡터의 내용: {embedded_text[:5]}...")

임베딩 결과 벡터의 차원과 일부 내용을 출력하여 임베딩이 올바르게 수행되었는지 확인합니다.

6. CSVLoader를 사용하여 데이터 로드

loader = CSVLoader(file_path='the_greatest_books_of_all_time.csv', encoding='utf-8')
data = loader.load()

CSV 파일을 로드하여 문서로 변환합니다. file_path는 CSV 파일의 경로이며, 이 예제에서는 the_greatest_books_of_all_time.csv 파일을 사용하고 있습니다.

7. 로드된 데이터 확인

print(f"로드된 문서의 수: {len(data)}")
print(f"첫 번째 문서의 내용:\n{data[3].page_content}")

CSV 파일에서 로드한 문서의 수와 특정 문서의 내용을 출력하여 데이터 로딩이 제대로 되었는지 확인합니다.

8. 문서에서 텍스트 추출 및 임베딩

texts = [doc.page_content for doc in data]
embedded_docs = embeddings.embed_documents(texts)

texts 리스트에 각 문서의 내용을 추출하고, embed_documents 메서드를 사용하여 모든 문서를 임베딩합니다.

9. 임베딩된 문서 벡터의 수 확인

print(f"임베딩된 문서 벡터의 수: {len(embedded_docs)}")

임베딩된 문서 벡터의 수를 출력하여 데이터 처리가 잘 되었는지 확인합니다.

10. 채팅 모델 인스턴스 생성

chat = ChatOpenAI(model_name='gpt-4o', temperature=1, max_tokens=4000)

ChatOpenAI 클래스를 통해 OpenAI의 채팅 모델을 인스턴스화합니다. model_name으로는 gpt-4o를 사용하며, temperature는 모델의 창의성 정도를 설정하는 파라미터입니다.

11. 시스템 메시지로 AI의 역할 설정

system_message = SystemMessage(content="당신은 못된 소설가의 악마의 공책 입니다. {embedded_docs}의 소설들을 참고하고 이 스타일로 글을 써주세요.")

AI가 소설가의 악마의 공책 역할을 할 수 있도록 설정합니다. 이 메시지는 소설의 분위기와 스타일을 설정해 주는 데 사용됩니다.

12. 사용자 메시지

human_message = HumanMessage(content=f"예측불가능한 여성향 소설을 써주세요.")

사용자가 소설을 요청하는 메시지입니다.

13. 메시지 리스트 생성 및 응답 생성

messages = [system_message, human_message]
response = chat.invoke(messages)
print(response.content)

messages 리스트에 시스템 메시지와 사용자 메시지를 담고, invoke 메서드를 사용하여 응답을 생성합니다. AI는 이 메시지들을 참고하여 소설을 생성하고, 결과를 response.content로 출력합니다.


이 코드 흐름을 통해 AI는 OpenAI의 임베딩 기능으로 문서와 텍스트를 벡터로 변환하고, 그 벡터 정보를 바탕으로 새로운 소설을 창작합니다.

전체 코드

# 필요한 모듈 임포트
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import CSVLoader
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
import os
from dotenv import load_dotenv



# .env 파일에서 API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

# OpenAI 임베딩 인스턴스 생성
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)

# 임베딩할 텍스트 예시
text = "OpenAI를 사용하여 텍스트를 N차원 벡터로 임베딩합니다."

# 텍스트 임베딩
embedded_text = embeddings.embed_query(text)

# 임베딩 결과 확인
print(f"임베딩 벡터의 차원: {len(embedded_text)}")
print(f"임베딩 벡터의 내용: {embedded_text[:5]}...")  # 벡터의 일부만 출력

# CSVLoader를 사용하여 데이터 로드
loader = CSVLoader(file_path='the_greatest_books_of_all_time.csv', encoding='utf-8') # 파일 경로 수정 필요
data = loader.load()

# 로드된 데이터 확인
print(f"로드된 문서의 수: {len(data)}")
print(f"첫 번째 문서의 내용:\n{data[3].page_content}")

# 문서에서 텍스트 추출
texts = [doc.page_content for doc in data]

# 문서 임베딩
embedded_docs = embeddings.embed_documents(texts)

# 임베딩된 문서 벡터의 수 확인
print(f"임베딩된 문서 벡터의 수: {len(embedded_docs)}")

# 첫 번째 임베딩 벡터 확인
## print(f"첫 번째 임베딩 벡터의 차원: {len(embedded_docs[0])}")
## print(f"첫 번째 임베딩 벡터의 내용: {embedded_docs[0][:5]}...")  # 벡터의 일부만 출력

# 채팅 모델 인스턴스 생성
chat = ChatOpenAI(model_name='gpt-4o', temperature=1, max_tokens=4000)

# 시스템 메시지로 AI의 역할 설정 (선택 사항)
system_message = SystemMessage(content="당신은 못된 소설가의 악마의 공책 입니다. {embedded_docs}의 소설들을 참고하고 이 스토리로 글을 써주세요.")


# 사용자 메시지
human_message = HumanMessage(content=f"예측불가능한 소설을 써주세요.")

# 메시지 리스트 생성
messages = [system_message, human_message]

# 응답 생성 (invoke 메서드 사용)
response = chat.invoke(messages)
print(response.content)
profile
IT를 좋아합니다.

0개의 댓글