Agent 产品化的项目复盘:从技术 Demo 到可交付产品的十个关键决策
Agent 产品化的项目复盘从技术 Demo 到可交付产品的十个关键决策一、引言做技术的人容易陷入一个误区把 Demo 跑通就当成了项目完成。去年参与过一个 Agent 产品的完整交付周期让我深刻认识到从一段能跑的 Python 脚本到客户愿意付费的产品中间隔着的不是代码量而是十个需要反复权衡的工程决策。这篇文章是对那个项目的复盘不谈算法创新只谈落地过程中的真实取舍。项目背景不算复杂为一家中型企业的客服部门构建一个智能工单分派 Agent。它需要理解用户意图、匹配历史相似工单、推荐处理方案给人工坐席。技术栈上我们用 LangChain 做 Agent 编排FastAPI 做服务层前端一个轻量 Vue3 面板做坐席交互。听起来很标准的 LLM 应用但真正扎进去才发现Demo 和产品的差异不在模型能力上而在工程基础设施。下面按照决策的先后顺序逐一复盘。二、十个关键决策的复盘决策一Agent 架构选型——ReAct 还是 Plan-and-ExecuteDemo 阶段用 ReAct 模式跑得很流畅推理-行动循环能处理大多数单步查询。但上了真实业务数据后问题暴露了一个工单分派可能需要查客户历史记录、查产品知识库、查 SLA 规则、生成推荐——这四步如果在单一 ReAct 循环里串行延迟直接飙到 15 秒以上。最终选了 Plan-and-Execute ReAct 的混合模式先用一个轻量模型做计划分解把复杂任务拆成子任务列表再用 ReAct 执行每个子任务中间结果通过共享上下文传递。# 计划生成阶段的 Prompt 模板 PLAN_PROMPT 你是一个工单分派计划生成器。给定以下工单信息请将处理流程分解为步骤列表。 每个步骤必须包含步骤名称、所需工具、预期输出。 工单内容{ticket_content} 客户历史{customer_context} 请严格按 JSON 格式输出 [ {step: 意图识别, tool: intent_classifier, output: intent_label}, {step: 历史匹配, tool: similarity_search, output: top5_tickets}, ... ] 这个决策的核心收益不是准确率提升而是可观测性。计划步骤拆开后每一步的延迟、成功率、异常都可以独立监控出问题时能快速定位到具体阶段。决策二Prompt 管理——代码内嵌还是配置化Demo 时所有 Prompt 硬编码在代码里改一个字就要重新部署。产品化后 Prompt 迭代频率远超代码变更频率而且不同客户可能有不同的 Prompt 变体。方案是建一个 Prompt 管理中心用 YAML 文件管理 Prompt 模板支持变量注入和版本控制。# prompts/ticket_assignment/v2.1.yaml version: 2.1 system: | 你是一个{domain}领域的工单分派助手。 当前角色{agent_role} 处理规则 {rules} **重要**如果置信度低于0.6需要标记为需人工确认。 user_template: | 工单ID{ticket_id} 客户等级{customer_level} 问题描述{description} 请完成以下步骤 1. 识别问题类别 2. 匹配历史相似工单至少3条 3. 推荐处理方案配合一个简单的 Python 加载器import yaml from pathlib import Path from string import Template class PromptLoader: def __init__(self, base_path: str prompts): self.base Path(base_path) self._cache {} def load(self, name: str, version: str latest) - dict: cache_key f{name}:{version} if cache_key not in self._cache: file_path self.base / name / f{version}.yaml if not file_path.exists(): raise FileNotFoundError(fPrompt {name}:{version} not found) with open(file_path) as f: self._cache[cache_key] yaml.safe_load(f) return self._cache[cache_key] def render(self, name: str, variables: dict, version: str latest) - tuple[str, str]: prompt self.load(name, version) system Template(prompt[system]).safe_substitute(variables) user Template(prompt[user_template]).safe_substitute(variables) return system, user决策三工具调用的可靠性保障Agent 的灵魂是工具调用但也是出错最多的地方。知识库检索接口偶尔超时、数据库连接池耗尽、第三方 API 限流——这些在 Demo 阶段一个 try-catch 就能兜底但产品里必须建立系统性的容错机制。核心策略三板斧超时控制 重试退避 降级兜底。import asyncio from typing import Optional, Callable, Any from functools import wraps class ToolExecutor: def __init__( self, timeout: float 10.0, max_retries: int 2, base_delay: float 1.0 ): self.timeout timeout self.max_retries max_retries self.base_delay base_delay async def execute( self, tool_fn: Callable, args: tuple (), kwargs: dict None, fallback: Any None ) - dict: kwargs kwargs or {} last_error None for attempt in range(self.max_retries 1): try: result await asyncio.wait_for( tool_fn(*args, **kwargs), timeoutself.timeout ) return {status: success, data: result, attempts: attempt 1} except asyncio.TimeoutError: last_error timeout except Exception as e: last_error str(e) if attempt self.max_retries: delay self.base_delay * (2 ** attempt) await asyncio.sleep(delay) return { status: fallback, data: fallback, error: last_error, attempts: self.max_retries 1 }决策四上下文窗口管理Agent 对话越长上下文窗口消耗越大不仅成本上升推理质量也会下降。真实场景中一个工单处理可能涉及 10 轮以上的交互。采用滑动窗口 摘要压缩策略保留最近 5 轮完整对话更早的交互自动压缩为摘要关键信息客户ID、工单号、分类结果进入结构化状态from dataclasses import dataclass, field from typing import List dataclass class ConversationState: ticket_id: str customer_id: str intent: str unknown confidence: float 0.0 resolved_step_ids: List[str] field(default_factorylist) key_findings: List[str] field(default_factorylist) class ContextManager: MAX_RECENT_TURNS 5 def __init__(self, summarizer): self.summarizer summarizer self.state ConversationState() self.history [] async def add_turn(self, role: str, content: str) - None: self.history.append({role: role, content: content}) if len(self.history) self.MAX_RECENT_TURNS * 2: old_turns self.history[:-self.MAX_RECENT_TURNS * 2] summary await self.summarizer.summarize(old_turns) self.history [{role: system, content: f历史摘要{summary}}] \ self.history[-self.MAX_RECENT_TURNS * 2:] def build_context(self) - List[dict]: state_desc f当前状态{self.state.__dict__} return [ {role: system, content: state_desc}, *self.history ]决策五评估体系Demo 阶段靠感觉判断 Agent 好不好用产品化后必须有量化指标。建立了三层评估体系工具级每次工具调用的成功率、P50/P95 延迟任务级工单分类准确率、方案推荐命中率业务级人工坐席采纳率、处理时长缩减比例每一层对应不同的告警阈值和优化策略。决策六到十简表考虑到篇幅剩余五个决策以要点形式复盘决策核心问题最终方案关键教训六、多租户隔离不同客户的数据和配置隔离数据库级隔离 Prompt 模板级别隔离不要试图用代码逻辑区分租户七、流式响应长任务必须有进度反馈SSE 推送步骤进度前端状态机驱动WebSocket 太重SSE 够用且运维简单八、成本控制LLM API 费用增长不可控分级模型策略规划用小模型、执行用大模型90% 的任务可以用小模型处理九、权限与安全Agent 可以执行哪些操作白名单机制工具调用前校验权限范围永远不要给 Agent 写数据库的权限十、部署与运维如何做到零停机更新蓝绿部署 Prompt 热加载Prompt 变更不需要重启服务三、架构总览整个系统的最终架构如下四、关键踩坑记录坑一ReAct 的幻觉循环。早期版本里 Agent 有时会陷入调用工具→得到空结果→再次调用同一工具的死循环。解法是加最大步数限制和一个简单的去重检测——连续两次相同工具调用直接中断返回兜底方案。坑二Prompt 版本管理混乱。多人协作时经常发生 A 改了 Prompt、B 不知道、线上出现不一致。后来强制要求所有 Prompt 变更走 PR 流程并且部署脚本自动比对线上版本与仓库版本的差异。坑三成本失控的恐慌。上线第一周GPT-4 API 费用超出预期 3 倍。排查后发现是某些边缘 Case 触发了过长的 Agent 推理链。通过加 Token 消耗预算上限和模型降级策略成本回归到可控范围。五、结语从 Demo 到产品的路本质上是在可靠性、成本、体验三者之间找平衡。技术方案没有绝对的对错关键在于在特定场景和资源约束下做出合适的取舍。十个决策复盘下来最核心的一点是越早建立可观测性和评估体系越能避免凭感觉做决策。数据会告诉你哪里该投入、哪里可以妥协。Agent 产品化不是技术的终点而是工程化的起点——这一课写在这个项目的每一个深夜调试和每一次线上事故里。本文基于真实项目经验撰写技术栈版本Python 3.12 / FastAPI 0.110 / LangChain 0.1 / Vue 3.4

