예전 포스팅에서 RAG에 대하여 알아보았습니다!!!
이미 아시겠지만!!
RAG(정보 검색 및 생성, Retrieval-Augmented Generation)란!!
언어 모델(예: GPT-3)과 정보 검색 엔진을 결합하여 보다 신뢰성 있는 텍스트 생성 결과를 제공하는 접근 방식으로
주어진 질문에 답할 때, 외부 문서에서 관련 정보를 검색, 이를 기반으로 텍스트를 생성하는것이었습니다!
2024.03.05 - [데이터&AI/langchain] - [langchain공부] embedding된 Vector를 mongoDB에 저장하기
이를 위해서 bert모델 혹은 ada 등 openai의 embedding 모델을 사용했었는데요!!
오늘은 이런것 아무것도 필요없이!!
openai의 기능만 가지고 텍스트 검색 및 답변을 생성해보겠습니다!!!
0. 미션
오늘의 미션은 200장이 넘는 tencent의 사업보고서에서 텐센트의 영업이익(operation profit)을 산출하는것입니다!!
사전에 준비할것은 !! openai의 assistant 기능은 미리 알아두셔야합니다!
2024.11.01 - [데이터&AI/LLM] - openai의 assistant api 기능 활용하기(= openai의 threads = openai agent)
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
'데이터&AI > LLM' 카테고리의 다른 글
LLM의 요약을 잘했는지 평가하는 방법! ROUGE 점수! (with python code) (2) | 2024.11.09 |
---|---|
openai API의 RAG하기!! (2)-여러개 파일!!+html (tool_call 기능 중 Assistants File Search) (6) | 2024.11.08 |
openai 의 response_format (Structured_outputs의 원조) (1) | 2024.11.06 |
[무료] OpenAI API를 활용하여 유해성 검증하기!! (moderation API) (0) | 2024.11.05 |
Openai 패키지에서 원하는 결과를 output으로 받기(Structured outputs) (3) | 2024.11.04 |
댓글