这道题我觉得本质上是在问,怎么把大模型的能力稳定地封装到一个可落地的系统里,同时让prompt设计能跟上架构的节奏,而不是各自为战。我先说整体架构,再说prompt怎么跟它配合。
我会把系统分成四个层。感知层做输入网关,处理[[多模态]]、做安全过滤,还有一个很关键的决策:判断这个请求是走完整的[[Agent]]链路,还是简单问答短路直接回复。比如客服场景里用户问“退款流程是什么”,直接给标准答案就行,没必要走规划执行。决策层是核心,负责任务分解和工具选择,我一般用 [[ReAct]] 范式,就是Thought、Action、Observation循环,也会结合 [[Chain-of-Thought]] 做复杂推理。执行层是工具注册中心,工具要标准化成OpenAI Function格式,还要做执行沙箱,控制超时和并发,避免一个工具卡死整个Agent。记忆层分短期和长期,短期用对话窗口和 [[KV Cache]] 复用,长期用向量检索加结构化知识库。
prompt设计我按三层递进来做。第一层是元指令,定义角色、能力边界和安全约束,明确告诉模型什么能做、什么不能做,比如金融场景里绝不能给投资建议,一旦用户问这个,直接拒绝。第二层是推理范式层,我用ReAct格式,强制输出JSON Schema,这样解析失败率会很低。还会给两三个[[Few-shot]]例子,让模型知道标准推理轨迹长什么样。第三层是动态上下文层,这是最关键的。工具描述不能全量塞进去,要用 [[RAG]] 检索只注入相关工具,比如用户问天气,你只给天气工具的描述,别把计算器、日历都扔进去。历史轨迹要压缩,关键节点摘要加最近三轮对话就够了。状态变量像当前步骤数、已用token也要跟踪。
举个例子,电商场景里用户问“为什么我用了满减券但订单金额没变”,Agent先感知到这是订单异常,决策层分解成查订单、查优惠券、查商品价格三个子任务,执行层依次调接口,最后推理出是商品不参与满减,然后生成回复。这个过程中,prompt里的工具描述只注入订单查询和优惠券查询两个相关工具,历史轨迹压缩成“用户已提交订单号,查询优惠券规则中”,避免上下文过长。
这里有个坑,就是上下文过长。我会用[[滑动窗口]]加关键信息提取,让LLM二次压缩历史。还有工具误选,我会在工具描述里加使用条件说明和负例Few-shot,比如“这个工具只用于查询已支付订单,未支付订单不要用”。循环死锁问题,prompt里显式限制最大步数,比如最多五步,超过就强制终止并返回兜底话术。[[幻觉]]累积也很常见,我会要求Observation必须严格基于工具返回,禁止模型自己编造。
所以说,架构决定上限,prompt决定稳定性。复杂逻辑像状态机、规则引擎这些,我会下沉到代码里,LLM只专注做模糊决策那部分。上线前我会特别关注边界情况,比如工具返回空结果时模型怎么处理,会不会自己编一个。
还有一个我最近在思考的点,就是当工具数量超过一定规模时,光靠RAG检索工具描述可能不够,工具之间的依赖关系如果没处理好,Agent容易选错工具顺序。比如先查库存再改价格,顺序反了就会出问题。这个可能得引入图结构或者规则约束来辅助工具选择,但我还没完全想清楚最优方案。