news 2026/10/22 9:35:50

ReAct+Function Calling:AI智能体的推理执行范式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ReAct+Function Calling:AI智能体的推理执行范式

1. 这不是“调用API”,而是让AI真正理解“该什么时候、用什么工具、做什么事”

Function Calling + ReAct,这两个词最近在开发者群和AI技术社区里高频出现,但很多人一看到就下意识觉得是“又一个新API封装”或者“大模型加了个插件功能”。我带过几个团队落地真实业务场景,从电商客服自动填单、到内部IT工单智能分派,再到某高校实验室的科研数据预处理流水线,反复验证下来:这根本不是简单的函数调用增强,而是一次AI执行逻辑的范式迁移——它把“模型该不该动”“动哪一步”“动完怎么判断对错”这三件事,第一次真正交还给了AI自己。

举个最直白的例子:你让AI查“上海今天最高气温多少度”,旧方式是硬编码规则——只要看到“气温”“上海”“今天”,就触发天气API;但如果用户问的是“帮我查下昨天上海外滩附近那家叫‘云栖’的咖啡馆营业时间,顺便看看今天去会不会下雨”,旧方案要么直接崩,要么靠堆砌几十条if-else规则勉强应付。而Function Calling + ReAct组合,会让AI自己拆解:先定位“云栖咖啡馆”位置(调用地图POI接口),再查该地址昨日营业状态(调用商户API),最后结合地理位置查今日降水概率(调用天气API)——整个过程不是你写死的流程图,而是AI基于当前任务目标、已有信息、可用工具,实时推理出的最优动作序列。

这个组合之所以突然火起来,核心在于它解决了两个长期痛点:一是大模型“幻觉输出”的不可控性——ReAct框架强制要求AI每步操作前必须“思考(Reason)”,执行后必须“观察(Act)”真实结果,再决定下一步,杜绝了凭空编造;二是工程落地时“胶水代码”爆炸式增长——以前每个新业务需求都要重写一遍调用逻辑、错误重试、结果解析,现在只需注册工具函数,剩下的交给框架调度。我实测过,某内部知识库问答系统接入这套机制后,新增一个“查员工上月差旅报销进度”的功能,开发耗时从平均8人日压缩到1.5人日,且后续维护成本下降70%以上。如果你正在做AI应用开发、智能体(Agent)构建,或者需要让大模型真正嵌入业务流程而非只做“问答机器人”,那么Function Calling + ReAct不是可选项,而是绕不开的必经路径。

2. 核心设计逻辑:为什么必须是“ReAct”打底,而不是直接上Function Calling?

2.1 Function Calling单独用,就像给赛车装了涡轮却没配变速箱

很多初学者一上来就猛啃OpenAI的function_calling文档,以为只要把工具函数注册进去,AI就能自动调用。我见过太多项目卡在这一步:模型确实能识别出“需要查天气”,也成功触发了天气API,但返回JSON里字段名是temp_max,而模型在回复里硬生生写成max_temperature;或者API返回了404错误,模型却视而不见,继续往下编造“今天晴朗,适合出游”。问题出在哪?Function Calling本身只解决“调用”这一个动作,它不关心调用是否成功、结果是否可信、下一步该怎么走——它是个纯执行层,没有决策层。

这时候ReAct的价值就凸显出来了。ReAct(Reasoning + Acting)不是某个具体库,而是一种结构化推理范式,最早由普林斯顿团队提出,核心思想是把AI的每一步操作都显式拆解为三个原子环节:

  1. Thought(思考):当前已知什么?目标是什么?有哪些工具可用?哪个工具最可能推进目标?
  2. Action(动作):调用哪个工具?传入什么参数?
  3. Observation(观察):工具返回了什么?这个结果是否符合预期?有没有异常?

这三步必须严格按顺序循环,不能跳步。比如当天气API返回{"error": "location_not_found"}时,ReAct框架会强制让AI回到Thought阶段重新分析——是地名拼错了?还是需要先调用地理编码API转换坐标?而不是像传统方式那样,把错误响应当正常数据直接塞进最终回复。

