모델의 아키텍처에 상관없이, 10개 이상의 검색된 문서를 포함하면 성능이 상당히 저하된다. 요약하자면, 모델이 긴 문맥의 중간에서 관련 정보를 사용해야 할 때 제공된 문서를 무시하는 경향이 있다. 자세한 내용은 여기를 참고
이 문제를 피하기 위해, 검색 후 문서의 순서를 재배열하여 성능 저하를 방지할 수 있다.
우선 sentence-transformers를 설치한다.
pipenv install sentence-transformers
embeddings = OpenAIEmbeddings()
llm = ChatOpenAI()
question = "테슬라와 일론머스크에 대해 알려줄 수 있어?"
texts = [
"기계 학습은 많은 산업을 혁신하고 있습니다.",
"모나리자는 세계에서 가장 유명한 그림 중 하나입니다.",
"인공지능은 더 나은 진단을 위해 의료 분야에 적용될 수 있습니다.",
"이 문서는 자동차 산업에 대한 AI의 영향을 다룹니다.",
"나는 공상 과학 소설을 읽는 것을 좋아합니다.",
"테슬라의 자율 주행 기술은 자동차 분야의 선도적인 혁신입니다.",
"이것은 특정한 문맥이 없는 일반적인 문장입니다.",
"신경망은 현대 AI 시스템의 핵심 구성 요소입니다.",
"AI 윤리는 오늘날 기술 중심의 세계에서 중요한 주제입니다.",
"일론 머스크의 사업들은 기술 분야에 큰 영향을 미쳤습니다.",
]
retriever = Chroma.from_texts(texts, embedding=embeddings).as_retriever(
search_kwargs={"k": 10}
)
기본 검색을 한다.
docs = retriever.invoke(question)
print("====== 기본 검색 result ========")
for i, doc in enumerate(docs):
print(f"[문서 {i}] {doc.page_content.replace('\n', ' ')}")
검색 결과
====== 기본 검색 result ========
[문서 0] 테슬라의 자율 주행 기술은 자동차 분야의 선도적인 혁신입니다.
[문서 1] 일론 머스크의 사업들은 기술 분야에 큰 영향을 미쳤습니다.
[문서 2] 나는 공상 과학 소설을 읽는 것을 좋아합니다.
[문서 3] 이 문서는 자동차 산업에 대한 AI의 영향을 다룹니다.
[문서 4] 모나리자는 세계에서 가장 유명한 그림 중 하나입니다.
[문서 5] 기계 학습은 많은 산업을 혁신하고 있습니다.
[문서 6] AI 윤리는 오늘날 기술 중심의 세계에서 중요한 주제입니다.
[문서 7] 이것은 특정한 문맥이 없는 일반적인 문장입니다.
[문서 8] 인공지능은 더 나은 진단을 위해 의료 분야에 적용될 수 있습니다.
[문서 9] 신경망은 현대 AI 시스템의 핵심 구성 요소입니다.
질문인 테슬라와 일론 머스크의 내용이 검색 결과의 상단에 위치한다.
LongContextReorder
LongContextReorder를 통해 재정렬을 한다.
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)
print("====== reordering result ========")
for i, doc in enumerate(reordered_docs):
print(f"[문서 {i}] {doc.page_content.replace('\n', ' ')}")
검색 결과
[문서 0] 일론 머스크의 사업들은 기술 분야에 큰 영향을 미쳤습니다.
[문서 1] 이 문서는 자동차 산업에 대한 AI의 영향을 다룹니다.
[문서 2] 기계 학습은 많은 산업을 혁신하고 있습니다.
[문서 3] 이것은 특정한 문맥이 없는 일반적인 문장입니다.
[문서 4] 신경망은 현대 AI 시스템의 핵심 구성 요소입니다.
[문서 5] 인공지능은 더 나은 진단을 위해 의료 분야에 적용될 수 있습니다.
[문서 6] AI 윤리는 오늘날 기술 중심의 세계에서 중요한 주제입니다.
[문서 7] 모나리자는 세계에서 가장 유명한 그림 중 하나입니다.
[문서 8] 나는 공상 과학 소설을 읽는 것을 좋아합니다.
[문서 9] 테슬라의 자율 주행 기술은 자동차 분야의 선도적인 혁신입니다.
검색결과에서 일론 머스크와 테슬라에 대한 문서가 처음과 가장 끝에 위치한 것을 확인한다.
Context Reordering을 통해 질의 응답 체인 생성
DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(
template="{page_content} [source:출처]"
)
def combine_documents(
docs,
document_prompt=DEFAULT_DOCUMENT_PROMPT,
document_separator="\n",
):
doc_strings = [
f"[{i}] {format_document(doc, document_prompt)}" for i, doc in enumerate(docs)
]
return document_separator.join(doc_strings)
def reorder_documents(docs):
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)
combined = combine_documents(reordered_docs, document_separator="\n")
print("====== combined result ========")
print(combined)
return combined
실행 결과
====== combined result ========
[0] 일론 머스크의 사업들은 기술 분야에 큰 영향을 미쳤습니다. [source:출처]
[1] 모나리자는 세계에서 가장 유명한 그림 중 하나입니다. [source:출처]
[2] AI 윤리는 오늘날 기술 중심의 세계에서 중요한 주제입니다. [source:출처]
[3] 이것은 특정한 문맥이 없는 일반적인 문장입니다. [source:출처]
[4] 신경망은 현대 AI 시스템의 핵심 구성 요소입니다. [source:출처]
[5] 인공지능은 더 나은 진단을 위해 의료 분야에 적용될 수 있습니다. [source:출처]
[6] 기계 학습은 많은 산업을 혁신하고 있습니다. [source:출처]
[7] 이 문서는 자동차 산업에 대한 AI의 영향을 다룹니다. [source:출처]
[8] 나는 공상 과학 소설을 읽는 것을 좋아합니다. [source:출처]
[9] 테슬라의 자율 주행 기술은 자동차 분야의 선도적인 혁신입니다. [source:출처]
재정렬된 문서 확인
template = """Given this text extracts:
{context}
-----
Please answer the following question:
{question}
Answer in the following languages: {language}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = (
{
"context": itemgetter("question")
| retriever
| RunnableLambda(reorder_documents),
"question": itemgetter("question"),
"language": itemgetter("language"),
}
| prompt
| llm
| StrOutputParser()
)
answer = chain.invoke({"question": "테슬라와 일론머스크에 대해 알려줄 수 있어?", "language": "KOREAN"})
print("====== 답변 검색 result ========")
print(answer)
실행 결과
일론 머스크는 기술 분야에 큰 영향을 미치는 사업가로, 테슬라의 자율 주행 기술을 개발하는 회사의 CEO이기도 합니다. 그의 기업은 현대 기술 산업을 혁신하고 있습니다.
참고
반응형