AI Agent 实战经验:从“会聊天”到“可控项目落地”
本文总结当前项目已经验证的工程实践。示例身份、商户、地址、电话、接口和密钥均为虚构值或占位符。1. 项目要解决的不是问答而是受控业务执行一个业务 Agent 同时面对四类问题理解问题自然语言模糊、口语化还会省略上下文。执行问题查询、下单、修改资料、更新状态等操作权限不同。安全问题Prompt Injection、密钥套取、越权调用和误操作不能交给模型自由裁决。体验问题拒绝、澄清、待确认和执行结果必须让用户知道下一步做什么。因此本项目没有采用“用户输入直接交给 LLMLLM 自由调用全部工具”的结构而是把 Agent 设计为确定性边界 模型语义能力 受控工具执行 结构化恢复。用户输入 → BoundaryGuard注入、密钥、业务范围检查 → ChatScenePolicy角色场景三态判断 → 可信会话状态承接选择、确认和待处理动作 → LangChain ChatModel语义识别、澄清、自然语言生成 → ToolRouter工具存在性、角色权限、参数边界 → 本地服务 / SQLite / 外部受控接口 → ChatResponse Guidance结果与可恢复提示核心经验是LLM 负责不确定的语言理解程序负责不能出错的边界与状态迁移。2. 安全 Guard 必须在 LLM 之前2.1 为什么不能只靠 System PromptSystem Prompt 是模型上下文不是权限系统。只写“不要泄露密钥、不要越权”仍存在恶意输入会进入模型和供应商请求日志模型可能忽略约束或被复杂指令诱导不同模型、版本、温度下行为不稳定工具调用一旦执行事后文本纠正没有意义。项目用BoundaryGuard.classify_message()在模型调用前识别注入和密钥套取命中后直接构造阻断响应确保llm_used falsetool_calls []原始敏感输入不回显到 Guidance不把危险内容发送给模型供应商。2.2 工具权限必须在执行点再次校验预检查不能替代执行点授权。无论工具来自规则路由、模型 Tool Calling 还是 LangChain wrapper都统一经过awaittool_router.invoke(tool_name,arguments,rolecurrent_role)ToolRouter再调用BoundaryGuard.can_call_tool()避免 wrapper、模型或新业务分支绕过权限。这个“单一执行闸门”比在每个调用方复制if role ...更易审计也更不容易漏改。3. LangChain 是适配层不应吞掉领域边界本项目把模型调用放在 ChatModel 兼容接口之后把领域工具封装成 LangChain 工具但 wrapper 仍调用ToolRouter.invoke()。这样做的收益可替换 OpenAI-compatible、Anthropic 或 Mock 模型Prompt、Message、Tool Schema 和输出解析接口统一测试可以替换模型而不改业务代码安全授权、数据库事务和业务状态仍由领域层掌握。需要避免的反模式是为了“全 LangChain 化”让 Chain/Agent 直接写数据库或直调外部接口。框架负责编排领域服务负责事实与副作用。4. 业务路由要组合确定性规则、LLM 与三态判断4.1 不要在“全正则”和“全模型”之间二选一全正则可解释但同义表达覆盖成本很高全模型灵活但会受模型波动、网络失败和提示词变化影响涉及订单状态、联系人修改、目标选择等关键流程时误判成本高。本项目采用组合策略注入、权限、订单状态机、序号选择和确认提交确定性代码开放表达的业务意图和参数抽取LLM 优先模型不可用或输出不合法规则回退角色场景判断match / mismatch / unknown三态。4.2unknown比“猜一个分类”更重要如果所有输入都必须二分类短句“可以”“第一个”“这个呢”很容易被错拦截。三态策略允许明确匹配继续明确跨场景返回场景提醒信息不足进入已有上下文或澄清流程。只拦截高置信不匹配比追求表面分类准确率更符合业务 Agent 的风险目标。5. 多轮对话的关键是“可信状态”不是无限聊天记录5.1 短回复必须绑定服务端待处理状态“确认修改”“第二个”“可以”本身没有完整语义。项目通过服务端上下文保存候选商品/商户/用户已选择对象待确认动作待处理订单上次业务来源和过期时间。只有存在匹配的可信 pending context短回复才承接原流程。不能仅让 LLM 根据历史文本猜测否则用户切换话题后可能确认错误操作。5.2 会话隔离维度必须包含业务身份前端和后端上下文至少按以下维度隔离role user_id merchant_id当前场景与角色一一对应若未来一个角色支持多个独立场景应加入scene。只按user_id保存历史会导致消费者、商户、运营和管理员上下文串线尤其会污染权限和待确认动作。5.3 上下文要有 TTL 和显式失效候选、选择和待确认状态不应永久存在。实践中应在以下时机清理操作成功或取消用户明确切换业务用户、角色或商户变化TTL 到期目标实体失效。6. 写操作采用 Preview → Confirm → Commit联系人修改、商品导入、订单状态更新和创建配送等操作都不应因一句模糊自然语言直接提交。推荐流程Preview解析目标、字段、原值、新值及影响Confirm用户明确确认且会话状态仍有效Commit执行工具记录结果或审计Idempotency重复确认不重复产生副作用。重要细节用于展示的 Guidance 建议可以回填输入框但不能自动发送。否则“帮助用户恢复”会变成自动执行写操作。7. 把失败设计成结构化 Guidance仅返回一段“无法处理”会让前端无法区分注入阻断、权限不足、参数缺失、场景错误或模型不可用。项目在ChatResponse中使用结构化 Guidance常见字段包括type失败或提醒类型reason原因required_content还需补充什么examples/suggestions示例表达input允许回显时的脱敏、截断原输入scene/role当前上下文。前端可以统一渲染提醒卡片、可回填操作和“你的输入”。安全类异常则不回显原始危险内容。这说明 Agent API 的成功标准不是只有reply而是前端能否根据稳定契约帮助用户安全恢复。8. 模型输出和密钥要按不可信数据处理8.1 模型说“调用工具”不等于可以执行工具调用需要依次校验输出是否符合预期 JSON/Tool Call schema工具名是否在允许集合当前角色是否可调用参数是否完整、类型正确用户身份和商户目标是否由服务端上下文约束写操作是否已确认结果是否包含敏感数据。8.2 密钥不仅不能落库也不能进入模型请求和响应应同时防守配置文件只保留${LLM_API_KEY}等环境变量引用日志Authorization、Bearer、Token、Password 和常见 Key 形态脱敏模型请求用户输入含密钥时调用前阻断模型响应供应商异常回显密钥时丢弃或替换前端 Guidance安全异常不回显原输入。测试中的sk-test-*可以作为不可用假值验证拦截链路但必须与运行配置隔离。9. 测试重点应是业务不变量Agent 的测试不能只断言回复文案因为模型措辞会变化。优先断言是否调用 LLM调用了哪些工具及参数未授权工具是否被拒绝Guard 是否早于 LLM写操作确认前数据库是否保持不变重复确认是否幂等角色/用户/商户上下文是否隔离模型失败时是否规则回退响应是否具有稳定intent、blocked、guidance密钥是否未进入模型 payload、reply、日志或 Guidance。建议采用三层测试单元测试Guard、状态机、参数解析、脱敏函数契约测试ToolRouter、ChatModel adapter、结构化响应端到端测试FastAPI SQLite Mock LLM 的代表性多轮流程。Mock LLM 应覆盖正常 JSON、无效 JSON、异常、超时、虚构工具、敏感内容回显和模糊分类而不仅是 happy path。10. 本项目踩过或需要持续规避的问题10.1 业务关键词误伤待确认值联系人姓名、电话号码等值可能不含业务关键词。若每轮都重新做范围判断会把合法 pending value 当成越界输入。解决办法是可信待处理上下文优先于普通语义分类但不能优先于注入和密钥 Guard。10.2 目录“第 N 个”和商品“第 N 个”上下文冲突序号没有天然类型必须绑定候选来源、角色、商户和 session不能维护一个全局recent_items。10.3 同一领域存在两套订单模型模拟订单与 Commerce 订单若分别查询会让用户认为订单丢失。统一可见性层应明确来源、状态映射和可执行动作而不是简单拼接两段文案。10.4 配置热更新不等于所有依赖自动更新配置保存后需要明确哪些组件读快照、哪些按请求读取模型 client 是否重建旧请求如何完成。否则 UI 显示已更新实际运行仍使用旧值。10.5latest依赖破坏可复现构建前端依赖若使用latest可能突然要求更高 Node 版本。项目交付应固定依赖版本并声明engines.node把运行时版本纳入 CI。10.6 SQLite 文件也是敏感资产运行后的 SQLite 仍可能保存聊天上下文、订单、地址、电话、客户 JSON、审计和用户记忆。公开前不能只 grep 文本还要删除或按脱敏种子重建数据库。11. 推荐的上线前检查表安全Guard 在任何模型调用之前执行所有工具统一经过 ToolRouter 授权写操作具有预览、确认和幂等保护密钥不进入模型 payload、日志、响应和 Guidance外部 URL、超时、重试和速率限制受配置控制。上下文与身份session 按场景、角色、用户、商户隔离pending context 有 TTL、来源和目标类型客户端传入身份由服务端目录/关系校验切换角色或目标时不会继承危险状态。可观测性记录 intent、tool、耗时、结果类型和 request/session 标识日志字段级脱敏可区分规则命中、LLM 路由、fallback 和权限拒绝不记录原始 Authorization 或完整用户敏感输入。质量与交付使用 Mock LLM 的测试不依赖真实网络和密钥全量测试及关键角色矩阵通过Python、Node、依赖版本固定并在 CI 验证.env.example、配置、文档、数据库和示例数据完成脱敏扫描第三方源码与许可证不被批量改写。12. 结论一个可靠的业务 AI Agent不是把更多逻辑塞进 Prompt而是把不同风险放到正确层次Guard 管安全边界场景策略管明显错位可信状态管多轮承接LLM 管开放语义ToolRouter 管执行权限领域服务管事务与事实Guidance 管用户恢复测试管长期不变量。当模型不可用、理解错误或遭遇恶意输入时系统仍能保持权限正确、数据一致、行为可解释才算真正完成了从聊天机器人到业务 Agent 的工程化跨越。

