building-production-llm-agents-that-actually-ship-lessons-fr

2026年08月11日 | 来源:
信息源:

📋 多平台草稿预览 (12平台差异化改编)

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。


当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



写于彩虹洋葱 AI 聚合平台 · 如果你也对科技趋势感兴趣,欢迎交流。

🏷️ [LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]

快手短视频脚本 | 时长:30-40秒

【封面字幕】(大号字体,居中)

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

【口播文案】(接地气风格,口语化)

老铁们,今天聊个硬核的——当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

核心就三点:

① (从正文提取第一个关键信息)

② (从正文提取第二个关键信息)

③ (从正文提取第三个关键信息)

懂的点个赞,不懂的评论区问我,下条见!💪


🏷️ 推荐标签:[LLM], [AI, 工程], [Agent], [RAG], [生产环境]

【微博短帖 | 140字以内核心版】

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里":当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

#[LLM] #[AI #工程]


【微博长帖 | 可配图 9 宫格版】

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

#[LLM] #[AI #工程] 🔗 https://dev.to/topstar_ai/building-production-llm-agents-that-actually-ship-lessons-from-10-years-in-the-trenches-27cf

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

前言

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。


当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



总结

本文梳理了相关技术/事件的核心脉络。如有错误欢迎在评论区指正。


📂 分类:[LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]

© 本文由彩虹洋葱 AI 自动聚合,转载请注明出处。

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



总结 & 思考

以上为当前进展的梳理。欢迎在评论区交流技术细节和不同观点。


🏷️ 标签:[LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]

👍 如果对你有帮助,请点赞收藏支持

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



信息源:Building Production LLM Agents That Actually Ship: Lessons from 10+ Years in the Trenches 标签:[LLM], [AI, 工程], [Agent], [RAG], [生产环境]

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

摘要:> 当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的……


当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



📌 来源:Dev.to | 标签:[LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]

本文由彩虹洋葱 AI 自动聚合生成,仅供参考,不构成任何投资或决策建议。

问题:如何看待「从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"」?

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。


当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



总结: 以上分析基于公开信息整理。核心在于理解这一事件/技术背后的驱动力,而非停留在表面叙事。欢迎在评论区交流你的看法。

📎 参考来源:Building Production LLM Agents That Actually Ship: Lessons from 10+ Years in the Trenches

🔗 原文链接:https://dev.to/topstar_ai/building-production-llm-agents-that-actually-ship-lessons-from-10-years-in-the-trenches-27cf

📺 B站视频脚本 | 时长:3-5分钟

【片头 0:00-0:15】BGM起 → 标题字幕弹出

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

【引子 0:15-0:45】制造悬念

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

【时间轴分镜】

├ [00:02] > 当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆……

├ [02:04] "大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推……

├ [04:06] 这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Shi……

├ [06:08] 如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充……

├ [08:10] 想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用……

├ [结尾] 总结 + 求三连关注

【弹幕互动引导】

  • "觉得有用的扣 1"
  • "不同观点的弹幕见"
  • 结尾设置投票:你看好这个方向吗?A.看好 B.观望 C.不看好

🏷️ 标签:[LLM], [AI, 工程], [Agent], [RAG], [生产环境]

🎬 抖音口播脚本 | 时长:45-60秒

【0-5秒 黄金Hook】

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

【5-35秒 核心信息(口语化表达,每句一行)】

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。 "大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的

【35-50秒 深度扩展】

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

【50-60秒 强CTO结尾】

觉得有用的话,双击点赞 + 关注,下期继续带你读懂 AI!🔥


📐 拍摄建议:竖屏 9:16 · 科技感电子背景乐 · 关键数据配文字弹幕 · 表情自然语速适中

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里"

【导语】 当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。
本文目录:

1. 聊天窗口的幻象与生产环境的残酷

2. Tool-Calling Agent:看似简单,实则陷阱重重

3. RAG 管道的"最后一公里"问题

4. 自动化堆栈:从"能跑"到"能交付"

5. 回到本质:Agent 生产化的三个关键教训


当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?

聊天窗口的幻象与生产环境的残酷

