创建我第一个带记忆能力的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: 再见!很高兴和你聊天。")
                break
                
            if 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对话被用户中断。再见!")
            break
        except 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. 保存和加载记忆

    # 保存记忆到文件
    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]})
    
posted @ 2025-09-15 09:32  PyAj  阅读(35)  评论(0)    收藏  举报