相关新闻

D3.js与React构建交互式网络图:斯坦利杯冠军可视化实践

D3.js与React构建交互式网络图:斯坦利杯冠军可视化实践

交互式网络图:可视化历届斯坦利杯冠军球队关系在体育数据分析领域,如何直观展示球队之间的历史关联一直是个挑战。特别是对于像斯坦利杯这样拥有百年历史的冰球赛事,传统的数据表格很难清晰呈现球队间的复杂关系。本文将介绍如何使用现代Web技…

2026/7/24 19:22:47 阅读更多 →
GTA3移动版防弹防火防爆Cheetah隐藏车获取与防杀后台保存指南

GTA3移动版防弹防火防爆Cheetah隐藏车获取与防杀后台保存指南

很多GTA3老玩家都遇到过这样的困扰:在移动端好不容易找到了传说中的防弹防火防爆Cheetah隐藏车,却因为游戏杀后台导致进度丢失。本文将分享一套专为移动端优化的隐藏车获取与保存方案,从基础定位到高级防杀技巧,帮助你在手机上稳定…

2026/7/24 19:22:47 阅读更多 →
5分钟视频转PPT完整指南:让会议记录和课件制作效率翻倍

5分钟视频转PPT完整指南:让会议记录和课件制作效率翻倍

5分钟视频转PPT完整指南:让会议记录和课件制作效率翻倍 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 还在为视频中的PPT内容整理而头疼吗?extract-video-pp…

