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.'