相关新闻

提示词微调无效?你缺的不是经验,而是这8项可量化的对比分析维度

提示词微调无效?你缺的不是经验,而是这8项可量化的对比分析维度

更多请点击: https://intelliparadigm.com 第一章:提示词微调失效的典型表征与归因误区 当提示词微调(Prompt Tuning)在实际部署中表现异常时,工程师常误将现象归因于模型容量不足或训练步数不够,而忽视更…

2026/10/19 11:31:13 阅读更多 →
云原生 AI 推理服务的性能优化:从 GPU 利用率到请求调度的全链路调优实录

云原生 AI 推理服务的性能优化:从 GPU 利用率到请求调度的全链路调优实录

云原生 AI 推理服务的性能优化:从 GPU 利用率到请求调度的全链路调优实录GPU 利用率 95% 但 P99 延迟 8 秒——利用率高不等于吞吐高。推理服务的优化不是压榨 GPU,而是让每一帧 GPU 计算都服务于一个真实的用户请求。一、场景痛点:GPU 利用率…

2026/10/18 7:00:25 阅读更多 →
模型推理的推理引擎切换:vLLM、TGI 与 TensorRT-LLM 对比

模型推理的推理引擎切换:vLLM、TGI 与 TensorRT-LLM 对比

模型推理的推理引擎切换:vLLM、TGI 与 TensorRT-LLM 对比选推理引擎不是选最快的那个,而是选最契合你业务模式的那个。一、场景痛点 你的团队选了一个开源 LLM 做在线推理服务,第一版用 HuggingFace Transformers 直接跑——延迟 2 秒&#x…