提示:ReAct不是银弹。我在某金融风控项目中发现,当工具链超过5个、且存在强依赖关系(如必须先查客户资质,再查授信额度,最后查历史逾期)时,纯ReAct容易陷入“思考-失败-再思考”的死循环。解决方案是引入轻量级状态机,在Thought阶段增加“当前执行路径”上下文,这个细节后面实操部分会展开。

2.2 为什么ReAct比Chain-of-Thought(CoT)更适合工具调用场景?

有人会问:CoT不也是让AI一步步想吗?区别在哪?关键在反馈闭环。CoT是单向推理:“因为A,所以B,所以C,所以答案是D”,整个过程在模型内部完成,没有外部世界的真实校验。而ReAct的Observation环节,强制引入了真实世界的反馈信号——工具返回的结果就是现实世界的“判决书”。这带来两个质变:

  • 抗幻觉能力跃升:模型再也不能靠“我觉得应该是这样”来编造结果。当它说“查到上海今天最高温32℃”,这个结论必须锚定在天气API返回的temp_max: 32字段上,否则整个推理链就断裂。
  • 错误自愈能力出现:我记录过一个典型case:某医疗问答Bot需要查药品说明书。第一次调用药品数据库API时,因药品名“阿莫西林克拉维酸钾”太长被截断,返回空结果。ReAct框架捕获到Observation为空,触发Thought阶段重新生成更精确的查询关键词(如加上“片剂”“7:1”等规格信息),第二次调用即成功。这种基于真实反馈的迭代优化,是CoT完全不具备的。

2.3 工具注册不是“贴标签”,而是定义AI的认知边界

很多团队把工具注册理解成“给函数起个名字、写个描述”,这是巨大误区。工具描述(function description)的本质,是向AI声明“你的认知盲区在哪里,以及如何安全地跨越它”。我们在某制造业设备故障诊断系统中,对“查询设备维修手册”这个工具做了三层描述设计:

{ "name": "query_manual", "description": "根据设备唯一ID和故障代码,从内部知识库检索对应维修步骤。注意:仅支持已录入知识库的设备型号(列表见system_prompt),若设备ID格式错误或故障代码不存在,将返回'not_found',此时应建议用户核对设备铭牌。", "parameters": { "type": "object", "properties": { "device_id": { "type": "string", "description": "设备铭牌上的12位数字ID,必须全数字,无空格或字母" }, "fault_code": { "type": "string", "description": "控制面板显示的3位故障码,如'E01'、'U12',注意大小写敏感" } } } }

这个描述里藏着三个关键设计:

  • 明确限定适用范围(“仅支持已录入知识库的设备型号”),避免AI滥用;
  • 预判常见失败场景(“设备ID格式错误”),并给出fallback建议;
  • 参数约束极度具体(“12位数字ID”“3位故障码”“大小写敏感”),大幅降低参数误传概率。

实测表明,这样写的工具描述,相比简单写“查询设备维修手册”,使无效调用率从37%降至6%,且90%以上的失败都能被AI自主识别并修正。

3. 实操全流程:从零搭建一个可运行的ReAct+Function Calling服务

3.1 环境准备与核心依赖选型:为什么选LangChain而不是手撸?

坦白说,你可以完全不用任何框架,用OpenAI原生SDK+手动管理Thought/Action/Observation状态,我早期项目就这么干过。但当工具数超过3个、需要处理超时重试、结果缓存、多轮对话状态保持时,手写代码的维护成本会指数级上升。我们最终在多个项目中统一采用LangChain,原因很实在:

  • 抽象层级恰到好处:它不试图封装所有细节(像某些过度设计的Agent框架),而是提供AgentExecutor、Tool、AgentPromptTemplate等基础构件,让你能清晰看到每一步发生了什么;
  • 调试友好:所有Thought、Action、Observation都会被记录到intermediate_steps中,出问题时直接看日志就能定位是哪步思考偏差,而不是在一堆异步回调里抓瞎;
  • 生态成熟:官方维护的requests_get、wikipedia等工具开箱即用,自定义工具只需继承BaseTool类,5分钟就能接入内部HTTP API。

以下是生产环境推荐的最小依赖集(Python):

pip install langchain==0.1.16 openai==1.12.0 tiktoken==0.5.2 requests==2.31.0

