以下内容由AI对话生成
带记忆的聊天机器人实现
下面是完整的代码实现,包含详细注释:
# chatbot_with_memory.py
import os
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate# 1. 配置你的模型(使用你的第三方模型配置)
llm = ChatOpenAI(model_name="xop3qwen1b7",openai_api_base="https://maas-api.cn-huabei-1.xf-yun.com/v1",openai_api_key="sk-kBa9GlpIxpWX281iA35a26624b3d4fBfA2EeE9212196F155",temperature=0.7, # 适当温度让对话更自然max_tokens=1024
)# 2. 创建记忆体 - 这是实现记忆功能的核心
# ConversationBufferMemory 会保存完整的对话历史
memory = ConversationBufferMemory(return_messages=True, # 返回消息对象而不仅仅是文本memory_key="history" # 在提示词中使用的记忆键名
)# 3. 创建自定义提示模板,明确指导AI利用对话历史
# 这里的 {history} 和 {input} 是LangChain约定的变量名
chat_prompt = PromptTemplate.from_template("""你是一个友好且聪明的AI助手。请根据当前的对话历史来回应用户。当前对话历史:
{history}用户最新输入:{input}
AI助手:"""
)# 4. 创建对话链,组合LLM、提示词和记忆体
conversation = ConversationChain(llm=llm,memory=memory,prompt=chat_prompt,verbose=False # 设为True可以看到LangChain的详细执行过程,便于调试
)def run_chatbot():print("=" * 50)print("🤖 智能聊天机器人已启动!")print("💬 我会记住我们的对话内容")print("📝 输入'退出'或'quit'结束对话")print("=" * 50)# 显示初始记忆状态(为空)print("\n初始记忆:", memory.load_memory_variables({}))while True:try:# 获取用户输入user_input = input("\n你: ").strip()# 退出条件if user_input.lower() in ['退出', 'quit', 'exit', 'q']:print("AI: 再见!很高兴和你聊天。")breakif not user_input:continue# 5. 运行对话链,获取AI回复# 这里会自动处理:将历史+新输入传给LLM,并更新记忆response = conversation.predict(input=user_input)# 打印AI回复print(f"AI: {response}")# 可选:显示当前记忆内容(调试用)# current_memory = memory.load_memory_variables({})# print(f"\n[调试] 当前记忆: {current_memory}")except KeyboardInterrupt:print("\n\n对话被用户中断。再见!")breakexcept Exception as e:print(f"\n❌ 出错了: {e}")print("请检查API连接或网络设置")# 6. 添加一个演示函数来展示记忆效果
def demonstrate_memory():"""演示记忆功能的工作方式"""print("\n" + "=" * 50)print("🧠 记忆功能演示")print("=" * 50)# 清除之前的记忆memory.clear()# 模拟多轮对话test_dialogue = ["我叫小明","我最喜欢的颜色是蓝色","我来自北京","我的职业是程序员"]responses = []for i, message in enumerate(test_dialogue):response = conversation.predict(input=message)responses.append(response)print(f"轮次 {i+1}:")print(f" 你: {message}")print(f" AI: {response}")# 测试记忆效果print("\n🔍 现在测试记忆能力...")memory_test = conversation.predict(input="请总结一下你了解的关于我的信息")print(f"AI的总结: {memory_test}")# 显示完整记忆内容print("\n📋 完整对话历史:")history = memory.load_memory_variables({})for message in history['history']:role = "你" if message.type == 'human' else "AI"print(f"{role}: {message.content}")if __name__ == "__main__":# 运行主聊天机器人run_chatbot()# 取消下面的注释来运行记忆演示# demonstrate_memory()
关键组件解析
-
ConversationBufferMemory
:- 这是记忆功能的核心,它会自动保存所有的对话消息。
return_messages=True
确保返回的是消息对象列表,而不是纯文本。- 每次调用
conversation.predict()
后,新的对话轮次会自动添加到记忆体中。
-
ConversationChain
:- 一个高级封装,将 LLM、记忆体和提示词模板组合在一起。
- 自动处理对话历史的维护和注入。
-
提示词模板:
{history}
变量会自动被替换为完整的对话历史。{input}
变量会被替换为用户的最新输入。- 清晰的指令让 AI 知道如何利用历史上下文。
运行与测试
-
运行程序:
python chatbot_with_memory.py
-
测试记忆功能:
尝试进行多轮有上下文关联的对话:你: 我叫张三 AI: 你好张三!很高兴认识你。你: 我最喜欢的水果是苹果 AI: 苹果是个很健康的选择呢!清脆可口又营养丰富。你: 我的职业是老师 AI: 老师是很崇高的职业呢!教书育人,培养未来的希望。你: 还记得我喜欢什么水果吗? AI: 当然记得!你刚才说过你最喜欢的水果是苹果。
进阶探索
在掌握基础版本后,你可以尝试以下增强功能:
-
不同类型的记忆:
# 只记住最近3轮对话(节省token) from langchain.memory import ConversationBufferWindowMemory memory = ConversationBufferWindowMemory(k=3, return_messages=True)# 对历史对话进行摘要(处理长对话) from langchain.memory import ConversationSummaryMemory memory = ConversationSummaryMemory(llm=llm, return_messages=True)
-
添加对话主题跟踪:
# 在提示词中添加主题跟踪 chat_prompt = PromptTemplate.from_template(""" 当前对话主题:{current_topic} 对话历史:{history} 用户输入:{input} AI:""")
-
保存和加载记忆:
# 保存记忆到文件 import json with open('memory.json', 'w') as f:json.dump(memory.load_memory_variables({}), f)# 从文件加载记忆 with open('memory.json', 'r') as f:saved_memory = json.load(f)memory.save_context({"input": saved_memory['history'][0]}, {"output": saved_memory['history'][1]})