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 参数换任何人设或系统指令
相关推荐
乱世刀疤1 小时前
OpenCode在Windows上的安装与使用入门 | 保姆级教程
ai编程
野犬寒鸦7 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈7 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
github.com/starRTC8 小时前
Claude Code中英文系列教程25:非交互式运行 Claude Code
人工智能·ai编程
李梨同学丶9 小时前
0201好虫子周刊
后端
思想在飞肢体在追9 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
Loo国昌12 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
玄同76512 小时前
Trae国际版与国内版深度测评:AI原生IDE的双生花
ide·人工智能·ai编程·cursor·ai-native·trae
乱世刀疤12 小时前
Claude Code实战:生成植物大战僵尸游戏
ai编程
ONE_PUNCH_Ge13 小时前
Go 语言泛型
开发语言·后端·golang