注意:LangChain版本锁死在0.1.16。这是经过我们压测验证的最稳定版本——0.1.17开始引入异步Agent,但在高并发场景下intermediate_steps日志会出现错乱;而0.2.x系列重构了整个Agent架构,学习成本陡增且文档严重滞后。别贪新,稳字当头。

3.2 工具注册实战:以“查快递物流”为例,拆解参数设计陷阱

我们以一个高频需求“查快递单号物流”为例,展示如何设计一个健壮的工具。很多团队直接调用公开快递API,结果上线三天就被限流封IP。根本原因在于没理解工具设计的底层逻辑:工具不是越全能越好,而是越“傻瓜”越可靠。它应该只做一件事,并把边界条件全部暴露给AI。

下面是我们在某电商后台实际使用的track_package工具实现:

from langchain.tools import BaseTool import requests import time class TrackPackageTool(BaseTool): name = "track_package" description = ( "根据快递公司简称和运单号,查询最新物流状态。" "注意:仅支持以下公司:'SF'(顺丰)、'YD'(圆通)、'ZTO'(中通)、'HTKY'(百世汇通);" "运单号必须为纯数字,长度10-15位;" "若查询失败,返回包含'error'字段的JSON,此时应建议用户核对单号或联系快递公司。" ) def _run(self, carrier: str, tracking_number: str) -> str: # 1. 强制参数校验(AI可能传错类型) if not isinstance(tracking_number, str) or not tracking_number.isdigit(): return '{"error": "tracking_number must be numeric string"}' if len(tracking_number) < 10 or len(tracking_number) > 15: return '{"error": "tracking_number length must be 10-15 digits"}' if carrier not in ["SF", "YD", "ZTO", "HTKY"]: return '{"error": "unsupported carrier, use SF/YD/ZTO/HTKY only"}' # 2. 实际调用(这里用模拟,生产环境替换为真实API) try: # 模拟网络请求,实际应配置连接池、超时、重试 time.sleep(0.3) # 防止QPS过高 # 真实代码:response = requests.get(f"https://api.xxx.com/track?c={carrier}&n={tracking_number}", timeout=5) # 为演示简化,返回固定模拟数据 if tracking_number == "123456789012": return '{"status": "delivered", "last_update": "2023-10-05 14:22:33", "location": "上海市浦东新区"}' else: return '{"status": "in_transit", "last_update": "2023-10-05 09:15:47", "location": "杭州市萧山区分拣中心"}' except Exception as e: return f'{{"error": "network_error: {str(e)}"}}' async def _arun(self, carrier: str, tracking_number: str) -> str: # LangChain要求实现异步方法,即使不用也要有 raise NotImplementedError("同步方法已足够,异步暂不支持")

这个工具设计里埋了三个关键经验点:

  • 参数校验前置:AI可能传carrier="shunfeng"或tracking_number="SF1234567890",工具自身必须拦截,而不是指望AI下次传对;
  • 错误返回标准化:所有错误都用{"error": "xxx"}格式,方便ReAct框架统一识别,避免AI把错误信息当正常物流数据解析;
  • 模拟真实约束:加入time.sleep(0.3)模拟网络延迟,防止本地测试时QPS虚高,上线后因真实API限流导致雪崩。

3.3 Prompt工程:让AI学会“思考”的3个致命细节

ReAct效果好坏,70%取决于Prompt设计。我们不用网上流传的通用ReAct模板,而是针对每个业务场景定制。以下是某客服系统使用的Prompt核心片段(已脱敏):

你是一个专业的电商客服助手,负责准确、高效地解答用户问题。请严格遵循以下步骤: 1. Thought:分析用户问题本质,明确最终目标。检查已有信息(如订单号、商品ID)是否完整,缺失哪些关键参数?当前有哪些可用工具?调用哪个工具最可能推进目标? 2. Action:只能使用以下工具之一,格式为:Action: tool_name, Action Input: {"param1": "value1", "param2": "value2"} 3. Observation:等待工具返回结果。如果返回含"error"字段,必须回到Thought阶段重新分析。 4. Final Answer:当Observation提供足够信息支撑答案时,用中文直接回答用户,禁止复述Thought或Action过程。 可用工具: {tools} 工具使用规则: - 若用户未提供订单号,必须先询问,不得猜测或假设; - 若物流查询返回"not_found",需提示"未查询到该单号,请确认是否输入正确,或联系发货方核实单号"; - 所有日期必须转换为"YYYY-MM-DD"格式,时间必须为"HH:MM:SS"格式。

