본문 바로가기
데이터&AI/LLM

openai API로만 RAG하기!! (1) (tool_call 기능 중 Assistants File Search)

by 일등박사 2024. 11. 7.
728x90

예전 포스팅에서 RAG에 대하여 알아보았습니다!!!

 

이미 아시겠지만!!

RAG(정보 검색 및 생성, Retrieval-Augmented Generation)란!!

언어 모델(예: GPT-3)과 정보 검색 엔진을 결합하여 보다 신뢰성 있는 텍스트 생성 결과를 제공하는 접근 방식으로

 

 주어진 질문에 답할 때, 외부 문서에서 관련 정보를 검색, 이를 기반으로 텍스트를 생성하는것이었습니다!

2024.03.05 - [데이터&AI/langchain] - [langchain공부] embedding된 Vector를 mongoDB에 저장하기

 

[langchain공부] embedding된 Vector를 mongoDB에 저장하기

2024.02.05 - [데이터&AI/langchain] - [langchain공부] Vectorstores. 벡터 저장소 (feat. Chroma, FAISS) [langchain공부] Vectorstores. 벡터 저장소 (feat. Chroma, FAISS) 사용자가 질문하고 답하는 RAG(Retrieval Augmented Generation,

drfirst.tistory.com

이를 위해서 bert모델 혹은 ada 등 openai의  embedding 모델을 사용했었는데요!!

 

오늘은 이런것 아무것도 필요없이!!

openai의 기능만 가지고 텍스트 검색 및 답변을 생성해보겠습니다!!!


0. 미션

오늘의 미션은 200장이 넘는 tencent의 사업보고서에서 텐센트의 영업이익(operation profit)을 산출하는것입니다!!

tencent_2024040801822.pdf
5.58MB

 

사전에 준비할것은 !! openai의 assistant 기능은 미리 알아두셔야합니다!

2024.11.01 - [데이터&AI/LLM] - openai의 assistant api 기능 활용하기(= openai의 threads = openai agent)

 

openai의 assistant api 기능 활용하기(= openai의 threads = openai agent)

openai의 gpt 모델 API를 활용해서 텍스트를 생성할때는 1회성입니다!!이를 개선하기 위해서 langchain의 ConversationBufferMemory를 사용해보기도 헀었는데요! 2024.01.27 - [데이터&AI/langchain] - [langchain공부] Co

drfirst.tistory.com

 

1. assistant 와 user 정의하기! 

ㅁ assistant 

저는 어시스턴트로  gpt-4o 모델 기반으로 재무분석 도우미라고 정의했습니다!

여기서 중요한것은!! tools 에 file_search라는것을 선언해주는것입니다!

file search는 openai에서 제공하는 베타 기능입니다!

 

ㅁ user1

 - user1은  assistant에 질문할 하나의 사용자(thread)라고 생각합니다!

from openai import OpenAI
 
client = OpenAI()
 
assistant = client.beta.assistants.create(
  name="재무분석 도우미",
  instructions="너는 expert financial analyst야!!. 제시된 내용을 바탕으로 financial statements 의 내용에 대하여 답해줘",
  model="gpt-4o",
  tools=[{"type": "file_search"}],
)

user1 = client.beta.threads.create()
user1

 

2. 문서를 vector로서 openai에 저장하기!

이제!! openai의 저장공간에 나의 pdf를 벡터 스토어로서 저장합니다!

# Create a vector store caled "Financial Statements"
vector_store = client.beta.vector_stores.create(name="tencent 사업보고서Financial Statements")
 
# Ready the files for upload to OpenAI
file_paths = ["tencent_20240408.pdf"]
file_streams = [open(path, "rb") for path in file_paths]
 
# Use the upload and poll SDK helper to upload the files, add them to the vector store,
# and poll the status of the file batch for completion.
file_batch = client.beta.vector_stores.file_batches.upload_and_poll(
  vector_store_id=vector_store.id, files=file_streams
)
 
# You can print the status and the file counts of the batch to see the result of this operation.
print(file_batch.status)
print(file_batch.file_counts)

file_batch

그럼! 아래아 같이 고유한  ID로  데이터가 저장되었다는 것을 확인할 수 있습니다

 

또한 내 openai계정의 dashboard에서도 해당 벡터스토어가 저장된 것을 확인할 수 있지요!

 

 

3.assistant 정보 업데이트하기!!

이제 1번에서 선언한 assistant에!! tool resources로서 file_search 에 방금 선언한 vector_store.id를 추가해줍니다!!

assistant = client.beta.assistants.update(
  assistant_id=assistant.id,
  tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}},
)

 

그 결과 아래와 같이 search에 어떤 옵션이 적용되었는지 (지금은 default지만 이후 튜닝해볼 수 있겠지요?

그리고 어던 vector가 정해졌는지 볼수 있습니다!

 

4.질문 프롬포트 입력

이제!!

ㄱ.  message에 user1로서 궁금한사항을 질문하기!!

ㄴ. 질문이있는 user1 thread와 vector가 저장된 assistant를 함께 묶어서 실행!!

ㄷ. 결과물 프린트! 

 

를 진행한다면!!

message = client.beta.threads.messages.create(
   thread_id=user1.id,
  role="user",
  content="2019년 부터 2023년까지 tencent의 operating profit  한국어로 알려줘",
)
message

run = client.beta.threads.runs.create_and_poll(
  thread_id=user1.id,
  assistant_id=assistant.id,
  instructions="너는 expert financial analyst야!!. 제시된 내용을 바탕으로 financial statements 의 내용에 대하여 답해줘",
)
run

 

아래와 같이 멋지게 결과가 나옵니다!!

pdf의 4, 12페이지라구하네요!!

 

실제로 한번 검산해보면!! 아주 정확하게 결과를 뽑은것을 볼 수 있습니다~! ^^

 

ㅁ 참고 : https://platform.openai.com/docs/assistants/tools/file-search

728x90

댓글