如果你只见过 ChatGPT 或 Claude 的网页界面,你可能会认为 AI Agent 已经足够成熟。但现实是,网页聊天窗口是一个精心设计的"温室"——有充足的历史上下文、有用户即时的反馈修正、甚至模型出错时你还能手动重试。

而生产环境呢?那是真正的"荒野求生"。

想象一下你的 Agent 需要完成一个真实的业务任务:比如根据用户的邮件自动生成一份完整的采购订单,然后推送给 ERP 系统。在这个过程中,Agent 需要调用至少三个不同的 API、处理格式不一致的返回值、在某个接口超时后做出决策、还要在最终结果出错时能够优雅地回滚。这还不包括那些"意外情况"——比如用户发来的邮件里包含了一个 PDF 附件,而你的解析器恰好不支持那个版本的 PDF 格式。

这就是作者所说的"gap nobody talks about"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。

Tool-Calling Agent:看似简单,实则陷阱重重

让我们从最基础的"工具调用"开始。现代 LLM 支持 function calling 已经不是什么新鲜事,但真正在生产环境中大规模使用 tool-calling agent 的团队,几乎都经历过类似的"翻车"时刻。

# 一个看似简单的 tool-calling 实现
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "create_purchase_order",
            "description": "根据商品信息和供应商创建采购订单",
            "parameters": {
                "type": "object",
                "properties": {
                    "supplier_id": {"type": "string"},
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {"type": "string"},
   
<p align="center"><img src="https://images.unsplash.com/photo-1555664424-778a1e5e1b48?w=1080&auto=format&fit=max&q=80" alt="" style="max-width:100%;border-radius:8px;" loading="lazy"></p>
                             "quantity": {"type": "integer"}
                            }
                        }
                    }
                },
                "required": ["supplier_id", "items"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "为供应商 S-123 创建一份包含 5 个 SKU-A001 和 3 个 SKU-B002 的采购订单"}],
    tools=tools
)

# 问题来了:模型返回的 JSON 参数可能不完整
tool_calls = response.choices[0].message.tool_calls
print(tool_calls[0].function.arguments)
# 有时会输出:{"supplier_id": "S-123", "items": [{"sku": "SKU-A001", "quantity": 5}]}
# 但有时会漏掉 items,或者把 supplier_id 拼错

这个例子里最大的问题不是模型"不会"调用工具,而是模型在压力下(长上下文、复杂指令、多轮对话)会"忘记"或"扭曲"工具参数。生产环境下的 tool-calling 需要一整套验证、纠错和回退机制,而这往往是团队最容易忽视的部分。

作者在文章中强调了一个关键教训:永远不要信任模型输出的参数格式,即使它遵循了 JSON Schema。因为模型可能会生成一个技术上有效、但业务上完全无意义的参数组合——比如数量为负数,或者供应商 ID 不存在于你的系统中。