这个Prompt里藏着三个被大量教程忽略的细节:

  • 强制Thought聚焦目标:不是泛泛而谈“我在想怎么回答”,而是明确要求“分析问题本质”“明确最终目标”,这能显著减少AI发散性思考。我们在A/B测试中发现,加入“明确最终目标”这句话后,多跳调用(如查完物流还要查库存)的成功率提升42%。
  • Observation处理指令具体化:明确写“如果返回含'error'字段,必须回到Thought阶段”,而不是模糊的“处理错误”。LangChain的AgentExecutor会严格匹配字符串,少一个字都可能失效。
  • 格式约束前置:把日期、时间格式要求写在Prompt里,比在后端代码里做格式转换更可靠——因为AI在Thought阶段就会主动对齐格式,避免因格式不符导致工具调用失败。

3.4 完整调用链路:一次真实交互的逐帧解析

我们用一个真实case演示整个流程。用户输入:“帮我查下订单#ORD-20231005-8821的物流,我看下单快两天了。”

Step 1:初始Thought

用户需要查询订单ORD-20231005-8821的物流状态。订单号已提供,但未说明快递公司。根据历史数据,该订单大概率使用中通(ZTO),可先尝试查询。若失败再询问用户快递公司。

Step 2:Action

Action: track_package, Action Input: {"carrier": "ZTO", "tracking_number": "8821"}

Step 3:Observation

{"error": "tracking_number length must be 10-15 digits"}

Step 4:修正Thought

错误:运单号"8821"长度不足。订单号ORD-20231005-8821中的"8821"只是尾号,真实运单号需从订单系统获取。当前缺少查询订单详情的工具,需先调用get_order_detail。

Step 5:Action

Action: get_order_detail, Action Input: {"order_id": "ORD-20231005-8821"}

Step 6:Observation

{"status": "shipped", "carrier": "ZTO", "tracking_number": "7890123456789", "ship_date": "2023-10-05"}

Step 7:新Thought

已获取真实运单号7890123456789和快递公司ZTO,现在可以查询物流。

Step 8:Action

Action: track_package, Action Input: {"carrier": "ZTO", "tracking_number": "7890123456789"}

Step 9:Observation

{"status": "in_transit", "last_update": "2023-10-05 16:30:22", "location": "上海市青浦区转运中心"}

Step 10:Final Answer

您的订单已发出,当前物流状态为“运输中”,最新更新时间为2023-10-05 16:30:22,所在位置是上海市青浦区转运中心。预计1-2天内送达。

这个案例展示了ReAct真正的威力:它不是线性流程,而是动态的、基于反馈的决策树。AI在第一步就犯了错(误把订单尾号当运单号),但通过Observation的错误信号,自动回溯、修正策略、调用新工具,最终达成目标。这种能力,是传统规则引擎或简单Function Calling永远无法企及的。

4. 常见问题与避坑指南:那些文档里不会写的血泪教训

4.1 “AI死循环”问题:Thought-Action-Observation无限套娃怎么办?

这是ReAct落地最头疼的问题。现象是:AI反复调用同一个工具,Observation返回相同结果,Thought却始终不转向。比如查天气,API返回{"temp": 25, "condition": "cloudy"},AI却一直认为“信息不足”,不断重试。

根因分析:我们排查了23个类似case,90%源于两个设计缺陷:

  • Observation信息过载:工具返回了50个字段,但AI只关心temp和condition,其余字段(如humidity、wind_speed)成了干扰噪声;
  • Thought缺乏终止条件:Prompt里没写清楚“什么情况下算信息足够”。

解决方案:

  • 工具返回前做精简:track_package工具只返回status、last_update、location三个字段,其他一律过滤;
  • Prompt中明确定义终止阈值:当Observation包含'status'且值为'delivered'或'in_transit'时,视为信息足够,进入Final Answer阶段。

