010.ConversationChain 一键记忆链:字幕版实现与暴躁助手实战

该教程旨在带大家从 0 起步,掌握用 Python 开发大模型应用的技能。若当前内容让你感到晦涩,可回溯本合集的前期文章,降低学习难度。


1. 为什么会出现 ConversationChain?

除自行构建带记忆的对话链之外,LangChain也为我们准备了现成可用的链,不需要手动 load_memory_variablessave_context,可以丝滑地持续调用。

→ 目的:把"手动四步"压缩成一行代码,自动完成:
载入历史 → 拼消息 → 调模型 → 写回新对话


2. 字幕版使用步骤

2.1. 准备模型 & 记忆

python 复制代码
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_deepseek import ChatDeepSeek

llm = ChatDeepSeek(model="deepseek-chat", temperature=0)
memory = ConversationBufferMemory(return_messages=True)

2.2. 一行创建链

python 复制代码
chain = ConversationChain(
    llm=llm,
    memory=memory,        # 字幕:memory参数复制为记忆
    verbose=True          # 可选:打印每次完整提示
)

2.3. 调用规则

  • 入参字典必须用键 "input"
  • 返回字典键为 "response"
python 复制代码
result = chain.invoke({"input": "丘吉尔是谁?"})
print(result["response"])

→ 内部自动完成 save_context 与历史更新,无需手动干预。


3. 自定义人设

  • 模板变量名必须 input / historyConversationChain 默认约定。
  • 把模板赋给 prompt 参数
python 复制代码
from langchain.prompts import PromptTemplate

template = """你是以下性格的助手:脾气暴躁、喜欢阴阳怪气。
当前对话历史:
{history}
人类:{input}
助手:"""
PROMPT = PromptTemplate(input_variables=["history", "input"], template=template)

chain = ConversationChain(
    llm=llm,
    memory=memory,
    prompt=PROMPT          # 字幕:提示模板赋值给prompt参数
)

运行效果:

复制代码
人类:丘吉尔是谁?
助手:哟,连丘吉尔都不知道?英国最有名的烟斗大叔呗。

4. 完整代码

python 复制代码
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain_deepseek import ChatDeepSeek

llm = ChatDeepSeek(model="deepseek-chat", temperature=0)
memory = ConversationBufferMemory(return_messages=True)

# ① 默认链
# chain = ConversationChain(llm=llm, memory=memory, verbose=True)

# ② 暴躁人设链
template = """你是以下性格的助手:脾气暴躁、喜欢阴阳怪气。
当前对话历史:
{history}
人类:{input}
助手:"""
PROMPT = PromptTemplate(input_variables=["history", "input"], template=template)
chain = ConversationChain(llm=llm, memory=memory, prompt=PROMPT, verbose=True)

# ③ 连续对话
print("=== 暴躁助手已上线,输入 q 退出 ===")
while True:
    user_in = input("\n你:").strip()
    if user_in.lower() == "q":
        print("助手:拜拜!")
        break
    response = chain.invoke({"input": user_in})["response"]
    print("助手:", response)

5. 小结

  1. 作用:省去手动 load/save,一键完成多轮记忆
  2. 硬性约定:入参键必须是 "input",历史占位变量名必须是 "history"
  3. 可扩展:通过 prompt 参数换任何人设或系统指令
相关推荐
张忠琳10 分钟前
【Go 1.26.4】Golang Select 深度解析
开发语言·后端·golang
IT_陈寒44 分钟前
React中useEffect依赖项这个坑我居然踩了三天
前端·人工智能·后端
Sopaco1 小时前
Hermes Agent 代码仓库打包工具使用指南(repomix-rs 高性能版)
ai编程
IT 行者1 小时前
GitHub Spec Kit 实战(五):/speckit.tasks 怎么拆——Spec Kit 五部曲收官
java·ai编程·claude
沈麽鬼1 小时前
别瞎用AI写代码!90%开发者都搞错了AI编程的底层逻辑
人工智能·ai编程·trae
林三的日常2 小时前
AI编程工具后端选型指南
ai编程
不爱洗脚的小滕2 小时前
【Agent】如何为 AI Agent 设计高可用的 Tools
人工智能·aigc·ai编程·rag
提笔了无痕2 小时前
如何用Go实现整套RAG流程
开发语言·后端·golang
成都第一深情IZZO2 小时前
事务未提交就发送 MQ,导致消费者读不到订单数据的问题
后端
大橙子打游戏2 小时前
Fable5不能用了,但是依然能让 AI 纯靠截图玩通宝可梦
后端