1. LangChain缓冲记忆组件的使用与解析
缓冲窗口记忆示例
from operator import itemgetter
import dotenv
from langchain.memory import ConversationTokenBufferMemory
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
# 1.创建提示模板&记忆
prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,请根据对应的上下文回复用户问题"),
MessagesPlaceholder("history"), # 需要的history其实是一个列表
("human", "{query}"),
])
memory = ConversationTokenBufferMemory(
return_messages=True,
input_key="query",
llm=ChatOpenAI()
)
# 2.创建大语言模型
llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
# 3.构建链应用
chain = RunnablePassthrough.assign(
history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
) | prompt | llm | StrOutputParser()
# 4.死循环构建对话命令行
while True:
query = input("Human: ")
if query == "q":
exit(0)
chain_input = {"query": query, "language": "中文"}
response = chain.stream(chain_input)
print("AI: ", flush=True, end="")
output = ""
for chunk in response:
output += chunk
print(chunk, flush=True, end="")
memory.save_context(chain_input, {"output": output})
print("")
print("history: ", memory.load_memory_variables({}))
摘要缓冲混合记忆示例
from operator import itemgetter
import dotenv
from langchain.memory import ConversationSummaryBufferMemory
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
dotenv.load_dotenv()
# 1.创建提示模板&记忆
prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,请根据对应的上下文回复用户问题"),
MessagesPlaceholder("history"), # 需要的history其实是一个列表
("human", "{query}"),
])
memory = ConversationSummaryBufferMemory(
max_token_limit=300,
return_messages=True,
input_key="query",
llm=QianfanChatEndpoint(),
# llm=ChatOpenAI(model="gpt-3.5-turbo-16k"),
)
# 2.创建大语言模型
# llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
llm = QianfanChatEndpoint()
# 3.构建链应用
chain = RunnablePassthrough.assign(
history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
) | prompt | llm | StrOutputParser()
# 4.死循环构建对话命令行
while True:
query = input("Human: ")
if query == "q":
exit(0)
chain_input = {"query": query, "language": "中文"}
response = chain.stream(chain_input)
print("AI: ", flush=True, end="")
output = ""
for chunk in response:
output += chunk
print(chunk, flush=True, end="")
memory.save_context(chain_input, {"output": output})
print("")
print("history: ", memory.load_memory_variables({}))
实体记忆组件示例
from operator import itemgetter
import dotenv
from langchain.memory import ConversationSummaryBufferMemory
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
dotenv.load_dotenv()
# 1.创建提示模板&记忆
prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,请根据对应的上下文回复用户问题"),
MessagesPlaceholder("history"), # 需要的history其实是一个列表
("human", "{query}"),
])
memory = ConversationSummaryBufferMemory(
max_token_limit=300,
return_messages=True,
input_key="query",
llm=QianfanChatEndpoint(),
# llm=ChatOpenAI(model="gpt-3.5-turbo-16k"),
)
# 2.创建大语言模型
# llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
llm = QianfanChatEndpoint()
# 3.构建链应用
chain = RunnablePassthrough.assign(
history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
) | prompt | llm | StrOutputParser()
# 4.死循环构建对话命令行
while True:
query = input("Human: ")
if query == "q":
exit(0)
chain_input = {"query": query, "language": "中文"}
response = chain.stream(chain_input)
print("AI: ", flush=True, end="")
output = ""
for chunk in response:
output += chunk
print(chunk, flush=True, end="")
memory.save_context(chain_input, {"output": output})
print("")
print("history: ", memory.load_memory_variables({}))
2. 记忆组件的持久化与第三方集成
internal---handler---app_handler.py
import uuid
from dataclasses import dataclass
from operator import itemgetter
from uuid import UUID
from injector import inject
from langchain.memory import ConversationBufferWindowMemory
from langchain_community.chat_message_histories import FileChatMessageHistory
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_openai import ChatOpenAI
from internal.exception import FailException
from internal.schema.app_schema import CompletionReq
from internal.service import AppService
from pkg.response import success_json, validate_error_json, success_message
@inject
@dataclass
class AppHandler:
"""应用控制器"""
app_service: AppService
def create_app(self):
"""调用服务创建新的APP记录"""
app = self.app_service.create_app()
return success_message(f"应用已经成功创建,id为{app.id}")
def get_app(self, id: uuid.UUID):
app = self.app_service.get_app(id)
return success_message(f"应用已经成功获取,名字是{app.name}")
def update_app(self, id: uuid.UUID):
app = self.app_service.update_app(id)
return success_message(f"应用已经成功修改,修改的名字是:{app.name}")
def delete_app(self, id: uuid.UUID):
app = self.app_service.delete_app(id)
return success_message(f"应用已经成功删除,id为:{app.id}")
def debug(self, app_id: UUID):
"""聊天接口"""
# 1.提取从接口中获取的输入,POST
req = CompletionReq()
if not req.validate():
return validate_error_json(req.errors)
# 2.创建prompt与记忆
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个强大的聊天机器人,能根据用户的提问回复对应的问题"),
MessagesPlaceholder("history"),
("human", "{query}"),
])
memory = ConversationBufferWindowMemory(
k=3,
input_key="query",
output_key="output",
return_messages=True,
chat_memory=FileChatMessageHistory("./storage/memory/chat_history.txt"),
)
# 3.创建llm
llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
# 4.创建链应用
chain = RunnablePassthrough.assign(
history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
) | prompt | llm | StrOutputParser()
# 5.调用链生成内容
chain_input = {"query": req.query.data}
content = chain.invoke(chain_input)
memory.save_context(chain_input, {"output": content})
return success_json({"content": content})
def ping(self):
raise FailException("数据未找到")
3. 运行流程拆解与基础数据表设计
postgreSql下执行命令行 CREATE EXTENSION "uuid-ossp"