2026/7/24 19:21:47 阅读更多 →

最新新闻

Kimi    LeetCode 3681. 子序列最大 XOR 值 Java实现

Kimi LeetCode 3681. 子序列最大 XOR 值 Java实现

LeetCode 3681. 子序列最大 XOR 值 — Java 实现核心思路这道题的关键在于一个巧妙的转化:题目要求选择两个允许重叠的子序列,设它们的 XOR 分别为 X 和 Y,求 X XOR Y 的最大值。对于每个元素 nums[i],它在 X XOR Y 中的贡献取决于…

2026/7/24 19:27:48 阅读更多 →
如何高效实现抖音无水印视频批量下载:开源自动化工具的完整指南

如何高效实现抖音无水印视频批量下载:开源自动化工具的完整指南

如何高效实现抖音无水印视频批量下载:开源自动化工具的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…

2026/7/24 19:27:48 阅读更多 →
Qwen3.5混合注意力架构与本地部署优化解析

Qwen3.5混合注意力架构与本地部署优化解析

1. Qwen3.5模型架构全景解析 Qwen3.5作为当前最受关注的多模态大模型之一,其架构设计在Transformer基础上进行了多项创新性改进。模型核心采用Gated DeltaNet(线性注意力)与Gated Attention(全注意力)的混合架构&#…

2026/7/24 19:27:48 阅读更多 →
Spring 事务保证数据一致性

Spring 事务保证数据一致性

Spring 事务保证数据一致性完整详解一、底层基础:数据库原生事务 ACIDSpring 本身不具备事务能力,只是对 JDBC 事务、JTA 分布式事务做高层封装与管理,真正原子性、隔离性由数据库 InnoDB 引擎实现。ACID 四大特性原子性 Atomic:一…

2026/7/24 19:27:48 阅读更多 →
Fluidstack百GW算力平台:从资源到商品的算力调度革命

Fluidstack百GW算力平台:从资源到商品的算力调度革命

上周,一条消息在技术圈和投资圈同时激起波澜:一家名为 Fluidstack 的公司宣布获得 8.3 亿美元融资,目标是部署“百 GW”级别的算力。这个数字,无论是融资额还是算力目标,都足以让任何一个关注技术基础设施的人停下来思…

2026/7/24 19:27:48 阅读更多 →
MSPM0 DMA控制器:从原理到实战,打造高性能嵌入式数据搬运系统

MSPM0 DMA控制器:从原理到实战,打造高性能嵌入式数据搬运系统

1. DMA控制器:嵌入式系统的“数据搬运工”与性能倍增器在嵌入式系统开发中,CPU常常被各种琐碎的数据搬运任务所拖累。想象一下,你的主控芯片就像一个忙碌的厨师,不仅要炒菜(执行核心算法),还要不…

2026/7/24 19:26:48 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