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 参数换任何人设或系统指令
相关推荐
追逐时光者7 小时前
一款开源、现代化的 WinForm UI 控件库
后端·.net
花月C8 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法
cci8 小时前
还在用conda?,试试uv,提高包的安装速度
后端
cci8 小时前
设备每次插入Linux识别的串口不一样?试试udev!
后端
9ilk9 小时前
【C++】--- C++11
开发语言·c++·笔记·后端
码事漫谈11 小时前
VSCode CMake Tools 功能解析、流程与最佳实践介绍
后端
火云牌神11 小时前
本地大模型编程实战(38)实现一个通用的大模型客户端
人工智能·后端
码事漫谈11 小时前
从C++/MFC到CEF与TypeScript的桌面架构演进
后端
冰块的旅行12 小时前
magic-api使用
后端
用户895356032822012 小时前
Goroutine + Channel 高效在哪?一文吃透 Go 并发底层 G-M-P 调度与实现
后端·go