当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"
十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"
这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?
如果不能,那它可能还只是一场精心设计的魔术表演。
🏷️ [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
当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"
十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"
这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?
如果不能,那它可能还只是一场精心设计的魔术表演。
本文梳理了相关技术/事件的核心脉络。如有错误欢迎在评论区指正。
📂 分类:[LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]
© 本文由彩虹洋葱 AI 自动聚合,转载请注明出处。
当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"
十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"
这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?
如果不能,那它可能还只是一场精心设计的魔术表演。
以上为当前进展的梳理。欢迎在评论区交流技术细节和不同观点。
🏷️ 标签:[LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]
👍 如果对你有帮助,请点赞收藏支持
当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"
十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"
这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"
十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"
这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?
如果不能,那它可能还只是一场精心设计的魔术表演。
📌 来源:Dev.to | 标签:[LLM] · [AI · 工程] · [Agent] · [RAG] · [生产环境]
本文由彩虹洋葱 AI 自动聚合生成,仅供参考,不构成任何投资或决策建议。当所有人都在炫耀聊天窗口里的惊艳回答时,真正的战场早已转移到那些无人喝彩的角落——工具调用、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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 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 需要调用……
├ [结尾] 总结 + 求三连关注
【弹幕互动引导】
🏷️ 标签:[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 · 科技感电子背景乐 · 关键数据配文字弹幕 · 表情自然语速适中
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"——从"模型能回答"到"系统能交付",中间隔着的不是一段代码的距离,而是一个全新的工程领域。
让我们从最基础的"工具调用"开始。现代 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(检索增强生成)。几乎所有 AI 创业公司的 PPT 里都会出现 RAG 架构图,但实际把 RAG 跑通到生产环境的团队,都知道这背后有多少坑。
作者在文章中提到的核心问题之一,是 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 工具链中巨大的空白——不是模型能力不够,而是工程基础设施远远落后于模型能力的膨胀。
综合作者的观点,以及当前 AI 工程领域的最佳实践,我们可以提炼出三个核心教训:
第一,Agent 的可靠性不是靠提示工程,而是靠系统架构。 提示工程可以提升模型的"平均表现",但生产环境需要的是"最差情况下的表现"。这需要通过验证层、重试机制、降级策略等系统手段来保证。 第二,评估不是可选项,而是基础设施。 每个 Agent 上线前必须有一套自动化的评估流水线,覆盖正常路径、边界条件和失败场景。没有评估的 Agent 就像没有测试的微服务——迟早会在生产环境爆炸。 第三,成本控制是 Agent 生产的核心竞争力。 一个在生产环境运行的 Agent,其成本不仅仅是 API 调用费,还包括错误重试、人工介入、合规审查等一系列隐性成本。当所有人都在谈论 Agent 的"智能"时,真正的工程师在谈论 Agent 的"可靠性"。这让我想起 2010 年代移动互联网浪潮中那句经典的话:"人们以为我们在做 App,其实我们在做分布式系统。"
十年后,这句话可能会被改写为:"人们以为我们在做 AI 应用,其实我们在做带有概率内核的分布式系统。"
这就是为什么这位工程师的"10 years in the trenches"如此有价值。他见过太多 AI Demo 的死亡方式——不是因为模型不够聪明,而是因为系统不够健壮。所以,当你下次看到一个令人惊艳的 AI Agent Demo 时,不妨问自己一个问题:这个系统能经受住 10 万次真实调用的考验吗?
如果不能,那它可能还只是一场精心设计的魔术表演。
从 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站 | 📋 手动复制 | |
| 抖音 | 📋 手动复制 | |
| 百家号 | 🔑 待配置密钥 | |
| 小红书 | 📋 手动复制 |