記憶封裝 - Memory (langchain memory)
Memory:這裏不是物理內存,從文本的角度,可以理解爲“上文”、“歷史記錄”或者說“記憶力”的管理
ConversationBufferMemory可也用來保留會話信息
from langchain.memory import ConversationBufferMemory
history = ConversationBufferMemory()
history.save_context({"input":"electronic是做什麼的?"},{"output":"Electron是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架"})
print(history.load_memory_variables({}))
history.save_context({"input":"給我一個它的教程鏈接?"},{"output":"https://www.electronjs.org/zh/docs/latest/tutorial/quick-start"})
print(history.load_memory_variables({}))
{'history': 'Human: electronic是做什麼的?\nAI: Electron是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架'} {'history': 'Human: electronic是做什麼的?\nAI: Electron是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架\nHuman: 給我一個它的教程鏈接?\nAI: https://www.electronjs.org/zh/docs/latest/tutorial/quick-start'}
ChatMessageHistory可也用來保留會話信息,是基於Message的
#Message格式
from langchain.memory import ChatMessageHistory
history = ChatMessageHistory()
history.add_user_message("electronic是做什麼的?")
history.add_ai_message("Electron是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架")
print(history)
messages=[HumanMessage(content='electronic是做什麼的?', additional_kwargs={}, example=False), AIMessage(content='Electron是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架', additional_kwargs={}, example=False)]
ConversationBufferWindowMemory可也用來保留會話窗口輪次
#保留指定window的歷史會話信息
from langchain.memory import ConversationBufferWindowMemory
window = ConversationBufferWindowMemory(k=8) #k=8表示保留最近8輪的歷史會話信息
window.save_context({"input": "第一輪問"}, {"output": "第一輪答"})
window.save_context({"input": "第二輪問"}, {"output": "第二輪答"})
window.save_context({"input": "第三輪問"}, {"output": "第三輪答"})
window.save_context({"input": "第四輪問"}, {"output": "第四輪答"})
window.save_context({"input": "第五輪問"}, {"output": "第五輪答"})
window.save_context({"input": "第六輪問"}, {"output": "第六輪答"})
window.save_context({"input": "第七輪問"}, {"output": "第七輪答"})
window.save_context({"input": "第八輪問"}, {"output": "第八輪答"})
window.save_context({"input": "第九輪問"}, {"output": "第九輪答"})
window.save_context({"input": "第十輪問"}, {"output": "第十輪答"})
print(window.load_memory_variables({}))
{'history': 'Human: 第三輪問\nAI: 第三輪答\nHuman: 第四輪問\nAI: 第四輪答\nHuman: 第五輪問\nAI: 第五輪答\nHuman: 第六輪問\nAI: 第六輪答\nHuman: 第七輪問\nAI: 第七輪答\nHuman: 第八輪問\nAI: 第八輪答\nHuman: 第九輪問\nAI: 第九輪答\nHuman: 第十輪問\nAI: 第十輪答'}
自動對歷史信息做摘要:ConversationSummaryMemory
import warnings
warnings.filterwarnings("ignore")
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ["OPENAI_B_API_KEY"]
api_base = os.environ["OPENAI_B_API_BASE"]
from langchain.memory import ConversationSummaryMemory
from langchain.llms import OpenAI
memory = ConversationSummaryMemory(
llm=OpenAI(temperature=0,openai_api_base=api_base ,openai_api_key=api_key,verbose=True),
# buffer="The conversation is between a developer and Electron develop expert."
buffer="以中文表示"
)
memory.save_context({"input":"'Electron'是做什麼的?"},{"output":"'Electron'是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架"})
print(memory.load_memory_variables({}))
{'history': "\n以中文表示\n人類問AI關於'Electron'的事情,AI回答它是一個使用JavaScript、HTML和CSS構建桌面應用程序的框架。"}
用向量數據庫存儲記憶
from datetime import datetime
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
import faiss
from langchain.docstore import InMemoryDocstore
from langchain.vectorstores import FAISS
embedding_size = 1536 # OpenAIEmbeddings的維度
index = faiss.IndexFlatL2(embedding_size)
embedding_fn = OpenAIEmbeddings().embed_query
vectorstore = FAISS(embedding_fn, index, InMemoryDocstore({}), {})
# 實際應用中k可以稍大一些,這裏k=1演示方便
retriever = vectorstore.as_retriever(search_kwargs=dict(k=3))
memory = VectorStoreRetrieverMemory(retriever=retriever)
# 把記憶存在向量數據庫中
memory.save_context({"input":"我喜歡爬山"},{"output":"不錯啊"})
memory.save_context({"input":"我喜歡打羽毛球"},{"output":"nice"})
memory.save_context({"input":"我想去喫烤肉"},{"output":"附近有三家烤肉店"})
memory.save_context({"input":"他們家水果很便宜"},{"output":"有多便宜?"})
# 聊到相關話題,檢索之前的記憶
print(memory.load_memory_variables({"prompt": "明天放假了喫點哈?"})["history"])
input: 他們家水果很便宜 output: 有多便宜? input: 我想去喫烤肉 output: 附近有三家烤肉店 input: 我喜歡爬山 output: 不錯啊