当前位置: 首页 > news >正文

创建我第一个带记忆能力的langchain机器人

以下内容由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()

关键组件解析

  1. ConversationBufferMemory

    • 这是记忆功能的核心,它会自动保存所有的对话消息。
    • return_messages=True 确保返回的是消息对象列表,而不是纯文本。
    • 每次调用 conversation.predict() 后,新的对话轮次会自动添加到记忆体中。
  2. ConversationChain

    • 一个高级封装,将 LLM、记忆体和提示词模板组合在一起。
    • 自动处理对话历史的维护和注入。
  3. 提示词模板

    • {history} 变量会自动被替换为完整的对话历史。
    • {input} 变量会被替换为用户的最新输入。
    • 清晰的指令让 AI 知道如何利用历史上下文。

运行与测试

  1. 运行程序

    python chatbot_with_memory.py
    
  2. 测试记忆功能
    尝试进行多轮有上下文关联的对话:

    你: 我叫张三
    AI: 你好张三!很高兴认识你。你: 我最喜欢的水果是苹果
    AI: 苹果是个很健康的选择呢!清脆可口又营养丰富。你: 我的职业是老师
    AI: 老师是很崇高的职业呢!教书育人,培养未来的希望。你: 还记得我喜欢什么水果吗?
    AI: 当然记得!你刚才说过你最喜欢的水果是苹果。
    

进阶探索

在掌握基础版本后,你可以尝试以下增强功能:

  1. 不同类型的记忆

    # 只记住最近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)
    
  2. 添加对话主题跟踪

    # 在提示词中添加主题跟踪
    chat_prompt = PromptTemplate.from_template("""
    当前对话主题:{current_topic}
    对话历史:{history}
    用户输入:{input}
    AI:""")
    
  3. 保存和加载记忆

    # 保存记忆到文件
    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]})
    
http://www.wxhsa.cn/company.asp?id=4415

相关文章:

  • GitHub超 30000+ star , 超强大的开源项目Supervision
  • 深入解析:【JavaEE】网络原理初识
  • Office文档投毒技术:SHVE中的会话劫持视觉利用新突破
  • 爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】
  • 简洁美观!一款值得 Star 的 Java 博客项目!
  • 数据结构与算法-33.图-加权有向图最短路径
  • 白子的情人节礼物
  • 白子的情人节礼物 题解
  • Ubuntu上进行Zookeeper集群部署
  • The Landscape of Agentic Reinforcement Learning综述 - jack
  • A Survey of Reinforcement Learning for Large Reasoning Models - jack
  • r-nacos支持mcp,内置mcp server支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。
  • MacOS下微信小程序抓包教程
  • nvm – nodejs版本管理工具
  • 财务系统里面,怎么合并使用两个经费本号
  • 【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现) - 详解
  • 新范式-LLaDA-VLA 基于扩散模型 VLA模型 - jack
  • Redis是如何进行内存管理的?缓存中有哪些常见问题?如何实现分布式锁?
  • 5 遥感与机器学习第三方库安装 - 详解
  • 移远OPENCPU笔记
  • 2025.9.16——1绿
  • Unity游戏开发:互动小游戏的技术实现与运营盈利之道
  • 如何实现主线程捕获子线程异常
  • LGP5688 [CSP-S-JX 2019] 散步 学习笔记
  • 少儿练字控笔字帖
  • 架构师必备:缓存更新模式总结
  • 为什么不能在try-catch中捕获子线程的异常 ?
  • sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践
  • 2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过
  • 一款带有AI功能的markdown工具