# 生产环境需要的是这样的防御性代码
def safe_create_purchase_order(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
    except json.JSONDecodeError:
        return {"error": "invalid_json", "retry": True}
    
    # 业务逻辑验证
    if args.get("quantity", 0) <= 0:
        return {"error": "invalid_quantity", "retry": True}
    
    if not validate_supplier(args.get("supplier_id")):
        return {"error": "unknown_supplier", "retry": True}
    
    # 真正的执行
    return execute_order(args)

RAG 管道的"最后一公里"问题

另一个被过度神化的概念是 RAG(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。

文档解析 PDF/Word/HTML 清洗与分块 语义边界/重叠 向量化 Embedding 模型 向量数据库 Pinecone/Qdrant/Weaviate 用户查询 Query Understanding 检索与重排 Hybrid Search + Rerank LLM 生成 带引用的回答 红色虚线:常见失败点 | 箭头方向:数据流 常见失败点 解析失败/分块错误

作者在文章中提到的核心问题之一,是 RAG 管道的"最后一公里"问题。很多团队花大力气搭建了文档解析、向量化、检索的完整流程,却在最后一步——把检索结果喂给 LLM 生成回答——时发现效果远不如预期。原因往往是:

1. 检索到的内容与用户问题在语义上相关,但在信息完整性上不匹配——比如用户问的是一个流程的完整步骤,而检索到的内容只覆盖了其中一部分。

2. 多文档之间的信息冲突——当知识库中存在相互矛盾的内容时,模型会表现出"选择困难症",甚至给出模棱两可的回答。

3. 引用格式的混乱——生产环境的 RAG 系统必须能够精确指出回答中的每一句话来自哪个文档的哪个部分,否则法务部门会找上门来。

自动化堆栈:从"能跑"到"能交付"

真正让作者"十年磨一剑"的核心洞察,是他对自动化堆栈的理解。在 AI Agent 领域,代码不是最难的部分,最难的是围绕 Agent 构建的一整套基础设施——监控、日志、评估、回滚、A/B 测试、成本控制。

作者在文中提到了一个观点,我认为值得所有 AI 工程师刻在工位上:

"Your LLM agent is not a model. It's a distributed system with a probabilistic core."

这句话的翻译是:你的 LLM Agent 不是一个模型,而是一个带有概率内核的分布式系统。 这意味着,所有分布式系统需要的基础设施——可观测性、容错机制、优雅降级——你的 Agent 都需要,而且因为概率内核的存在,这些需求只会更强烈。

# 生产级 Agent 需要的基础设施示例
class ProductionAgent:
    def __init__(self):
        self.tracer = setup_telemetry()  # 全链路追踪
        self.metrics = PrometheusMetrics()  # 性能监控
        self.eval_suite = EvaluationSuite()  # 离线评估
        self.cost_tracker = CostTracker()  # 成本控制
        
    async def run(self, task):
        with self.tracer.span("agent_task") as span:
            # 预算检查
            if not self.cost_tracker.can_afford(task):
                raise BudgetExceededError()
            
            # 带重试的模型调用
            for attempt in range(3):
                try:
                    result = await self._execute_with_fallback(task)
                    break
                except ModelTimeoutError:
                    span.set_status("retry", attempt)
                    continue
            
            # 结果验证
            if not self.eval_suite.validate(result):
                return self._graceful_degradation(task)
            
            return result

作者之所以现在"开放新项目",很可能是因为他看到了当前 AI Agent 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀

回到本质:Agent 生产化的三个关键教训

综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:

第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。

结语:AI 工程的"下半场"

当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"

十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"

这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?

如果不能,那它可能还只是一场精心设计的魔术表演。



关键词:[LLM], [AI, 工程], [Agent], [RAG], [生产环境] 声明:本文由彩虹洋葱 AI 智能聚合生成,仅供信息参考。

从 Demo 到生产环境:为什么你的 LLM Agent 总是死在"最后一公里" 🔥

当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。


当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、RAG 管道、以及那条把"AI 演示"变成"AI 生产系统"的荆棘之路。一位拥有 10 余年经验的工程师刚刚揭开了这道伤疤。

"大多数 AI 内容都在讲如何让模型在聊天窗口里给出好回答。但更困难、更不性感的问题是……"这句话像一根针,精准地扎进了每一个正在试图把 LLM Agent 推向生产环境的开发者心里。

这是来自 Dev.to 上一位资深工程师的呐喊。标题直截了当——Building Production LLM Agents That Actually Ship。在 AI 狂欢的 2025 年,当无数团队还沉浸在 GPT-4o 或 Claude 3.5 的惊艳 Demo 中无法自拔时,这位拥有十余年经验的工程师选择揭开那层所有人都知道、却几乎没人愿意谈论的遮羞布:生产环境的 LLM Agent 到底有多难搞?


📌 来源:Dev.to

#[LLM] #[AI #工程] #[Agent] #[RAG]

#科技资讯 #彩虹洋葱AI

🚀 多平台发布

点击「复制」获取平台专属文案,到各平台编辑器(App/网页)粘贴即可发布。
有密钥的 4 个平台(微信服务号 / 头条 / 百家号 / 微博)可自动发布,密钥填好后自动点亮。

平台状态操作
✍️ 简书📋 手动复制
快手📋 手动复制
🐦 微博🔑 待配置密钥
💻 CSDN📋 手动复制
⛏️ 掘金📋 手动复制
💬 公众号🔑 待配置密钥
📰 今日头条🔑 待配置密钥
🤔 知乎📋 手动复制
📺 B站📋 手动复制
🎵 抖音📋 手动复制
📝 百家号🔑 待配置密钥
📕 小红书📋 手动复制