OpenAI API Library 사용하기 3 - Embeddings-based Search
- Published on
개요
- OpenAI Cookbook 의 노트북 Question answering using embeddings-based search 의 핵심 내용만 요약하여 설명한다.
- 모델이 알지 못하는 방대한 데이터에 질의하기 위해서 해당 데이터를 모두 제공하고 관련 질의를 할 수 있겠지만, 모델에 질의할 수 있는 데이터의 크기가 매우 제한되므로, 임베딩을 통해 일차적으로 질의에 관련된 데이터를 추출하고 그 데이터를 모델에 제공하여 질의에 대한 모델의 답변을 이끌어 내는 방법을 설명한다.
- 임베딩에 대해서는 이전 포스팅 OpenAI API Library 사용하기 2 - Embeddings 를 참고한다.
[그림 1 - 큰 데이터 대한 질의]
graph TD
U1[사용자] ~~~ D1[(두꺼운 책)]
U1 -- 질의 --> Q1 -- 질의 토큰 초과 --x M[AI 모델]
D1 -- 전체 --> Q1[전체 + 질의]
D1 -- 단락 단위로 임베딩 --> DP1["단락1, 단락2, 단락3..."]
DP1 -- 임베딩 유사도 검색 결과 --> Q2[연관성 높은 단락 + 질의]
U1 -- 질의 --> Q2 -- OK --> M
subgraph "Bad"
Q1
end
subgraph "Good"
DP1
Q2
end
linkStyle 1 stroke-width:4px,fill:none,stroke:red;
linkStyle 2 stroke-width:4px,fill:none,stroke:red;
linkStyle 3 stroke-width:4px,fill:none,stroke:red;
linkStyle default stroke-width:4px,fill:none,stroke:green;
이론
- GPT 모델이 알지 못하는 데이터에 대한 질문을 하고 싶을때, 사용할 수 있는 방법이다.
- 두가지 방법이 있을 수 있다.
- 파인튜닝 - 특정 태스크, 어떤 스타일
- 질의 데이터에 포함 - 사실에 관한 데이터
- 여기서는 데이터의 사실과 관련된 질답을 할 것이므로 질의 데이터에 포함하는 방법을 사용한다.
- 그러나 질의 데이터에 포함할때 문제는 최대 크기의 제한이 따른다. 메세지에 포함 할 수 있는 최대 데이터는 모델별로 대략
gpt-3.5-turbo(5 페이지),gpt-4(10페이지) -tiktoken library를 통해 최대 질의 데이터의 크기를 확인하여 데이터를 나눠야 할 필요가 있다. - 텍스트 검색에 다양한 방법이 있지만, 여기서는 임베딩 기반 검색을 사용한다. 임베딩 기반은 특히 질문/답변 검색에 유리하며, 대체로 질문과 답변은 서로 다른 어휘적 내용을 포함하는 경우가 많기 때문이다. 물론 검색의 질을 높이기 위해서는 여러 방법들을 혼합하여 사용할 수 있다.
- 인베딩이란 단어, 문장등을 다차원 벡터로 변환하는 것을 뜻한다. 인베딩된 벡터간의 거리를 측정하면 인베딩된 단어 또는 문장의 관련성 정도를 알 수 있다.
실행
- 데이터 준비
- 검색할 데이터를 수집 - 웹크롤링 등
- 적절한 의미론적 단위로 임베딩할 수 있게 덩어리로 나눔
- 나뉜 각 텍스트에 대한 임베딩을 얻기 위해 OpenAI Embeddings API 를 호출한다.
- 텍스트, 임베딩값을 저장한다.
CSV또는 벡터 데이터베이스 저장 등
- 질의에 포함할 데이터 임베딩 기반 검색
- 사용자가 입력한 질문에 대한 임베딩값을 얻는다.
- 질문과 데이터의 임베딩의 유사한 정도를 비교하여 랭킹을 얻는다.
- 최종 질의
- 높은 랭크순으로 임베딩 검색 결과목록을 최대 토큰수 이내에서 사용자의 질문과 함께 메세지에 추가한다.
- 사용자의 질의와 관련된 데이터를 포함한 메세지를 OpenAI Chat Completion API 에 질의하여 해당 사실과 관련된 답변을 얻는다.
결론
- 위 방법을 사용하면 모델이 알지 못하는 데이터에 대해 질의하여 결과를 잘 얻을 수 있다.
- 다만, 어떤 경우 데이터 추론이 잘못되어 데이터가 답변이 부족한 경우가 있었다. 이때의 문제는 제공된 데이터가 잘못(임베딩 기반 검색)이 아니라, 모델 추론이 부정확한 것으로, 더 추론이 높은 모델을 지정하여 해결할 수 있었다.