168 lines
6.5 KiB
Plaintext
168 lines
6.5 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"id": "initial_id",
|
|
"metadata": {
|
|
"collapsed": true,
|
|
"ExecuteTime": {
|
|
"end_time": "2026-09-05T01:34:44.550869800Z",
|
|
"start_time": "2026-09-05T01:34:44.535351500Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"from typing import cast, Literal\n",
|
|
"\n",
|
|
"from langchain.agents.middleware.summarization import ContextMessages\n",
|
|
"from langchain.chat_models import init_chat_model\n",
|
|
"from langchain.agents import create_agent\n",
|
|
"from langchain_core.runnables import RunnableConfig\n",
|
|
"from langgraph.checkpoint.memory import InMemorySaver\n",
|
|
"from langchain.agents.middleware import SummarizationMiddleware\n",
|
|
"\n",
|
|
"from core.config.settings import settings\n",
|
|
"from langchain.tools import tool\n",
|
|
"from langchain.messages import HumanMessage\n",
|
|
"from langchain_core.language_models import BaseChatModel"
|
|
],
|
|
"outputs": [],
|
|
"execution_count": 15
|
|
},
|
|
{
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2026-09-05T01:37:24.572533800Z",
|
|
"start_time": "2026-09-05T01:37:24.555523100Z"
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# 初始化模型\n",
|
|
"my_model = init_chat_model(\n",
|
|
" model=\"deepseek-v4-flash\",\n",
|
|
" api_key=settings.DEEPSEEK_API_KEY,\n",
|
|
")\n",
|
|
"\n",
|
|
"# 初始化checkpointer 记忆管理的存储方式\n",
|
|
"checkpointer = InMemorySaver()\n",
|
|
"\n",
|
|
"# 初始化记忆策略中间件\n",
|
|
"middleware = SummarizationMiddleware(\n",
|
|
" model=cast(BaseChatModel, my_model), # 消息摘要的记忆管理策略的模型\n",
|
|
" trigger=cast(ContextMessages, (\"messages\", 3)), # 触发策略的条件\n",
|
|
" keep=cast(ContextMessages, (\"messages\", 1)) # 触发策略后保留的消息条数\n",
|
|
")"
|
|
],
|
|
"id": "b905be968f5c7761",
|
|
"outputs": [],
|
|
"execution_count": 22
|
|
},
|
|
{
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2026-09-05T01:37:26.422888800Z",
|
|
"start_time": "2026-09-05T01:37:26.408643600Z"
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# 初始化agent\n",
|
|
"agent = create_agent(\n",
|
|
" model=cast(BaseChatModel, my_model),\n",
|
|
" checkpointer=InMemorySaver(), # 短期记忆 通过thread_id进行记忆分组\n",
|
|
" middleware=[middleware]\n",
|
|
")"
|
|
],
|
|
"id": "cb5ae2fa4aeaf130",
|
|
"outputs": [],
|
|
"execution_count": 23
|
|
},
|
|
{
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2026-09-05T01:37:59.930524700Z",
|
|
"start_time": "2026-09-05T01:37:27.968100300Z"
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"config: RunnableConfig = {\"configurable\": {\"thread_id\": \"thread_1\"}}\n",
|
|
"agent.invoke({\"messages\": [HumanMessage(\"你好,我是胖哥\")]}, config)\n",
|
|
"agent.invoke({\"messages\": [HumanMessage(\"我喜欢吃美食\")]}, config)\n",
|
|
"agent.invoke({\"messages\": [HumanMessage(\"我喜欢运动\")]}, config)\n",
|
|
"\n",
|
|
"result = agent.invoke({\"messages\": [HumanMessage(\"你还记得我吗\")]}, config)\n",
|
|
"# print(result)\n",
|
|
"for message in result['messages']:\n",
|
|
" message.pretty_print()"
|
|
],
|
|
"id": "1ed1327c973d75cc",
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"================================\u001B[1m Human Message \u001B[0m=================================\n",
|
|
"\n",
|
|
"Here is a summary of the conversation to date:\n",
|
|
"\n",
|
|
"## SESSION INTENT\n",
|
|
"\n",
|
|
"开放式、友好的中文闲聊会话,无具体交付物。用户自称“胖哥”,目前已透露两大爱好:美食与运动。整体目标是延续话题、维持轻松氛围,进一步了解他的偏好,从而围绕美食/运动展开聊天或提供推荐。\n",
|
|
"\n",
|
|
"## SUMMARY\n",
|
|
"\n",
|
|
"- 用户为“胖哥”,须以中文称呼;全会话均使用中文。\n",
|
|
"- 话题线索已在两条线上推进:\n",
|
|
" 1. **美食**:胖哥说“我喜欢吃美食”。助手此前已问他偏好哪些菜系(川菜/粤菜/湘菜)以及喜欢哪种类型(街边小吃、家常菜还是精致餐饮),并邀请他分享最近特别喜欢的一道菜。胖哥尚未回答此组问题。\n",
|
|
" 2. **运动(新增)**:胖哥随后说“我喜欢运动”。助手将美食与运动联系起来称赞(爱吃又会动、搭配健康),并追问:喜欢哪种运动——健身房撸铁、户外跑步骑行,还是打篮球羽毛球等对抗性项目;同时主动提出可以推荐运动后补充能量的美食搭配。\n",
|
|
"- 尚无任何结论、决定或策略形成;没有选项被否决。\n",
|
|
"- 需要注意的是,胖哥对“美食偏好”相关问题尚未作答,该线索仍处于待回应状态。\n",
|
|
"\n",
|
|
"## ARTIFACTS\n",
|
|
"\n",
|
|
"None.\n",
|
|
"\n",
|
|
"## NEXT STEPS\n",
|
|
"\n",
|
|
"- 等待胖哥回复:他喜欢哪种运动(健身房/户外/球类对抗等)。\n",
|
|
"- 得到答复后顺势深入聊天:讨论该运动,可结合他未答复的那组问题,推荐适合运动后的营养美食搭配,或顺带再把菜系/餐饮类型偏好问出来,延长话题。\n",
|
|
"- 不要重复寒暄,也不要重复之前已问过的两组问题(菜系类型与偏好风格、运动类型选择)。\n",
|
|
"- 保持中文、热情随意的口吻继续对话。\n",
|
|
"================================\u001B[1m Human Message \u001B[0m=================================\n",
|
|
"\n",
|
|
"你还记得我吗\n",
|
|
"==================================\u001B[1m Ai Message \u001B[0m==================================\n",
|
|
"\n",
|
|
"胖哥,这话说的——当然记得你呀!爱美食又爱运动,能吃会练,这反差感可太让人印象深刻了。咱俩这不正聊到运动嘛,我还等着听你细说呢。 \n",
|
|
"\n",
|
|
"不过不急,你先说说最近一次痛快出汗是啥时候?是去健身房撸铁,还是户外疯跑了一圈?反正不管哪种,你要是一会儿饿了,我脑子里的运动后美食搭配可已经在排队了😄\n"
|
|
]
|
|
}
|
|
],
|
|
"execution_count": 24
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 2
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython2",
|
|
"version": "2.7.6"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|