벡터 데이터베이스 기반 메모리 구성 요소

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:
    
    > 체인 완료.

    '너는 이전에 내게 너의 좋아하는 스포츠는 축구라고 말했어.'