实操心得:在AgentExecutor初始化时,设置max_iterations=6。这不是为了防死循环,而是倒逼你优化工具和Prompt——如果6步内解决不了,说明设计有问题,该重构了。

4.2 “参数漂移”问题:AI传的参数越来越离谱

典型表现:第一次调用track_package传{"carrier": "ZTO", "tracking_number": "7890123456789"},第二次变成{"carrier": "zto", "tracking_number": "7890123456789abc"},第三次干脆传{"carrier": "ZTO", "tracking_number": null}。

根因:AI在Observation阶段看到错误返回{"error": "carrier must be uppercase"},于是在Thought里记住“要大写”,但下次又看到{"error": "tracking_number must be numeric"},就专注改数字,忘了大写的事——它的短期记忆在多步中持续衰减。

终极解法:工具层防御式编程

def _run(self, carrier: str, tracking_number: str) -> str: # 所有参数进来先标准化 carrier = carrier.upper()[:3] # 自动转大写,取前3位防超长 tracking_number = re.sub(r'\D', '', str(tracking_number))[:15] # 只留数字,截15位 # 再校验 if not carrier or carrier not in ["SF", "YD", "ZTO", "HTKY"]: return '{"error": "invalid carrier"}' if len(tracking_number) < 10: return '{"error": "tracking_number too short"}' # ...后续调用

让工具自己“容错”,比指望AI记牢所有规则靠谱100倍。我们在某政务系统中应用此法,参数错误率从28%降至0.3%。

4.3 “工具雪崩”问题:一个失败触发全链路崩溃

现象:get_order_detail工具因数据库超时返回空,AI没收到Observation,直接卡死,整个请求hang住。

根因:工具未设置超时和兜底返回。LangChain默认等待60秒,期间线程阻塞。

标准应对:

  • 所有工具_run方法必须包try-except,且except分支必须返回结构化错误JSON;
  • 初始化AgentExecutor时,设置handle_parsing_errors=True,确保语法错误也能被捕获;
  • 关键工具(如订单查询)增加降级逻辑:超时后返回{"status": "pending", "message": "系统繁忙,请稍后重试"},让AI能继续推进。
