벡터 데이터베이스 기반 메모리 구성 요소
VectorStoreRetrieverMemory
는 메모리를 벡터 데이터베이스에 저장하고, 이전의 메모리 데이터가 질의될 때마다 상위 K개의 유사한 내용을 반환합니다.
여기서 "문서"는 이전 대화 메시지 조각을 의미합니다.
from datetime import datetime
from langchain_openai import OpenAIEmbeddings
from langchain_openai import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain_core.prompts import PromptTemplate
벡터 데이터베이스 초기화
다양한 벡터 데이터베이스는 약간씩 다른 초기화 단계를 가지고 있습니다. 여기에 Faiss를 사용한 예제가 있습니다.
import faiss
from langchain.docstore import InMemoryDocstore
from langchain_community.vectorstores import FAISS
embedding_size = 1536 # 벡터 차원
index = faiss.IndexFlatL2(embedding_size)
embedding_fn = OpenAIEmbeddings().embed_query
vectorstore = FAISS(embedding_fn, index, InMemoryDocstore({}), {})
VectorStoreRetrieverMemory 생성
벡터 데이터베이스를 사용하여 VectorStoreRetrieverMemory 구성 요소를 생성합니다.
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
memory.save_context({"input": "내가 좋아하는 음식은 피자야"}, {"output": "참 좋아"})
memory.save_context({"input": "내가 좋아하는 스포츠는 축구야"}, {"output": "..."})
memory.save_context({"input": "셀틱스는 싫어"}, {"output": "알았어"}) #
print(memory.load_memory_variables({"prompt": "어떤 스포츠를 봐야 할까?"})["history"])
input: 내가 좋아하는 스포츠는 축구야
output: ...
Chain을 통한 메모리 구성 요소 사용
메모리 구성 요소를 사용하는 방법을 학습하는 예제가 아래에 나와 있습니다. "verbose=True" 매개변수를 설정하여 모델과의 대화 내용을 출력할 수 있습니다.
llm = OpenAI(temperature=0) # 여기서 사용하는 것은 openai로 설정할 수 있습니다
_DEFAULT_TEMPLATE = """인간과 AI 간의 친근한 대화입니다. AI는 수다스럽고 맥락에서 많은 구체적인 세부 정보를 제공합니다. 질문에 대한 답을 모를 경우 솔직하게 모르는 것이라고 말합니다.
이전 대화의 관련 부분:
{history}
(관련 없는 경우, 이 정보를 사용할 필요가 없습니다)
현재 대화:
Human: {input}
AI:"""
PROMPT = PromptTemplate(
input_variables=["history", "input"],
template=_DEFAULT_TEMPLATE
)
conversation_with_summary = ConversationChain(
llm=llm,
prompt=PROMPT,
memory=memory,
verbose=True
)
conversation_with_summary.predict(input="안녕, 나는 페리야, 어떻게 지내?")
> 새로운 ConversationChain 체인에 들어가는 중...
서식을 적용한 후의 프롬프트:
인간과 AI 간의 친근한 대화입니다. AI는 수다스럽고 맥락에서 많은 구체적인 세부 정보를 제공합니다. 질문에 대한 답을 모를 경우 솔직하게 모르는 것이라고 말합니다.
이전 대화의 관련 부분:
나의 좋아하는 음식은 피자야.
그것 알아서 좋아.
(관련 없는 경우, 이 정보를 사용할 필요가 없습니다)
현재 대화:
Human: 안녕, 나는 페리야, 어떻게 지내?
AI:
> 체인 완료.
"안녕, 페리, 나는 잘 지내. 너는 어때?"
conversation_with_summary.predict(input="내가 좋아하는 스포츠는 무엇일까?")
> 새로운 ConversationChain 체인에 들어가는 중...
서식을 적용한 후의 프롬프트:
인간과 AI 간의 친근한 대화입니다. AI는 수다스럽고 맥락에서 많은 구체적인 세부 정보를 제공합니다. 질문에 대한 답을 모를 경우 솔직하게 모르는 것이라고 말합니다.
이전 대화의 관련 부분:
나의 좋아하는 스포츠는 축구야.
...
(관련 없는 경우, 이 정보를 사용할 필요가 없습니다)
현재 대화:
Human: 내가 좋아하는 스포츠는 무엇일까?
AI:
> 체인 완료.
'너는 이전에 내게 너의 좋아하는 스포츠는 축구라고 말했어.'