48.实战:智能机器人
本文介绍了构建智能机器人的两个阶段开发过程。第一阶段创建基础机器人雏形,包括安装OpenAI SDK、设置API Key环境变量、构造对话上下文消息(包含system、user、assistant三种角色),并通过调用GPT-4o-mini模型生成抑制消费冲动的建议回复。第二阶段使用LangChain框架升级机器人功能,构建多阶段对话流程:先由AI分析不购买商品的理性原因,再将分析结果改写成诗歌形
实战:智能机器人
阶段1:机器人雏形
安装 OpenAI 官方 SDK
pip install -U openai
建议版本 ≥ 1.x
设置环境变量(API Key)
Windows(PowerShell)
setx AI_KEY "sk-你的key"
验证是否成功
import os
print(os.getenv("AI_KEY"))
能看到 key 说明没问题。
创建 OpenAI 客户端
from openai import OpenAI
import os
client = OpenAI(
api_key=os.getenv('AI_KEY')
)
作用
OpenAI() :创建一个 API 客户端
api_key :用于鉴权(证明你有权限调用模型)
常见坑
os.getenv(‘AI_KEY’) 返回 None → 说明环境变量没配好
key 写死在代码里 ❌(不安全)
构造 messages(对话上下文)
messages=[
# 设置系统语境
{'role':'system','content':"你被用于抑制用户的购买欲望。当用户说想要买什么东西时,你需要提供理由让用户不要买"},
{'role':'user','content':"我正在购买一个游戏笔记本电脑,但我想抑制这个购买欲望。你帮我列出一些理由,让我思考一下我是否真的需要个买这个商品吗?"}
]
role 有 3 种(必须记住)
| role | 作用 |
|---|---|
| system | 给 AI 定规则 / 人设 |
| user | 用户输入 |
| assistant | AI 之前的回答(可选) |
-
system :告诉 AI 你是一个“反消费冲动助手”
-
user :输入你的真实想法
👉 system 会强烈影响 AI 行为
这就是 prompt engineering 的核心。
调用模型生成回复
completion = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
max_tokens=500,
temperature=0.7
)
参数详解
model
model='gpt-4o-mini'
- 轻量、便宜、稳定
- 非常适合学习 / Demo / 工具类 AI
messages
messages=messages
- 把刚才的对话上下文传给模型
- 模型会“扮演 system + 回答 user”
max_tokens
max_tokens=500
- 限制 AI 最多输出多少 token
- 防止输出太长、花钱太多
经验值:
- 简单回答:200~300
- 分析类回答:300~600
temperature
temperature=0.7
控制“随机性 / 创造力”:
| 值 | 特点 |
|---|---|
| 0 | 非常死板 |
| 0.3 | 稳定理性 |
| 0.7 | 推荐(自然、有变化) |
| 1.2 | 发散、创意多 |
👉 理性分析类:0.5~0.8 最合适
读取并打印模型输出
print(completion.choices[0].message.content)
返回结构解释
completion
└── choices (列表)
└── [0]
└── message
└── content ← AI 真正说的话
所以:
completion.choices[0].message.content
= AI 的最终回答
完整执行流程
你 → 写 messages
→ OpenAI API
→ 模型根据 system 约束思考
→ 生成 assistant 回复
→ 返回 completion
你 → 取 content → print
完整示例
from openai import OpenAI
import os
# 创建客户端
client=OpenAI(
api_key=os.getenv('AI_KEY'),
)
# 创建消息(语境,对话)
messages=[
# 设置系统语境
{'role':'system','content':"你被用于抑制用户的购买欲望。当用户说想要买什么东西时,你需要提供理由让用户不要买"},
{'role':'user','content':"我正在购买一个游戏笔记本电脑,但我想抑制这个购买欲望。你帮我列出一些理由,让我思考一下我是否真的需要个买这个商品吗?"}
]
# 获取响应消息
response=client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
max_tokens=500,
temperature=0.7
)
print(response.choices[0].message.content)
#大模型
#提示词工程->大模型 (雏形)
#提示词模板->大模型->输出格式化 (升级)
#提示词->记忆提取->大模型->输出格式化 (改造)
#提示词->记忆提取->大模型->输出格式化->使用工具 (完全状态)
阶段2:机器人升级
使用 LangChain 构建一个“抑制购买欲望”的多阶段对话程序
程序整体目标
这段程序实现了一个命令行交互式 AI 应用,功能是:
- 用户输入自己想购买的商品
- AI 给出“不要买”的理性分析
- 再由 AI 把这段分析 改写成一首诗
- 将最终结果输出给用户
整个流程通过 LangChain 的链式调用(Chain) 完成。
程序运行前准备
在运行代码前,需要满足两个条件:
- 已安装依赖:
pip install langchain langchain-openai openai
- 已设置环境变量 AI_KEY ,用于存储 OpenAI API Key。
导入模块
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
说明
- os :用于读取环境变量中的 API Key
- ChatOpenAI :LangChain 对 OpenAI 聊天模型的封装
- ChatPromptTemplate :用于创建结构化的提示词模板
创建提示词模板(Prompt Template)
prompt_template = ChatPromptTemplate.from_messages(
[
('system','你被用于抑制用户的购买欲望。当用户说想要买什么东西时,你需要提供理由让用户不要买'),
('human','我正在购买一个{product},但我想抑制这个购买欲望。你帮我列出一些理由,让我思考一下我是否真的需要个买这个商品吗?')
]
)
作用
这一部分定义了 AI 对话的固定结构:
- system :定义 AI 的角色和行为规则
- human :定义用户输入的模板,其中 {product} 是变量占位符
当程序运行时, {product} 会被用户输入的商品名称替换。
模板格式化测试
prompt_template.format(product='手机')
这一行代码用于测试模板是否能正确替换变量,不会影响程序运行逻辑。
创建会话模型
model = ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv('AI_KEY'),
max_tokens=200,
temperature=0.7
)
作用
该模型用于执行第一阶段任务:
根据提示词,生成“为什么不应该购买该商品”的分析内容。
参数说明
- model :指定使用的 OpenAI 模型
- openai_api_key :从环境变量中读取 API Key
- max_tokens :限制模型最大输出长度
- temperature :控制输出的随机性和多样性
定义输出格式化函数
def output_parser(output: str):
parser_model = ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv('AI_KEY'),
temperature=0.7
)
message = '你需要将传入的文本改写,使用一首诗描述。这是你需要改写的文本:`{text}`'
return parser_model.invoke(message.format(text=output))
作用
这个函数承担第二阶段任务:
将上一阶段生成的“理性分析文本”重新改写成一首诗。
执行过程
- 接收上一阶段模型输出的文本
- 将文本嵌入到新的提示语中
- 调用第二个模型进行改写
- 返回模型生成的结果
构建 LangChain 链(Chain)
chain = prompt_template | model | output_parser
含义
这一行将三个步骤连接成一个执行链:
- prompt_template :生成完整提示词
- model :生成“不要买”的分析文本
- output_parser :将分析文本改写成诗
LangChain 中的 | 表示 前一步的输出作为后一步的输入。
命令行交互循环
while True:
answer_string = input('你想买什么?\n')
answer = chain.invoke(input={'product':answer_string})
print(answer.content)
执行流程
- 程序等待用户输入商品名称
- 用户输入内容被赋值给 {product}
- chain.invoke() 启动整个链式流程
- 最终返回的结果是一个 AI 消息对象
- 通过 answer.content 输出最终文本
完整示例
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
# 提示词模版
prompt_template = ChatPromptTemplate.from_messages(
[
('system','你被用于抑制用户的购买欲望。当用户说想要买什么东西时,你需要提供理由让用户不要买'),
('human','我正在购买一个游戏笔记本电脑,但我想抑制这个购买欲望。你帮我列出一些理由,让我思考一下我是否真的需要个买这个商品吗?')
]
)
prompt_template.format(product='手机')
# 创建会话模型
model=ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv('AI_KEY'),
max_tokens=200,
temperature=0.7
)
# 输出格式化定义
def output_perser(output:str):
perser_model=ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv('AI_KEY'),
temperature=0.7
)
message='你需要将传入的文本改写,使用一首诗描述。这是你需要改写的文本`{text}`'
return perser_model.invoke(message.format(text=output))
# 调用链
chain=prompt_template | model | output_perser
# 循环对话
while True:
answer_string=input('你想买什么?\n')
answer=chain.invoke(input={'product':answer_string})
print(answer.content)
阶段3:机器人设计
使用 LangChain + HuggingFace + Chroma 构建基础语义检索
程序整体目标
给定一组文本,将它们向量化并存入向量数据库,
然后根据用户的查询语句,检索出语义最相关的文本内容。
依赖说明
程序运行前需要安装以下依赖:
pip install chromadb
pip install sentence-transformers
pip install -U langchain-huggingface
导入模块
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
模块说明
-
HuggingFaceEmbeddings :用于加载 HuggingFace 上的文本向量化模型
-
Chroma :LangChain 封装的向量数据库接口
初始化嵌入模型(Embedding Model)
embeddings = HuggingFaceEmbeddings(
model_name='sentence-transformers/all-MiniLM-L6-v2',
model_kwargs={'device':'cpu'}
)
作用
该步骤加载一个文本嵌入模型,用于将文本转换为向量。
参数说明
-
model_name :指定 HuggingFace 上的预训练模型名称
-
model_kwargs :指定模型运行设备,这里使用 CPU
准备文本数据
text = [
'篮球是一项伟大的运动。',
'带我飞往月球是我最喜欢的歌曲之一。',
'这是一篇关于波士顿凯尔特人的文章。',
'我非常喜欢去看电影。',
'波士顿凯尔特人队以20分的优势赢得了比赛。',
'这只是一段随机的文字。',
'《艾尔登之环》是过去15年最好的游戏之一。',
'L.科内特是凯尔特人队最好的队员之一。',
'拉里.博德是一位标志性的NBA球员。'
]
说明
这是一组待检索的原始文本数据,内容涉及体育、音乐、游戏等多个主题。
初始化 Chroma 向量数据库
retrieval = Chroma.from_texts(
texts=text,
embedding=embeddings
).as_retriever(search_kwargs={'k':3})
执行流程
-
from_texts :
-
将文本列表传入
-
使用嵌入模型将每条文本转换为向量
-
将向量存入 Chroma 向量数据库
-
-
as_retriever :
-
将向量数据库封装为检索器(Retriever)
-
k=3 表示每次查询返回最相似的 3 条结果
-
定义查询语句
query = '关于凯尔特人队你知道什么'
说明
这是用户输入的查询文本,用于与向量数据库中的文本进行语义匹配。
执行语义检索
docs = retrieval.invoke(query)
发生的事情
- 查询文本被嵌入模型转换为向量
- 向量数据库计算查询向量与已有文本向量的相似度
- 返回最相似的 k=3 条文本结果
输出检索结果
for i in docs:
print(i.page_content)
说明
-
docs 是一个文档对象列表
-
page_content 保存了原始文本内容
-
循环打印即可看到匹配到的文本
程序输出示例(逻辑说明)
当查询内容为:
关于凯尔特人队你知道什么
程序会输出与“凯尔特人队”语义相关的文本,例如:
- 波士顿凯尔特人相关的比赛描述
- 球队成员相关内容
完整示例
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
# 初始化嵌入模型
embeddings=HuggingFaceEmbeddings(
# 模型名称
model_name='sentence-transformers/all-MiniLM-L6-v2',
model_kwargs={'device':'cpu'}
)
text=[
'篮球是一项伟大的运动。',
'带我飞往月球是我最喜欢的歌曲之一。',
'这是一篇关于波士顿凯尔特人的文章。',
'我非常喜欢去看电影。',
'波士顿凯尔特人队以20分的优势赢得了比赛。',
'这只是一段随机的文字。',
'《艾尔登之环》是过去15年最好的游戏之一。',
'L.科内特是凯尔特人队最好的队员之一。',
'拉里.博德是一位标志性的NBA球员。'
]
# 初始化chroma
retrieval=Chroma.from_texts(
# 长文本
texts=text,
# 传入模型实例
embedding=embeddings,
).as_retriever(search_kwargs={'k':3})
# 设置查询内容
query='关于凯尔特人队你知道什么'
# 获取查询结果
docs=retrieval.invoke(query)
for i in docs:
print(i.page_content)
阶段4:机器人基础记忆
使用 LangChain 实现会话历史记录的聊天机器人
会话基础
from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
('human','{new_message}')
]
)
docs = prompt_template.invoke({'new_message':'你好'}).messages
for i in docs:
print(i.content)
会话历史记录
1.程序整体目标
- 使用模板定义系统身份、历史消息占位符和用户新消息
- 将历史消息和新输入渲染到模板中
- 输出最终组合后的消息列表(包括 system、human、ai 消息)
2.导入模块
from langchain_core.prompts import MessagesPlaceholder
from langchain_core.prompts import ChatPromptTemplate
模块说明
- MessagesPlaceholder :在模板中占位,用于插入历史对话
- ChatPromptTemplate :用于创建结构化聊天提示词模板
3.创建提示词模板
prompt_template = ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
MessagesPlaceholder(variable_name='history'),
('human','{new_message}')
]
)
各部分含义
-
system
-
定义 AI 的角色和行为规则
-
这里是:“你是一个聊天机器人。”
-
-
MessagesPlaceholder(variable_name=‘history’)
-
占位符,用于在模板中插入历史对话
-
variable_name=‘history’ 表示在调用时要传入 history 变量
-
-
human
-
表示用户本轮输入
-
{new_message} 是变量占位符,会替换为用户的新消息
-
4.调用模板生成会话内容
response = prompt_template.invoke(
{
'history':
[
('human','你好'),
('ai','你好呀,很高兴遇见你')
],
'new_message':'你是谁?'
}
).messages
执行流程
-
invoke 方法会将传入的变量替换到模板中:
-
history 替换到 MessagesPlaceholder
-
new_message 替换到 {new_message}
-
-
输出是一个消息列表对象,每条消息都包含角色和内容(system、human、ai)
5.输出会话内容
for line in response:
print(line.content)
作用
-
遍历模板生成的消息列表
-
打印每条消息的内容
-
输出结果按顺序展示:
- system 消息
- 历史对话 human / ai 消息
- 当前 human 新消息
6.程序执行逻辑总结
提示词模板:
system: 你是一个聊天机器人
history: 历史消息占位符
human: 新消息
调用 invoke:
传入历史消息 + 新消息
→ 模板渲染
→ 输出完整消息列表
打印 messages:
按顺序输出 system、历史对话、人类新消息
完整示例
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt_template=ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
# 插入历史记录
MessagesPlaceholder(variable_name='history'),
('human','{new_message}')
]
)
docs=prompt_template.invoke({
'history':
[
('human','你好'),
('ai','你好呀,很高兴遇见你')
],
'new_message':'你是谁?'
}
).messages
for i in docs:
print(i.content)
记忆功能整合
1.程序整体目标
这段代码实现了一个可以记录会话历史的聊天机器人,功能包括:
- 保留用户和 AI 的对话历史
- 在每轮对话中,AI 能基于历史内容生成回答
- 用户输入新消息,AI 根据历史和新消息做回应
2.导入模块
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
import os
模块说明
- ChatOpenAI :LangChain 对 OpenAI 聊天模型的封装
- ChatPromptTemplate :用于创建结构化提示词模板
- MessagesPlaceholder :在模板中占位,表示历史对话消息
- os :读取环境变量(API Key 和 API Base URL)
3.创建提示词模板(Prompt Template)
prompt_template = ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
MessagesPlaceholder(variable_name='history'),
('human','{new_message}')
]
)
各部分含义
- system
定义 AI 的身份和行为规则
这里是:你是一个聊天机器人
- MessagesPlaceholder(variable_name=‘history’)
占位符,用于插入之前的对话历史
在调用时会用 history 变量替换
- human
表示用户本轮输入
{new_message} 是变量占位符,会替换为用户输入的新消息
4.创建模型实例
model = ChatOpenAI(
model='gpt-4o-mini',
#openai_api_base=os.getenv('AI_URL'),
openai_api_key=os.getenv('AI_KEY'),
max_tokens=200
)
参数说明
-
model=‘gpt-4o-mini’ :指定 OpenAI 模型
-
openai_api_base :API 接口地址(通过环境变量读取)
-
openai_api_key :API Key(通过环境变量读取)
-
max_tokens=200 :限制 AI 最大输出长度
5.构建链(Chain)
chain = prompt_template | model
含义
- prompt_template | model 表示将模板和模型串联成一个执行链
- 输入模板后生成提示词,再传给模型进行响应
- LangChain 中 | 的作用是 前一步的输出作为下一步的输入
6.初始化会话历史记录
history = []
说明
- history 是一个空列表,用于存储用户和 AI 的对话历史
- 每轮对话结束后,会把新消息和 AI 回复加入历史
7.定义聊天函数
def chat(new_message):
response = chain.invoke({'history':history,'new_message':new_message})
history.extend([
('human',new_message),
('ai',response.content)
])
return response.content
执行流程
-
调用 chain.invoke ,传入两个变量:
-
‘history’ :历史消息列表
-
‘new_message’ :用户本轮输入
-
-
模型根据 系统提示 + 历史消息 + 新消息 生成回答
-
将用户消息和 AI 回复追加到 history 中
-
返回 AI 的回答文本
8.调用聊天函数示例
print(chat('你好,我是guo,今年99岁,是一名教授,正在分享AI智能体开发课程'))
print(chat('请你叙述所知道的关于我的消息'))
解释
-
第一条消息:
-
用户告诉 AI 一些个人信息
-
AI 根据提示生成初次回答
-
-
第二条消息:
-
用户要求 AI 总结已知信息
-
AI 会结合 history 中的第一条消息生成回答
-
9.程序执行逻辑总结
整体执行流程如下:
用户输入 new_message
↓
提示词模板渲染:
system: 你是聊天机器人
history: 之前的对话内容
human: 当前用户输入
↓
模型生成回答
↓
将 new_message 和 AI 回复追加到 history
↓
返回 AI 回复给用户
完整示例
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
import os
prompt_template=ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
# 插入历史记录
MessagesPlaceholder(variable_name='history'),
('human','{new_message}')
]
)
# 构建模型
model=ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv("AI_KEY"),
max_tokens=200
)
# 调用链
chain=prompt_template | model
# 历史记录初始化
history=[]
def chat(new_message):
response=chain.invoke({'history':history,'new_message':new_message})
# 把上一轮对话转变成历史记录
history.extend([
('human',new_message),
('ai',response.content)
])
return response.content
print(chat('你好,我是guo,今年99岁,是一名教授,正在分享AI智能体开发课程'))
print(chat('请你叙述所知道的关于我的消息'))
阶段5:完善机器人
使用 LangChain 构建带历史记忆和摘要功能的聊天机器人
程序整体目标
这段代码实现了一个多轮聊天机器人,功能包括:
- 保存会话历史记录
- 当历史消息超过 6 条时自动生成摘要并替换历史
- 使用模板结合新消息和历史消息生成 AI 回复
- 支持连续多轮会话
导入模块
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
from langchain_openai import ChatOpenAI
from langchain_community.chat_message_histories import ChatMessageHistory
import os
模块说明
- RunnableWithMessageHistory :将链与消息历史结合,使每轮输入能够访问历史
- ChatPromptTemplate :用于创建结构化聊天提示词模板
- MessagesPlaceholder :在模板中占位,用于插入历史消息
- ChatOpenAI :LangChain 对 OpenAI 聊天模型的封装
- ChatMessageHistory :存储聊天历史消息
- os :读取环境变量
创建提示词模板
prompt_template = ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
MessagesPlaceholder(variable_name='history'),
('human','{new_message}')
]
)
各部分含义
- system:定义 AI 角色(聊天机器人)
- MessagesPlaceholder:占位历史消息,后续会被 history 变量替换
- human:表示用户当前输入 {new_message}
创建模型实例
model = ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv('AI_KEY'),
max_tokens=200
)
参数说明
- model :使用 gpt-4o-mini
- openai_api_key :从环境变量读取
- max_tokens :限制输出长度
构建基本调用链
chain = prompt_template | model
含义
- 将提示模板与模型串联成执行链
- 输入模板生成提示词 → 传给模型 → 输出 AI 回复
初始化消息历史记录
history = ChatMessageHistory()
作用
- 用于存储每轮对话的消息
- 支持多轮会话调用
定义历史摘要函数
# 如果超过6条历史记录汇总成1条消息摘要
def summarize_message(chain_input):
# 获取当前存储的历史消息列表
stored_message=history.messages
if len(stored_message)>=6:
# 创建一个新的提示模板,用于生成摘要
# MessagesPlaceholder 用于插入当前历史消息
summarize_prompt=ChatPromptTemplate.from_messages(
[
MessagesPlaceholder(variable_name='history'), # 历史消息占位
('user','将上述聊天信息提炼成一条摘要信息,尽可能多的包含具体细节。') # 指示模型生成摘要
]
)
# 将提示模板和模型组合成一个执行链
summarize_chain=summarize_prompt | model
# 汇总并返回摘要信息
summarize_message=summarize_chain.invoke({'history':stored_message})
# 清空历史记录
history.clear()
#把汇总的再要进行添加到历史记录中
history.add_message(summarize_message)
# 返回原始输入,以便后续链式调用继续使用
return chain_input
执行流程
-
获取当前存储的历史消息
-
如果历史消息数量 ≥ 6 条:
-
创建新的提示模板,指示 AI 将历史消息提炼为摘要
-
通过 summarize_chain 生成摘要
-
清空原有历史
-
将生成的摘要加入历史
-
-
返回原始输入(用于后续调用链)
将链与消息历史结合
# 记忆添加
chain_with_memory=RunnableWithMessageHistory(
chain, # 需要绑定历史的链,这里是之前定义的 chain(提示模板 | 模型)
lambda x:history, # 提供历史消息的函数,这里直接返回 history 对象
input_messages_key='new_message', # 指定当前用户输入在调用时使用的键名
history_messages_key='history' # 指定历史消息在调用时使用的键名
)
含义
-
将 chain 与消息历史绑定
-
lambda x: history 提供历史记录
-
input_messages_key=‘new_message’ :当前输入
-
history_messages_key=‘history’ :历史消息占位
组合摘要与聊天链
chain_with_summarization = summarize_message | chain_with_memory
含义
- 先执行 summarize_message (历史摘要检查)
- 再执行 chain_with_memory (带历史的聊天模型)
多轮会话循环
# 多轮会话
while True:
# 从用户输入获取新消息
new_message=input('You:') # 提示用户输入内容,并将输入赋值给 new_message
# 调用带历史记忆和摘要功能的聊天链
response=chain_with_summarization.invoke(
{
'new_message':new_message # 传入本轮用户输入
},
config={
'configurable':{
'session_id':'unused' # 可选配置,提供 session_id(这里未使用)
}
}
)
# 输出 AI 生成的回复内容
print(response.content)
执行流程
-
用户输入 new_message
-
chain_with_summarization.invoke 执行:
-
检查历史消息是否超过 6 条,生成摘要
-
结合历史消息与新输入生成 AI 回复
-
-
输出 AI 回复
-
历史消息自动更新
-
循环继续下一轮输入
程序执行逻辑总结
用户输入 new_message
↓
summarize_message 检查历史消息:
如果消息 ≥6 条 → 生成摘要 → 清空历史 → 添加摘要
↓
chain_with_memory 使用历史 + 新消息生成 AI 回复
↓
历史记录更新
↓
打印 AI 回复
完整示例
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
from langchain_core.runnables.history import RunnableWithMessageHistory
import os
# 提示词模版
prompt_template=ChatPromptTemplate.from_messages(
[
('system','你是一个聊天机器人。'),
# 插入历史记录
MessagesPlaceholder(variable_name='history'),
('human','{new_message}')
]
)
# 构建模型
model=ChatOpenAI(
model='gpt-4o-mini',
openai_api_key=os.getenv("AI_KEY"),
max_tokens=200
)
# 调用链
chain=prompt_template | model
# 历史记录消息模块
from langchain_community.chat_message_histories import ChatMessageHistory
# 消息对象
history=ChatMessageHistory()
# 如果超过6条历史记录汇总成1条消息摘要
def summarize_message(chain_input):
stored_message=history.messages
if len(stored_message)>=6:
summarize_prompt=ChatPromptTemplate.from_messages(
[
MessagesPlaceholder(variable_name='history'),
('user','将上述聊天信息提炼成一条摘要信息,尽可能多的包含具体细节。')
]
)
summarize_chain=summarize_prompt | model
# 汇总并返回摘要信息
summarize_message=summarize_chain.invoke({'history':stored_message})
# 清空历史记录
history.clear()
#把汇总的再要进行添加到历史记录中
history.add_message(summarize_message)
return chain_input
# 记忆添加
chain_with_memory=RunnableWithMessageHistory(
chain,
lambda x:history,
input_messages_key='new_message',
history_messages_key='history'
)
# 调用链
chain_with_summarization=summarize_message | chain_with_memory
# 多轮会话
while True:
new_message=input('You:')
response=chain_with_summarization.invoke(
{
'new_message':new_message
},
config={
'configurable':{
'session_id':'unused'
}
}
)
print(response.content)
更多推荐


所有评论(0)