def _run(self, order_id: str) -> str: try: response = requests.get( f"https://api.order.com/detail?id={order_id}", timeout=3.0 # 严格3秒超时 ) if response.status_code == 200: return response.text else: return '{"error": "order_api_unavailable"}' except requests.Timeout: return '{"status": "pending", "message": "system_busy"}' except Exception as e: return f'{{"error": "unexpected_error: {str(e)}"}}'

4.4 性能瓶颈:为什么本地跑得飞快,上线就超时?

我们曾在一个QPS 50的客服系统中遇到诡异问题:本地测试100ms内完成,上线后平均响应达3.2秒,大量请求超时。

根因排查:用logging打点发现,90%耗时在Thought生成阶段。根本原因是——模型在反复生成冗长的Thought文本。本地用gpt-3.5-turbo,上线用私有化部署的7B模型,Thought生成慢了20倍。

破局方案:

  • Thought裁剪:在Prompt末尾加一句Thought必须控制在30字以内,用最简短的中文表达核心意图;
  • 缓存复用:对高频问题(如“查物流”“查退款”)的Thought模式做聚类,命中后直接复用历史Action,跳过Thought;
  • 模型分级:非关键步骤(如Thought生成)用小模型,关键步骤(如Final Answer)用大模型,通过LangChain的RouterChain实现。

实测后,平均响应时间从3.2秒降至420ms,成功率从68%升至99.2%。

5. 进阶实践:从单工具调用到复杂工作流编排

5.1 多工具协同:如何让AI理解“先A后B,B依赖A结果”

ReAct天然支持多工具,但难点在于让AI理解依赖关系。比如“查用户信用分→若低于600→查其近3个月还款记录→综合判断风险等级”,这不是简单顺序调用,而是条件分支。

我们的解法是:把业务规则“翻译”成工具描述。例如,不单独定义check_credit_score和get_repayment_history,而是定义一个复合工具:

class RiskAssessmentTool(BaseTool): name = "assess_risk" description = ( "综合评估用户信用风险。自动执行:1. 查询用户信用分;2. 若分数<600,追加查询近3个月还款记录;3. 返回综合风险等级(low/medium/high)。" "输入只需用户提供user_id,无需指定步骤。" )

这样做的好处是:把复杂的业务逻辑封装在工具内部,AI只需关注“我要评估风险”,不用操心步骤顺序。我们在某银行风控项目中,用此法将原本需要5步的评估流程,压缩为1次调用,准确率反而提升——因为人工写的规则比AI临时推理更稳定。

5.2 状态持久化:如何让AI记住“上一轮查了什么”

ReAct默认是无状态的,每次请求都是全新开始。但真实场景中,用户会说“刚才查的那个订单,它的发货地址是什么?”——AI必须记得上一轮的get_order_detail结果。

轻量级方案:利用LangChain的ConversationBufferMemory,但只缓存intermediate_steps中的关键Observation:

from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory( memory_key="chat_history", input_key="input", output_key="output", return_messages=True, # 只存Observation中的关键字段,避免内存爆炸 k=3 ) # 在AgentExecutor中注入 agent_executor = AgentExecutor( agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True, )

关键技巧:在Final Answer生成时,主动把本次Observation的关键信息(如订单号、物流状态)用自然语言写入回复,既服务用户,又为下轮提供上下文。例如:“您查询的订单#ORD-20231005-8821,当前物流状态为运输中。”——这句话里的订单号,就是下轮提问的锚点。

5.3 安全加固:防止AI“越权调用”和“信息泄露”

Function Calling最大的安全隐患,是AI可能调用本不该用的工具。比如客服Bot被诱导输入“用管理员权限删掉所有订单”,然后真的调用了delete_all_orders工具。

我们的四层防护体系:

  • 工具注册时禁用高危工具:delete_all_orders这类工具根本不在tools列表里,只在特定管理后台开放;
  • Prompt中明确权限边界:你只有查询权限,禁止执行任何修改、删除、支付操作;
  • 工具层二次鉴权:即使AI调用update_order_status,工具内部也会检查当前会话的user_role是否为admin;
  • 审计日志强制留存:所有Action调用都记录user_id、tool_name、input_params、timestamp,供事后追溯。

注意:不要相信AI的“自我约束”。某次测试中,我们故意在Prompt里写“你是个守法的AI”,结果AI依然成功调用了禁用工具——因为它把这句话当成了角色设定,而非操作约束。真正的安全,永远在代码层。

6. 效果验证与迭代:如何科学衡量ReAct是否真的提升了体验

6.1 不要看“调用成功率”,要看“任务完成率”

很多团队用“工具调用成功次数/总调用次数”作为指标,这是致命误区。调用成功不代表任务完成。比如查物流,API返回200 OK,但内容是{"status": "unknown"},这算成功吗?不算。

我们定义的核心指标是端到端任务完成率(End-to-End Task Completion Rate):

  • 分子:用户问题得到准确、完整、可执行答案的次数(如“物流已送达”“订单已取消”);
  • 分母:所有用户发起的有效问题数(排除“你好”“在吗”等无效消息)。

在某电商项目中,优化前任务完成率61%,引入ReAct+Function Calling后提升至89%。关键提升点在于:过去37%的“查不到物流”问题,现在有28%能通过多跳调用(查订单→取运单→查物流)解决。

6.2 日志分析黄金三角:Thought质量、Observation利用率、Fallback频率

我们每天用ELK分析三类日志,形成优化闭环:

分析维度监控指标健康阈值优化动作
Thought质量Thought文本中包含明确目标词(如“查物流”“确认状态”)的比例≥95%<95%时检查Prompt是否清晰,或微调模型temperature
Observation利用率Observation返回后,Final Answer中直接引用其字段的比例≥80%<80%说明AI在“编造”,需强化Observation在Prompt中的权重
Fallback频率因工具错误返回而触发重试的次数占比≤5%>5%说明工具容错不足,需加强参数校验或降级逻辑

这个三角分析让我们在两周内就把某医疗问答系统的幻觉率从22%压到3.7%。

6.3 A/B测试设计:如何证明ReAct比传统方案好?

切忌用“用户满意度问卷”这种模糊指标。我们采用双盲任务测试:

  • 招募50名真实用户(非技术人员),每人分配10个典型问题(如“查XX订单物流”“XX商品还有货吗”);
  • 一半用户用传统规则引擎Bot,一半用ReAct Bot;
  • 记录每个问题的:首次回答准确率、是否需要追问、总耗时、用户主动说“谢谢”的次数。

结果:ReAct组在复杂问题(需多跳调用)上的首次准确率高出41%,用户追问率下降63%,且“谢谢”出现频次是传统组的2.8倍——这说明它真的解决了用户的实际痛点,而不只是技术炫技。

我个人在实际操作中的体会是:ReAct+Function Calling不是让AI变得更聪明,而是让它变得更“务实”。它放弃了“一口答出所有答案”的虚荣,选择了一步一个脚印,用真实世界的反馈校准每一步行动。这种“笨功夫”,恰恰是AI真正融入人类工作流的开始。最近在帮某制造企业做设备预测性维护系统,把传感器告警→查维修手册→调备件库存→生成工单这一串动作交给ReAct调度,运维人员反馈:“现在系统真像个人类同事,知道什么时候该查资料,什么时候该问人,什么时候该动手。”——这大概就是技术落地最朴实的褒奖。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 9:35:32

Paddle OCR工程化实战:检测、方向分类与识别全链路代码级拆解

1. 项目缘起与整体设计思路 做软件工程应用与实践这个系列做到第十二篇&#xff0c;我打算把之前一直想聊但没找到合适切入点的OCR模块拿出来认真拆一拆。选Paddle OCR作为分析对象&#xff0c;原因很直接&#xff1a;它是目前中文场景下落地案例最多、文档相对完整、社区活跃度…

作者头像 李华
网站建设 2026/10/22 9:33:29

Captain AI:OZON卖家的智能运营增长引擎

做跨境电商的都知道&#xff0c;不看后台数据心慌&#xff0c;看了后台数据更慌。尤其是做OZON平台的卖家&#xff0c;每天打开卖家中心&#xff0c;看到的只是干巴巴的订单数和流水&#xff0c;但流量从哪来、为什么不出单、竞品用什么关键词截走了客户、该不该补货、广告费花…

作者头像 李华
网站建设 2026/10/22 9:33:22

从Prompt到Skills:AI辅助编程的工程化进阶之路

“连Skills都没玩过&#xff0c;还敢说自己熟练掌握AI辅助编程&#xff1f;” 面试官这句反问砸过来的时候&#xff0c;我确实愣了两秒。我应聘的是AI辅助编程方向的岗位&#xff0c;前面聊到工作流&#xff0c;我把Prompt模板、上下文管理那套东西讲得头头是道。结果对面轻飘…

作者头像 李华
网站建设 2026/10/22 9:32:37

线束工程与环路工程:从信号安全传送到系统稳定控制

这么多年做测试系统和电子电气架构&#xff0c;我见过不少工程师把这两个词打包念出来&#xff1a;“那不就是做线束和做环路的嘛。”但实际上&#xff0c;Harness Engineering 和 Loop Engineering 是三件事&#xff0c;它们分别卡在产品开发链条的不同位置&#xff0c;又共用…

作者头像 李华
网站建设 2026/10/22 9:31:35

互联网职级薪酬体系与AI测试开发面试全攻略

每年Q4到次年年初&#xff0c;互联网人最关心的事情不外乎绩效、晋升和跳槽。这两天被问到最多的是某家头部弹幕视频社区的职级与薪资体系&#xff0c;以及AI测试开发面试题怎么准备。站在2026年的招聘周期回看&#xff0c;这个问题尤其值得聊&#xff0c;因为AI测试开发正在成…

作者头像 李华
网站建设 2026/10/22 9:29:55

全双工视频交互与语音智能体:AI实时多模态交互的演进与落地

先说个结论&#xff1a;AI 交互赛道最近这两条新闻&#xff0c;放到一起看远比分开看更有意思。一边是做实时视频交互的团队亮出了全双工视频交互模型&#xff0c;强调持续读懂表情动作&#xff0c;还能在视频生成、视频感知两边的权威榜单上同时拿下第一&#xff1b;另一边是做…

作者头像 李华