本节摘要:把前五节的技能串成一次综合实战。本节聚焦三个把智能体从"演示品"推向"产品"的能力:流式输出(体验像聊天)、会话持久化(跨轮记住上下文)、结构化响应(对接业务系统),并给出一个融合练习的完整示例。
阅读完本节,你应当能够:
演示用的智能体可以"等结果",产品里的智能体不行。用户等 10 秒没反应就流失了;用户昨天聊的内容今天全忘,体验像失忆;系统要的是结构化数据,智能体给一长段散文没法对接。这三个问题——响应慢、无记忆、难集成——是智能体从玩具到产品的三座山,本节逐个翻过去。
持久化记忆依赖数据库:Agno 把会话与状态写入数据库,智能体实例重建后能从库中恢复上下文。这让"重启不丢"成为可能——记忆不在内存里,而在数据库里。
from agno.agent import Agent agent = Agent(name="chat_bot") # 流式逐块输出 for chunk in agent.run("给我讲一个关于数据科学家的故事", stream=True): print(chunk.content, end="", flush=True)
💡 关键直觉:流式输出最大的价值不是"快",而是让用户看到进度。哪怕是逐字蹦出,用户的等待焦虑也大幅下降——这是交互产品的体验底线。
from agno.agent import Agent from agno.storage.sqlite import SqliteStorage agent = Agent( name="memory_bot", storage=SqliteStorage(table_name="chat_sessions", db_file="sessions.db"), add_history_to_messages=True, # 把历史拼进上下文 ) # 第一轮:记住用户偏好 agent.print_response("我更喜欢简洁的回答,以后都这样") # 第二轮:无需重申,智能体还记得 agent.print_response("刚才说的记住了吗?")
⚠️ 常见坑:配了 storage 却漏了
add_history_to_messages=True,历史不会自动进上下文——智能体依然"失忆"。两个开关要一起用。
from agno.agent import Agent from pydantic import BaseModel class Order(BaseModel): order_id: str items: list total: float agent = Agent(name="order_bot", response_model=Order) order = agent.run("帮我生成一笔订单:两件衬衫,共 399 元") print(order.order_id, order.total) # 直接拿到字段
把三件套拼成一个客服智能体:
from agno.agent import Agent from agno.storage.sqlite import SqliteStorage from agno.tools.duckduckgo import DuckDuckGoTools from pydantic import BaseModel class Ticket(BaseModel): category: str summary: str urgent: bool agent = Agent( name="support_bot", description="负责处理用户售后问题的客服智能体", tools=[DuckDuckGoTools()], # 查订单物流等公开信息 storage=SqliteStorage(table_name="support", db_file="support.db"), add_history_to_messages=True, # 记住历史 response_model=Ticket, # 输出工单 ) ticket = agent.run("我上周买的耳机坏了,想退货") print(ticket.category, ticket.urgent) # 结构化工单
这个示例里,智能体记住用户、联网查信息、输出结构化工单——流式、记忆、结构三个能力一次用齐。
| 环节 | 检查项 |
|---|---|
| 交互 | 是否流式输出 |
| 记忆 | 是否持久化、历史是否入上下文 |
| 集成 | 输出是否结构化 |
| 安全 | 密钥是否走环境变量 |
| 监控 | 是否记录调用日志与失败 |
| 成本 | 是否限制 token 与调用频率 |
内存管理最直观的验证方式,原始资料给的是"两轮对话法"。第一轮告诉智能体一个事实:"我叫小张,在做电商项目";第二轮换个话题问:"还记得我在做什么项目吗?"配置了持久化记忆的智能体能直接答上来,没配置的会一脸茫然。
这个五分钟实验的价值在于把抽象的"记忆"变成可观察的行为。进一步还可以做边界测试:重启进程后再问(验证是真持久化而非进程内缓存)、隔了二十轮对话后再问(验证记忆窗口策略)、在另一个会话里问(验证会话隔离)。三个测试下来,记忆机制的行为边界你就摸清了。
生产上配记忆要同时想三件事:存多久(生命周期)、存多少(窗口与摘要策略)、给谁看(会话隔离与权限)。只配不管理,数据库会越滚越大,上下文越来越贵。
高级演练的第二站是让输出可直接进业务系统。原始示例的做法朴素而实用:
import json response = agent.run("给出这款产品的名称、价格、卖点,用 JSON 输出") product = json.loads(response.content) # 字符串 → 字典 print(product["名称"], product["价格"])
实战中的护栏有两层。指令层:明确字段清单、类型、缺失时填什么,模型遵守格式的稳定性会大幅提升。解析层:包一层异常处理,解析失败时把报错信息回喂给模型让它自纠一次,通常能救回大部分格式错误。
第三站原始资料展示了智能体与规则引擎的分工——以疾病诊断为例,把确定性知识放进规则库,智能体负责自然语言理解和规则触发。这个模式极具推广价值:退款政策、审批条件、排班规则这类企业里大量存在的确定性逻辑,交给规则库维护;模糊的语言理解和解释生成,交给智能体。两者各干各的擅长事。
用户描述症状(自然语言) │ ▼ 智能体抽取关键特征 │ ▼ 规则库匹配(确定性判断) │ ▼ 智能体把结论翻译成通俗解释
知识图谱查询属于同思路的升级版:结构化知识放图数据库,智能体生成查询、解读结果。共同原则是——别让概率模型背诵确定性知识,让它做语言与推理的接口层。
记时间维度:记忆存"发生过什么"(对话与状态),知识库存"参考资料"(文档检索),规则库存"必须遵守的逻辑"(确定性判断)。一个客服智能体三者全要:记得住老用户、查得到政策文档、算得准退款规则。
指令约束加异常自纠是性价比最高的组合。要更强保证,可以按固定模式分两步走:先让模型自由回答,再用第二个便宜模型把回答转成结构化数据——生成与格式化分离,各自成功率都更高。
先知识库(提升回答正确性),再记忆(提升连续性),最后团队(提升复杂任务承载力)。顺序反过来容易在还没站稳时就背上调试复杂度。
高级功能越多,越需要一套廉价的回归手段。做法朴素:挑十个有代表性的真实问题(覆盖记忆两轮追问、结构化输出、规则触发各几条),连同期望要点一起存成清单。每次改配置——换模型、调指令、加记忆窗口——就把清单跑一遍,逐条对照要点是否仍然满足。
这套最小评估集的成本是半小时搭建,收益是每次改动的心安。更妙的是它会随时间增值:线上出的每个坏案例,补录进清单,评估集就从十题长成百题,系统的行为边界被越描越清。等到第 3 章讲性能优化与 RAG 调优时,这份资产直接复用为基线测量工具。
把本节的三项能力串成一个闭环小系统,是对"高级"二字最好的注解。设想一个个人健康助手:记忆机制记住用户的身高体重、饮食历史与健身目标;结构化输出让每日三餐的识别结果以固定字段入库(餐名、热量估计、时间);规则库负责硬约束——热量超标连续三天就触发提醒,指标异常直接建议就医。三个组件各挡一面,缺一角系统就瘸:没记忆则每天从零开始,没结构化则数据无法累计,没规则则所有判断都在赌模型发挥。
这个小系统两三百行代码就能搭起来,却已经具备了生产级应用的骨架。更重要的是它演示了一个方法论:复杂系统不是"更难的智能体",而是"多种朴素机制的有机组合"。新手容易被"高级"吓住,其实高级感的来源是组合的秩序,不是单点的魔法。把每一项能力做扎实,再想清楚它们交换什么数据,系统自然就立起来了——这也是本教程第 4 章所有案例的共同底色。
补一个容易被忽略的实战细节:记忆与结构化输出联用时,注意"记忆污染"——上一轮的结构化输出(比如一大段 JSON)被完整存进历史,后续每轮请求都背着这段死重。解法是在写入记忆前做一次摘要或裁剪,只留业务字段不留原始格式。这个小处理能让长会话的 token 消耗差出数倍,是高级功能组合使用时最常见的账单刺客。
第 2 章的能力全部到手。第 3 章往上再走一步——多模态、RAG 进阶、协作机制与性能优化。