多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

OpenAI-Agents Session 会话系统完整指南:5 分钟让 AI 助手拥有多轮对话记忆

OpenAI-Agents Session 会话系统完整指南:5 分钟让 AI 助手拥有多轮对话记忆 OpenAI-Agents Session 会话系统完整指南5 分钟让 AI 助手拥有多轮对话记忆【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python你有没有过这种崩溃体验跟 AI 助手聊到第三句问它那个项目的进度怎么样了它居然回你一句请问你指的是哪个项目——明明上一轮才聊过。这就是典型的对话失忆每次请求都是孤立的AI 不知道你前面说过什么你也不得不像复读机一样反复补充背景。好消息是OpenAI-Agents 框架内置了一套 Session 会话管理系统专门解决这个问题。它会自动把每一轮对话的上下文存起来、下一轮再取出来喂给模型让你再也不用手写任何记住这句话的逻辑。这篇 OpenAI-Agents 会话管理指南会带你从最简示例一路讲到生产落地多轮对话记忆怎么开、会话持久化选哪种后端、对话历史怎么手动管理最后再聊聊怎么扩展属于自己的存储方案。5 分钟跑通让对话长记性的最小示例先不聊原理直接看效果。下面的代码只有 20 行左右运行后助手会自动接住上文import asyncio from agents import Agent, Runner, SQLiteSession async def main(): agent Agent(nameAssistant, instructionsReply very concisely.) # 创建一个会话对象conversation_123 是这个对话的记忆编号 session SQLiteSession(conversation_123) # 第一轮正常提问 result await Runner.run(agent, 旧金山的金门大桥在哪座城市, sessionsession) print(result.final_output) # 第二轮只说它助手也能知道你在问什么 result await Runner.run(agent, 它所在的州人口有多少, sessionsession) print(result.final_output) asyncio.run(main())关键就三处SQLiteSession(conversation_123)创建一个会话实例ID 相当于给这段记忆起个名字Runner.run(..., sessionsession)把会话对象挂到运行参数上记忆能力就此生效两轮调用传的是同一个session 对象第二轮的它因此能指回金门大桥。你全程没有手动拼接任何历史记录——这正是这套系统的价值。完整可运行版本见 examples/memory/sqlite_session_example.py它还演示了get_items(limit2)只取最近几条历史的小技巧。背后发生了什么一次运行的取—存两步把 session 传进去之后框架在 src/agents/run.py 的 Runner 里替你做了两件机械但容易出错的事运行前自动从会话里取出历史消息拼到你这次输入的前面让模型看全了上下文运行后把你新说的话和助手的回复原样写回会话。下一轮运行时这两步再重复一次对话链就自然续上了。以前你得自己维护一个列表、手动调.to_input_list()之类的方法来回转换现在这些胶水代码全部被 Session 吸收掉了。你可以把会话理解成助手的笔记本Runner 负责每轮开始前翻笔记、结束后记笔记你只负责说话。四种记忆后端怎么选同一个 Session 协议底下可以接不同的记忆引擎。框架自带四类覆盖绝大多数场景你的场景推荐后端特点本地调试、临时会话SQLiteSession内存模式默认零配置进程退出即消失适合测试单机应用需要会话持久化SQLiteSession文件模式传一个文件路径即可落盘重启后记忆还在深度使用 OpenAI 服务OpenAIConversationsSession历史直接存在 OpenAI 的 Conversations API 里不用自己管库企业级、多实例部署SQLAlchemySession可连 PostgreSQL、MySQL 等复用你现有的数据库基建敏感数据 自动清理EncryptedSession在任意后端外套一层 Fernet 加密 TTL 过期几个要点值得展开SQLiteSession默认就是内存库想持久化只需多传一个路径参数例如SQLiteSession(user_123, conversations.db)见 src/agents/memory/sqlite_session.pyOpenAIConversationsSession支持懒初始化——先不指定 ID第一次访问时自动在云端建一个 conversation也可以直接传conversation_id恢复老对话见 src/agents/memory/openai_conversations_session.pySQLAlchemySession提供from_url工厂方法三行连上数据库from agents.extensions.memory import SQLAlchemySession session SQLAlchemySession.from_url( user-123, urlpostgresqlasyncpg://app:secretdb.example.com/agents, create_tablesTrue, # 开发期自动建表生产环境建议交给迁移工具 )EncryptedSession是包装器模式底下先放一个真实后端外面套上加密层实现见 src/agents/extensions/memory/encrypt_session.py。from agents.extensions.memory import EncryptedSession, SQLAlchemySession underlying SQLAlchemySession.from_url(user-123, url..., create_tablesTrue) session EncryptedSession( session_iduser-123, underlying_sessionunderlying, encryption_keyyour-encryption-key, ttl600, # 10 分钟没被读到的记录视为过期读取时静默丢弃 )对话历史管理把历史攥在自己手里的四个方法不管后端是谁所有 Session 都暴露同一套四方法接口定义在 src/agents/memory/session.py 的Session协议里你可以随时介入历史session SQLiteSession(user_123, conversations.db) # 1. 查取全部历史或只取最近 N 条 items await session.get_items() recent await session.get_items(limit10) # 2. 存手动塞入消息比如从旧系统迁移过来的对话 await session.add_items([{role: user, content: 你好}]) # 3. 撤弹出最新的一条并删掉 last await session.pop_item() # 4. 清整段会话推倒重来 await session.clear_session()其中pop_item()有个很实用的姿势——纠错。假设助手刚给了一条错误的回复你不想让这条错话留在上下文里污染后续对话await session.pop_item() # 撤掉助手的错误回复 await session.pop_item() # 顺手把触发它的那句用户输入也撤掉 result await Runner.run(agent, 2 3 等于几, sessionsession) # 重新来相当于给 AI 对话装了个反悔键做交互式产品时这个体验提升非常明显。生产落地前的三个关键决策会话 ID 怎么起名字Session ID 是记忆的唯一索引起得好排查问题时能一眼定位。建议直接绑定业务实体user_12345—— 跟用户账号走一人一份长期记忆thread_abc123—— 跟对话线程走同一个用户开多个话题互不串味ticket_456—— 跟工单/订单走客服系统里最常用。多个智能体共享同一份记忆同一个 session 对象可以传给不同的 Agent它们会读到同一份对话历史。客服场景里支持专员处理到一半转给账单专员后者天然知道用户刚才抱怨了什么不用重复问。session SQLiteSession(ticket_456) await Runner.run(support_agent, 帮我看看我的账户, sessionsession) await Runner.run(billing_agent, 那我这月都被扣了哪些费, sessionsession)敏感数据加密与自动过期涉及医疗、金融这类数据时裸存在数据库里不合规。EncryptedSession用 Fernet 算法对每条记录做透明加密主密钥还会结合 session_id 派生出每会话独立的子密钥并通过 TTL 控制记录寿命超时未读的历史在取回时被静默跳过等于给记忆加了个保质期。另外注意过期判断依赖服务器系统时钟多机部署时记得开 NTP 同步否则可能误杀有效记录。自己动手写一个自定义 Session 后端如果内置后端都不合身——比如你想接公司内部的存储系统——协议其实简单得惊人继承SessionABC实现四个异步方法即可见 src/agents/memory/session.pyfrom agents.memory.session import SessionABC from agents.items import TResponseInputItem class MySession(SessionABC): session_id: str def __init__(self, session_id: str): self.session_id session_id # 在这里初始化你的存储客户端 async def get_items(self, limit: int | None None) - list[TResponseInputItem]: 读取历史传 limit 时返回按时间正序的最近 N 条 ... async def add_items(self, items: list[TResponseInputItem]) - None: 追加新消息 ... async def pop_item(self) - TResponseInputItem | None: 删掉并返回最新一条空会话返回 None ... async def clear_session(self) - None: 清空本会话全部历史 ...写完后Runner.run(agent, input, sessionMySession(x))就能无缝接入。顺带一提官方在 src/agents/extensions/memory/ 下已经提供了 Redis、MongoDB、Dapr 等现成后端动手造轮子前可以先翻翻能省不少事。完整示例与延伸阅读把前面零散的技巧串起来这是一个可直接跑的多轮对话完整示例import asyncio from agents import Agent, Runner, SQLiteSession async def main(): agent Agent(nameAssistant, instructionsReply very concisely.) # 指向文件记忆可跨进程重启保留 session SQLiteSession(conversation_123, conversation_history.db) questions [ 金门大桥在哪座城市, 它所在的州是哪里, 那个州的人口大概多少, ] for i, q in enumerate(questions, 1): result await Runner.run(agent, q, sessionsession) print(f第 {i} 轮 - {result.final_output}) # 收尾看看会话里到底存了什么 print(await session.get_items(limit3)) asyncio.run(main())想继续深入按这个路径走效率最高官方概念文档docs/sessions.md以及 docs/sessions/ 目录下的进阶 SQLite、加密会话、SQLAlchemy 会话三篇专文进阶示例examples/memory/advanced_sqlite_session_example.py、examples/memory/sqlalchemy_session_example.py、examples/memory/encrypted_session_example.py接口源码src/agents/memory/session.py协议定义、src/agents/run.pyRunner 如何驱动会话存取。写在最后Session 系统在 OpenAI-Agents 框架里的定位就是把对话状态从业务代码里剥离出来变成一层可替换、可加密、可共享的基础设施。你先用内存 SQLite 把体验跑通再按部署环境换成文件库、托管服务或企业数据库需要保密就套一层加密——整个演进过程业务代码几乎不用改。下一步建议你可以结合 Handoffs 和 Human-in-the-loop 机制看看多角色 会记住 可人工介入的完整对话产品该怎么搭。【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表