Componente di memoria basato sul database vettoriale
Il VectorStoreRetrieverMemory
memorizza i ricordi in un database vettoriale e restituisce i primi K contenuti simili ogni volta che vengono interrogati dati di memoria storici.
Qui, "documento" si riferisce a frammenti di messaggi di dialogo precedenti.
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
Inizializzazione del database vettoriale
Diversi database vettoriali hanno passaggi di inizializzazione leggermente diversi. Ecco un esempio utilizzando Faiss.
import faiss
from langchain.docstore import InMemoryDocstore
from langchain_community.vectorstores import FAISS
dimensione_embedding = 1536 # Dimensionalità del vettore
indice = faiss.IndexFlatL2(dimensione_embedding)
embedding_fn = OpenAIEmbeddings().embed_query
vectorstore = FAISS(embedding_fn, indice, InMemoryDocstore({}), {})
Creazione di VectorStoreRetrieverMemory
Creazione del componente VectorStoreRetrieverMemory utilizzando il database vettoriale.
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
memory.save_context({"input": "Il mio cibo preferito è la pizza"}, {"output": "Bene saperlo"})
memory.save_context({"input": "Il mio sport preferito è il calcio"}, {"output": "..."})
memory.save_context({"input": "Non mi piacciono i Celtics"}, {"output": "ok"}) #
print(memory.load_memory_variables({"prompt": "Quale sport dovrei guardare?"})["history"])
input: Il mio sport preferito è il calcio
output: ...
Utilizzo del componente di memoria tramite Chain
Di seguito è riportato un esempio di apprendimento di come utilizzare il componente di memoria. Puoi impostare il parametro "verbose=True" per stampare i prompt interattivi con il modello.
llm = OpenAI(temperature=0) # Può essere qualsiasi LLM valido, qui scegliamo openai
_DEFAULT_TEMPLATE = """Ecco una conversazione amichevole tra esseri umani e AI. L'AI è loquace e fornisce molti dettagli specifici dal suo contesto. Se l'AI non conosce la risposta alla domanda, dirà sinceramente che non lo sa.
Parti rilevanti della conversazione precedente:
{history}
(Se non rilevante, non è necessario utilizzare queste informazioni)
Conversazione attuale:
Persona: {input}
AI:"""
PROMPT = PromptTemplate(
input_variables=["history", "input"],
template=_DEFAULT_TEMPLATE
)
conversazione_con_sommario = ConversationChain(
llm=llm,
prompt=PROMPT,
memory=memory,
verbose=True
)
conversazione_con_sommario.predict(input="Ciao, mi chiamo Perry, tutto bene?")
> Entrando in una nuova catena ConversationChain...
Prompt dopo formattazione:
Ecco una conversazione amichevole tra esseri umani e AI. L'AI è loquace e fornisce molti dettagli specifici dal suo contesto. Se l'AI non conosce la risposta alla domanda, dirà sinceramente che non lo sa.
Parti rilevanti della conversazione precedente:
Input: Il mio cibo preferito è la pizza.
Output: Bene saperlo.
(Se non rilevante, non è necessario utilizzare queste informazioni)
Conversazione attuale:
Persona: Ciao, mi chiamo Perry, tutto bene?
AI:
> Catena terminata.
"Ciao Perry, sto benissimo. E tu?"
conversazione_con_sommario.predict(input="Qual è il mio sport preferito?")
> Entrando in una nuova catena ConversationChain...
Prompt dopo formattazione:
Ecco una conversazione amichevole tra esseri umani e AI. L'AI è loquace e fornisce molti dettagli specifici dal suo contesto. Se l'AI non conosce la risposta alla domanda, dirà sinceramente che non lo sa.
Parti rilevanti della conversazione precedente:
Input: Il mio sport preferito è il calcio.
Output: ...
(Se non rilevante, non è necessario utilizzare queste informazioni)
Conversazione attuale:
Persona: Qual è il mio sport preferito?
AI:
> Catena terminata.
'Mi avevi detto in precedenza che il tuo sport preferito è il calcio.'