2026/10/18 7:00:30 阅读更多 →

最新新闻

JMeter压测Kafka:手写Java脚本攻克SASL认证难题

JMeter压测Kafka:手写Java脚本攻克SASL认证难题

这周接了一个压测需求,要给某个内部Kafka主题灌一批业务数据,规模大概几十万条,消费端开了SASL认证,而且不是常见的PLAINTEXT全局认证,只是针对特定用户做了SASL_PLAINTEXT。我第一个反应是找现成的JMeter Kafka插件&a…

2026/10/20 6:28:34 阅读更多 →
C++模板实现通用二叉搜索树:集合与映射二合一

C++模板实现通用二叉搜索树:集合与映射二合一

最近整理手头几个内部组件,发现凡是做索引、做去重、做有序集合,最后都绕不开同一棵树。本来想直接调库,但又需要一份不依赖外部框架的跨平台版本,于是把二叉搜索树从裸模板到支持 key-value 重新写了一遍。你要是有过类似经历&am…

2026/10/20 6:28:34 阅读更多 →
C++菱形继承二义性解析:虚继承原理与对象内存布局实战

C++菱形继承二义性解析:虚继承原理与对象内存布局实战

菱形继承是C里一张绕不开的考卷,也是面试官最爱用来检验候选人对对象模型理解深度的经典题型。我在第一次被问到“菱形继承为什么会二义性”时,还天真地以为是编译器“太笨”,直到自己动手写了一个菱形继承的Demo,看着那条报错信息…

2026/10/20 6:28:34 阅读更多 →
Delphi7集成Chromium渲染引擎实战指南

Delphi7集成Chromium渲染引擎实战指南

简介:本资源是目前最新版CEF4Delphi开源控件集成包,专为Delphi7及兼容版本开发者设计,用于在原生Delphi应用中无缝嵌入Chromium内核浏览器功能,解决传统WebBrowser组件功能弱、兼容性差、无法支持现代前端技术栈等痛点&#xff0c…

2026/10/20 6:28:34 阅读更多 →
CSES本地化算法训练:构建可验证的动态规划闭环

CSES本地化算法训练:构建可验证的动态规划闭环

简介:CSES Problem Set 是面向算法学习者与编程竞赛选手的 C 专项题解资源,覆盖基础语法、动态规划、图论、贪心、数论、位运算等核心算法模块,特别适合准备 ACM/ICPC、LeetCode 高频面试题及提升工程化编码能力的学习者。资源包为 ZIP 格式&…

2026/10/20 6:28:34 阅读更多 →
artcraft类创作工具技术架构与交互设计实战指南

artcraft类创作工具技术架构与交互设计实战指南

1. 从"artcraft"这个名字说起:一个被低估的创作工具定位问题第一次看到"artcraft"这个词,我脑子里蹦出来的第一反应是"艺术"加"手艺"的组合。这不是一个随便拼出来的名字,它暗示了一种很具体的产品气…

2026/10/20 6:27:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →