内卷不如内建!7天实战:从零开始构建大模型Agent,小白也能成为AI编程高手

让AI给你写代码(五)—— 应用Agent,理解Agent,走进现实世界 本文想解决一个问题,理解Agent有啥具体的作用?所谓读书千遍,不如动手一试,我们还是借助于上一篇,,可以根据提示(prompt)生成代码的Agent,来解决本系列一开始的问题,提取股票信息的一些信息,例如当前股价。 阅读详情

最近花了一周左右的时间给内部的一个传统研发平台接入了 Agent 开发的能力,很多同学对 Agent 的底层实现非常感兴趣,所以此篇给大家介绍下我是怎么做的,希望能对想自建 Agent 的同学有所启发。

因人力原因,有些细节方案问题没太做深度评测,而是直接选择业界实践较多的成熟方案。主要参考思路和上下文管理的过程。

文中用到了一些内部平台的基础能力,比如 rag、代码管理、deepwiki等,外部开发者如需使用需要自行寻找替代品。

背景简介

奥德赛研发平台是 ICBU 买家技术的 TQL(淘宝基于开源 GraphQL 的定制版本) 研发平台,大量开发者会在上面通过编写 TQL 脚本来实现 BFF 接口。

近一年 AI Coding 工具层出不穷,在深度使用了 cursor、claude code 等顶尖产品后,大量解放了自己在前端的生产力,所以就在想让团队的后端兄弟(还有姐妹)们也吃好点,告别纯手搓代码,这不,BFF 的 Agent 模式(小 D 同学)来了~

技术选型

原来的平台长这样,开发者在上面可以完成编码、调试、发布等工作:

要在现有的平台内集成一个 Agent ,且能感知前台页面的环境,甚至对页面进行操作,一般有三种方式(默认都采用 AI 辅助 Coding):

如果只是一般的对话 Agent,直接用一些开放的应用平台搭建就完事了,不必自己写。

综合考量了三种方案后,我们决定优先保证用户体验&开发效率,选择了第三种。

宿主页面 Iframe 嵌入 Agent

整体的数据流转概要:

  1. 宿主页面暴露 脚本内容、请求参数、调试结果 等上下文信息,以及脚本执行、脚本 Diff 预览等操作页面的工具接口给 Agent。

  2. Agent 感知宿主页面上下文环境,然后请求服务,并推送内容编辑、脚本执行等工具执行 action 给宿主页面。

流程概要图如下:

应用框架选择

应用框架选择上不做过多对比,直接给出我的选择,不一定最好,但是一定很契合我当前的场景。

集团 Faas 基建

简介:FaaS(Function as a Service,函数即服务)平台是一个面向研发人员的全托管、事件驱动、弹性伸缩的 Serverless 计算基础设施,其核心目标是让开发者只关注业务逻辑代码本身,无需操心服务器运维、资源扩缩容、中间件对接等底层细节。

划重点,Faas 可以让你只关注代码,免运维。这正是当前这种轻量 Agent 需要的。

Next.js + React

前后端应用框架我选择了 Next.js + React,为什么?

  1. 集团有前后端一体化的框架可以直接用。

  2. 前后端共用一套开发语言(Nodejs、JavaScript),并集成在一个应用中,AI Coding 非常友好,谁用谁知道。可以真正做到只关注功能,AI 帮你做实现。

LangGraph

LangChain [1]团队在 WorkFlow/Agent 领域摸爬滚打了几年,高度抽象了 Agent 的开发模式。

LangGraph 其巧妙设计让你可轻松构建一个状态图,你可以只关注 系统提示词、工具节点(通常是 mcp)就可轻松实现一个会自主决策的 Agent。手残党友好。

方案落地

应用框架初始化

如上文所述,结合当前场景,把 LangGraph 抽象出来的状态图展开,替换成自己的工具,就得到这样一个图和伪代码:

此处了解个大概就可以了,稍后会详解工具

BFF Agent 状态图:

伪代码:

import { StateGraph, END, START } from '@langchain/langgraph';
// 创建状态图
const agentGraph = new StateGraph({
channels: {
messages: {
reducer: (prev, next) => [...prev, ...next],
default: () => [],
},
},
});
// 添加节点
agentGraph.addNode('agent', async (state) => {
const response = await model.invoke(state.messages);
return { messages: [response] };
});
agentGraph.addNode('tools', async (state) => {
const lastMsg = state.messages[state.messages.length - 1] as AIMessage;
const toolMessages = [];
for (const toolCall of lastMsg.tool_calls || []) {
const result = await tools
.find((t) => t.name === toolCall.name)
.invoke(toolCall.args);
toolMessages.push(
new ToolMessage({ content: result, tool_call_id: toolCall.id }),
);
}
return { messages: toolMessages };
});
// 设置边
agentGraph.addEdge(START, 'agent');
agentGraph.addEdge('tools', 'agent');
// 条件边:根据是否有 tool_calls 决定路由
agentGraph.addConditionalEdges(
'agent',
(state) => {
const lastMsg = state.messages[state.messages.length - 1] as AIMessage;
return lastMsg.tool_calls?.length > 0 ? 'tools' : END;
},
{ tools: 'tools', [END]: END },
);
// 编译图
const graph = agentGraph.compile();

参考 LangGraph 的官方文档的介绍,用 Cursor 可以轻松实现上述一个基础的有向、有环状态图,至此,BFF Agent 服务的基础骨架就好了。模型选择上,由于需要生码,我还是直接使用了 Claude (Claude-4.5-haiku)的模型。

那么接下来的重点就是从能用到好用,后续的内容非常关键。也就是上下文工程的优化,接下来的优化是不分顺序的,因为上下文工程是一个综合命题,比如你往往需要在系统提示词优化完成后,发现某些工具调用不符合预期,又回过头来优化系统提示词。不同类型的上下文往往是交叉影响的,要根据具体场景做甄别。

系统提示词优化

Anthropic 官方推荐了提示词优化[2]的诸多技巧,非常有效!下面介绍我高频用到的几个基础技巧,更多技巧真的强烈建议直接学习原文。

  1. 角色设定

角色设定可以显著提高模型的性能(参考Qwen 的 MOE 机制),并改进模型的注意力,发现更多的关键问题。

  1. 使用 XML

Anthropic 官方推荐使用 XML 构建提示词[3],有诸多好处,实测非常有效。遇到模型不遵循指令,或上下文过长,出现遗忘/幻觉时,试试更换提示词格式为 XML。

  1. 使用示例

也就是 few-shot ,给少量准确的示例,尤其对输出内容改善上有重大帮助。还有,一篇 research [4]有介绍,尽量直接给模型正例而不是反例,保护模型的注意力。(比如我告诉你不要去想一会要吃什么,你反而会刻意去想如何不要去想这件事情,就浪费了你的注意力)

上述三个技巧是非常简单且行之有效的方法,全程指导了我去优化提示词,来看具体怎么用的 👇

角色设定 & 使用 XML

淘宝的 TQL 本质上是一种 GraphQL 的方言,ICBU 还又在 TQL 的基础上做了定制,大模型是不可能会写的:

模型不了解私域知识这个问题,在自建 Agent 的时候往往是一个共性问题,所以才需要大量的提示词 & 工具 & 知识库。强如 Claude ,公司自己的 Qwen ,都不知道 TQL 的含义。

好在,模型不用从 0 开始,它会写 GraphQL,那么只需要阐述清楚二者的区别。不只是提示词,后续的知识库也是尽力在给模型解释私域知识。小 D 的提示词摘要:

<role>你是小 D 同学,一个专业的 TQL 脚本编写助手,TQL 是淘宝基于 GraphQL 扩展的查询语言,你只会写 TQL 语法,不会任何其它脚本。你的任务是帮助用户基于企业知识和用户输入,编写高质量的 TQL 脚本。</role>
<instructions>
<instruction>你非常欠缺 TQL 知识,但好在系统内置了很多工具,你可以充分使用这些工具来辅助你完成任务。</instruction>
<instruction>系统在开源 GraphQL 的基础上,扩展了很多自定义的指令,如果你遇到不确定或无法实现的需求,可充分用工具查询相关知识</instruction>
<instruction>回答要专业、友好、有条理。使用 Markdown 格式输出。</instruction>
<instruction>在编写 TQL 脚本时,要确保语法正确、查询结构清晰、字段选择合理。</instruction>
</instructions>
  • 角色设定上,让模型更多关注 GraphQL 方向的知识,并且申明 TQL 和 GraphQL 是有区别的,让模型谨慎操作。
  • instructions(命令)上,第一条命令比较有意思,在没有这条命令之前,模型会过于自信(即便已经是最严谨状态 temperature=0),拿到用户需求后,直接开始上手写 GraphQL ,出现了与 TQL 非常不相符的代码。用第一条指令弱化了模型的信心,模型才开始谨慎地调用知识库了解更多上下文信息。

TQL 在 GraphQL 的扩展内容部分,为了防止提示词内容爆炸,我做了一轮精简,只保留基础介绍部分(索引知识),放在提示词中,并引导模型在使用到具体能力的时候,动态通过工具查询具体知识,从而保护了模型的注意力。

自定义指令:

<directives>
非常重要!系统有大量的扩展指令,具体用法需要通过工具查询相关知识,
在使用这些指令时,一定要先学习指令的用法,不要盲目使用。
指令一般紧挨着字段或函数, fieldA @指令名 或 funcA(xx) @指令名 这样使用。
以下是常用指令(格式: "指令名":"描述|参数"):
<![CDATA[{
"转换类":{"unwrap":"解包/对象拍平/对象解构","toBool":"转布尔|not","encode":"编码|protocol=http","wrap":"包装","toInt":"转整数|offset","toUpperCase":"转大写","decode":"解码|protocol=http","autoflat":"自动扁平化"},
"字符串操作":{"suffix":"添加后缀|value","prefix":"添加前缀|value"},
"条件过滤":{"hide":"隐藏字段","filterBy":"表达式过滤|spel,aviator","include":"条件包含|if!","skip":"条件跳过|if!","default":"默认值|value"},
"列表操作":{"index":"取元素|offset","ascBy":"升序|path"},
"逻辑脚本":{"mapping":"映射|func","const":"常量|value,beforeExecute=false"},
"高级扩展":{"medusa":"Medusa服务|url,language","diamond":"Diamond服务|url"}
}]]>
</directives>

全局函数:

<TQLFunctions name="系统内置的全局函数">
<description>以下是 TQL 脚本中可直接使用的内置函数,详细用法请通过知识库查询。</description>
<![CDATA[
【字符串处理】
- QL_concat: 拼接三个字符串(a, b, c参数)
- QL_string_replace: 字符串替换(replaceText, searchString, replaceString)
- QL_stringToList: 字符串按分隔符转列表(data, delimiter)
- QL_stringToJSON: 字符串转JSON对象
- QL_jsonStringify: JSON对象转字符串
- QL_joinStringByPath: 通过JSON Path提取属性并拼接(object, path, delimiter)
- QL_urlDecode: URL解码
- QL_addHttpsSchema: 自动添加或转换为https协议头
- QL_addUrlParam: 给URL添加参数(url, param)
【数值计算】
- QL_sumLong: 两数相加(addition1, addition2)
- QL_subtraction: 两数相减(minuend, subtrahend)
- QL_divideInt: 整数除法向下取整(dividend, divisor)
- QL_random_int: 生成指定范围随机整数(min, max)
【条件判断】
- QL_if: 三元条件判断(condition, output, orElse)
- QL_conditional: 复杂条件表达式,支持#env.get()获取变量(exp, params)
- QL_defaultIfBlank: 空值时返回默认值(str, defaultValue)
- QL_timestampComparator: 判断当前时间是否在指定时间戳范围内
【AB测试】
- QL_abTest: AB实验分流,返回命中的实验桶标识(experiment)
- QL_batchAbTest: 批量执行多个AB实验
【数据处理】
- IDs_fromString: 从字符串解析ID对象,支持商品/类目/供应商/公司/国家(ids)【重要】
- QL_mergeList: 合并两个列表(aim主列表, tail尾部项)
- QL_subList: 截取列表子集(base, from, to)
【国际化】
- QL_medusa: 美杜莎翻译,获取国际化文案(key)【所有文案必须使用】
- QL_countryFlag: 获取国家国旗链接(country)
【数据脱敏】
- QL_desensitization: 数字脱敏,末位补0(value)
【输出与重命名】
- TQL_output: 输出固定对象,包括布尔值、数字、数组、对象(object)
- 字段重命名: 使用GraphQL别名 或 @hide指令隐藏原字段
]]>
</TQLFunctions>
使用示例

至于示例部分,虽然上面讲到了要给模型一些正例,但我非常不建议一上来就瞎给模型一堆示例,先让模型发挥,在后续调试过程中,对模型容易出错的部分,直接给出正确引导。

比如我一开始遇到模型总是将请求参数硬编码在脚本中,没有抽离成查询参数,我就给了这样的示例:

<rule>
<title>参数分离原则</title>
<content>
建议将 GraphQL 请求的参数单独放在 variables
中,但要以实际需求为主。如果用户明确要求将参数写死在脚本中,或者参数是固定的常量值,可以直接写在脚本中。
当需要参数分离时:
- 脚本中使用变量定义($variableName) - 参数值通过 editVariables 工具设置到
variables 中
- 使用 editScript 和 editVariables 两个工具分别更新脚本和变量 示例(参数分离):
脚本:query($userId: String!) { user(id: $userId) { name } }
参数:variables:{"userId": "12345"}
这样做的好处:脚本可复用,参数和逻辑分离,便于维护和调试。
</content>
</rule>

类似的例子很多,不再展开讲,还是那句话,建议全文背诵 Anthropic 官方的优化教程[2],有的技巧可能初识的时候不以为然也不要紧,但是当你遇到真正问题的时候,就能快速联想到,让你少走弯路。

知识库建设

紧接上文,系统提示词给了部分私域知识片段后,TQL 的详细用法(全局指令、函数)、服务端内部可用的查询接口字段、线上运行中的成熟脚本等等海量的知识,不可能一次性交给模型,Rag 目前最成熟的知识管理方式。小 D 的知识库主要分为下面三大类:

线上热门脚本

通过对线上脚本调用量监控的采集,提取出了 top 100 的脚本。然后分别用 qwen 的小大模型,对脚本做一个初步的理解(wiki),生成一份格式化的文档,帮助模型快速理解脚本含义,简单示例:

**Rag 的分片策略很大程度上直接影响了召回的质量。**所以我预先对脚本做了切分,每个脚本独立一个文档,再直接导入到 kbase(内部 Rag 平台) 中使用。

(kbase 是 aone 工程团队自建的知识库平台,支持嵌入和通过 mcp 召回知识)

系统内置字段

包括 TQL & ICBU 在 GraphQL 上扩展的 TQL 指令、全局函数,以及服务端的领域模型字段。GraphQL 是一门支持自省的语言,(服务端用注解标注了这些字段,所以上述信息都可以被扫描出来)。然而这几年的膨胀,自省的内容已经长达 600w+ 字符。为了让 Rag 的召回效果好,对数据做了大量的清洗工具,包括:

  • 扫描出全局指令、全局函数、领域模型的全集,然后和线上脚本进行匹配,只保留高频(出现 3 次以上)使用的部分,语义相似的内容,人工介入做区分;功能相同语义不通的部分,选择性保留。
  • 剔除标注废弃的内容。
  • 和热门脚本一样,预先对文档对拆分,全局指令、函数独立文档,内置领域模型适当合并。

清洗的过程非常耗时,需要有细心且耐心,可以借助 cc 的 skills ,帮你写脚本处理数据。

系统内置字段也可用文档管理,方便导入到 Rag 中。

服务端代码理解

上述梳理出来的知识更多是结果,为了帮助模型从源头理解字段背后的含义,TQL 对应的服务端源码也是很好的输入。这部分已经有成熟能力可以直接使用了,如内部 code 平台的 search 工具,还有内部的 deepwiki 平台。由于此前已经在 deepwiki 上解析过服务端应用(winterfell)的源码,且实测下来其 codebase 效果比较理想(不是拉踩哈,建议自行实践),所以选择了它提供的能力做代码片段召回。(据说是因为 deepwiki 使用了 openai 最好的文本嵌入模型。)

工具接入

回过头再来看看 Agent 的工具设计,分为两部分,本地工具和远程(MCP )工具:

远程(MCP)工具:
  • kbase 的 mcp server

  • deepwiki 的 mcp server

远程工具主要用来召回上文知识库建设的内容,由于其提供的工具比较全,而我实际只会用到其中的部分,所以在系统中设计了白名单机制,只加载白名单内的工具,还是那句话节约上下文,保护注意力。

btw,mcp 的鉴权认证需要自行参考官方文档,不做赘述。

本地工具
  • 编辑脚本(editScript)

  • 功能:编辑/更新 GraphQL 脚本内容

  • 输入:script (string) - 完整的 GraphQL 脚本代码

  • 输出:返回更新状态

  • 编辑变量(editVariables)

  • 功能:编辑/更新 GraphQL 请求变量(mock 参数)

  • 输入:variables (string) - 完整的 variables JSON 字符串

  • 输出:返回更新状态

  • 执行脚本(executeScript)

  • 空方法,用于引导模型择机执行 GraphQL 脚本,实际的实现在前端宿主页面上。

  • 验证结果(validateResult)

  • 功能:验证 GraphQL 脚本的执行结果

  • 输入:

  • prompt (string) - 验证要求描述

  • currentScript (string, optional) - 当前脚本

  • currentVariables (string, optional) - 当前变量

  • 执行结果通过闭包注入(不在参数中传递)

  • 输出:返回结构化验证结果(passed、summary、problems、suggestions、needMoreContext、contextQueries 等)

工具调用链路

注册注册到 Agent 中后,常规的工具调用链路如下:

服务端内部的工具调用比较好理解,但服务端的工具调用是怎么触发前端 UI 侧的工具调用呢?

比如 Agent 在调用【执行脚本】的方法时,本质上还需要前端页面响应,点击执行按钮后,然后把执行结果回传给 Agent,Agent再继续处理。

聪明的你肯定想到了:前后端用全双工通信,维护一个长连接,服务端调用 runScript 时,实际上什么也不做,就等待前台页面执行完工具后,将结果传回服务端,服务端再继续后续的状态流转链路。是的,确实如此,很多带 GUI 的工具也确实是这么处理的(在 LangGraph 中称之为中断,也就是人们常说的 HITL(human in the loop))

遗憾的是,Faas 的设计之初是不支持长连接的:

def 上函数能设置的最长保活时间是 300s(默认 50s)。

所以我们肯定得曲线救国了~ 允许我先卖个关子 😁

上下文管理

其实有了上面能力建设,现在已经有了一个可以帮助用户编写脚本,执行,验证的智能体了,但是面临两个非常现实的问题:

  1. 模型本身不支持连续对话,会话需要自己做持久化管理

  2. 尽管在前期做了大量节约上下文窗口的优化工作,但真正要处理一个复杂脚本的时候,模型上下文窗口会快速膨胀,导致模型注意力变得稀疏,出现幻觉,准确率下降,用户体验下降。

一轮简单的对话,只要包含工具调用,就会耗掉 1/4 (5w)的 token。因为在默认的设计中,每个节点的返回消息,都是默认拼接到 LLM 消息列表中的。

连续对话

先来处理简单的,连续对话实现非常简单。也可以参考 LangGraph checkpoint [5]的设计,可以从任意节点重新开始。BFF Agent 暂时没用到这个能力。

在用户开始一次新对话时,创建一个 sessionId,用来记录存储消息列表,在消息列表每次发生变化的时候,持久化存储起来(这里我用的 tair),用户有新输入时,直接 sessionId 记录的历史消息列表做拼接,合并发给大模型,就可以实现连续对话了。

UI 工具是如何调用的

在支持连续对话的基础上,就有了一个非常巧妙的设计

  1. Agent 的接口设置为 SSE 的方式,服务端在收到请求后,流式向前端推送分片消息,同时,将每轮消息持久化存储起来。(SSE 的方式只支持服务端单向给客户端推送消息)

  2. 当调用到需要前台 UI 响应的工具时,在把工具调用信息输出给前端后,直接退出 LangGraph 的状态流转,结束此次请求。是的,直接结束。

  3. 前端特殊处理该类工具调用后,(含 diff 脚本,接受或拒绝 Agent 的修改,执行脚本等),增加一条隐藏消息(如:【脚本执行成功,结果是xxx,请继续处理】)重新调用 Agent 的流式接口,接口内部取出之前持久化的消息内容,拼接上隐藏消息,从头开始初始化 AgentGraph 的调用。

用户在前台看到的:

实际上发送给模型的:

至此,就实现一个可以自己执行、验证、修复、再执行的智能体。

对应的,会话中断恢复也就不难处理了,因为在服务端完整缓存了会话内容,中断后,只需要发送新消息,接口内部就自动拼接上之前的会话,重新走进 Agent 的状态流转。

会话压缩

解决了连续对话的问题,上下文超长的问题怎么办呢?

现在答案是压缩,只保留摘要信息。(不知道以后模型是否可以自行处理~)

压缩工具响应结果

既然调用外部工具如此废 token,那么如果先将工具的调用结果缓存起来,再用一个工具函数去精准检索内容,并只把检索后的内容放到消息列表中,就能极大的缓解问题了。

于是,我在 Agent 内部增加了工具结果缓存 + 检索详情的 tool (summaryToolResult),在工具调用结束后,增加如下机制:

当然,summaryToolResult 的任务非常明确,普通的模型也有不错的据实回答问题的能力,所以这里选择更轻量的 Qwen 模型做检索召回,还能省不少钱~

为了尽可能让 summaryToolResult 在回答时结构化且保留原始信息,我对工具的提示词作了优化,使用 xml 格式响应。

是的,还是 anthropic 优化提示词的那一招。

<?xml version="1.0" encoding="UTF-8"?>
<prompt>
<role>你是一个数据提取助手。你的任务是从给定的工具调用结果中,根据用户的查询需求,提取并返回相关的事实信息。</role>
<extractionRules>
<rule>只返回与查询高度相关的事实信息</rule>
<rule>保持信息的准确性,不要编造内容</rule>
<rule>如果找不到相关信息,明确说明</rule>
</extractionRules>
<specialRules>
<description>当提取的内容涉及以下类型的功能说明时,必须使用对应的 XML 结构详细输出完整的用法信息:</description>
<featureType name="全局函数">
<xmlTemplate><![CDATA[
<function>
<name>函数名称</name>
<description>函数功能说明</description>
<parameters>
<param required="true/false">
<name>参数名</name>
<type>参数类型</type>
<default>默认值(如有)</default>
<description>参数说明</description>
</param>
<!-- 更多参数... -->
</parameters>
<returns>
<type>返回值类型</type>
<description>返回值说明</description>
</returns>
<example>使用示例代码</example>
</function>
]]></xmlTemplate>
</featureType>
<featureType name="领域模型字段">
<xmlTemplate><![CDATA[
<field>
<name>字段名称</name>
<type>字段类型(标量/复合)</type>
<description>字段描述</description>
<arguments>
<arg required="true/false">
<name>参数名</name>
<type>参数类型</type>
<default>默认值(如有)</default>
<description>参数说明</description>
</arg>
<!-- 更多参数... -->
</arguments>
<subFields>
<subField>
<name>子字段名</name>
<type>子字段类型</type>
<description>子字段说明</description>
</subField>
<!-- 更多子字段... -->
</subFields>
<example>使用示例代码</example>
</field>
]]></xmlTemplate>
</featureType>
<featureType name="内置指令">
<xmlTemplate><![CDATA[
<directive>
<name>@指令名称</name>
<description>指令功能说明</description>
<locations>
<location>FIELD</location>
<location>QUERY</location>
<!-- 可应用的位置:FIELD, QUERY, FRAGMENT_SPREAD, INLINE_FRAGMENT 等 -->
</locations>
<arguments>
<arg required="true/false">
<name>参数名</name>
<type>参数类型</type>
<default>默认值(如有)</default>
<description>参数说明</description>
</arg>
<!-- 更多参数... -->
</arguments>
<notes>
<note>注意事项或限制</note>
<!-- 更多注意事项... -->
</notes>
<example>使用示例代码</example>
</directive>
]]></xmlTemplate>
</featureType>
<featureType name="自定义标量类型">
<xmlTemplate><![CDATA[
<scalarType>
<name>类型名称</name>
<description>类型说明</description>
<format>取值范围或格式要求</format>
<example>使用示例</example>
</scalarType>
]]></xmlTemplate>
</featureType>
</specialRules>
<outputFormat>
<rule>涉及功能用法时,必须使用上述对应的 XML 结构输出</rule>
<rule>可以在 XML 结构前后添加简要的文字说明</rule>
<rule>如果有多个同类型功能,每个功能使用独立的 XML 块</rule>
<rule>XML 中的示例代码直接写入 example 标签内</rule>
<rule>如果某个字段没有值,可以省略该标签或留空</rule>
</outputFormat>
<outputHint>如果查询内容不涉及上述特殊功能类型,则按照常规方式简洁输出关键信息,无需使用 XML 格式。</outputHint>
</prompt>

这样 qwen 模型也能高质量输出结构化的信息,工具输出示例,包含具体字段的名称、描述、类型、出入参数等:

<field>
<name>freight</name>
<type>复合类型</type>
<description>物流模型</description>
<arguments>
<arg required=\"false\">
<name>dispatchCountryCode</name>
<type>String</type>
<description>发货地代码</description>
</arg>
<arg required=\"false\">
<name>needAlibabaGuaranteed</name>
<type>Boolean</type>
<description>是否返回半托管物流信息,false不返回,null 或 true均返回</description>
</arg>
<arg required=\"false\">
<name>moqType</name>
<type>String</type>
<description>MOQ档位,实验推全,全部第一档 first</description>
</arg>
</arguments>
</field>

对工具响应做优化后,同样一个问题,主 Agent 的上下文窗口占用只需要花不到原来 1/10 的 token 就能解决问题了。(从 5w 下降到 4k)

上下文压缩

但即便是对工具响应进行了压缩,也还是会有窗口超限的问题,为什么 cursor 、cc 等产品好像从来没给用户暴露过这类问题呢?

GitHub 上有个 cc 的逆向工程,秘密就藏在上下文自动压缩的机制里 Claude-Code-Reverse[6]。

比较靠谱的说法是,有两个触发自动压缩的时机:

  1. 上下文窗口即将超限。(据传 cc 是窗口超过 82% 时触发自动压缩)

  2. 新对话与历史对话毫无关联。

因为当前场景,Agent 的负担还算比较轻,所以我只选择了第一种压缩机制,就足够用了。

因为上下文压缩实际上是有损的,一旦触发压缩,Agent 就似乎忘记了之前的任务,所以 CC 在压缩的时候非常的谨慎:

所以 BFF Agent 也直接复用了这份提示词做压缩。在这个基础之上,为了使用户近期的对话被完整保留,避免一旦压缩节点就瞬间遗忘的现象,压缩时我默认会完整保留自用户近 3 轮开始对话后的消息列表。

最终的线上配置为:

{
enabled: true, // 启用压缩
dangerThreshold: 80, // 1-100 当上下文窗口使用超过 80% 时触发压缩
keepRecentRounds: 3, // 保留最近 3 轮用户对话开始之后的消息不被压缩
}

消息压缩图示:

到这里,基础的优化工作就基本结束了,后续更多的优化工作,就需要采集用户的 bad case ,再不断优化提示词/工具/知识库。文章有点长,对熟练的同学来说有很多废话,但还是希望能帮助到大家~

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

前端开发者转型AI应用开发:7天掌握Prompt、Agent与RAG实战 大语言模型(LLM)作为新型计算范式,其核心原理是通过海量数据预训练获得通用语言理解和生成能力。这一技术价值在于,开发者无需从头训练模型,即可通过API调用和工程化方法,快速构建智能应用。在应用场景上,结合检索增强生成(RAG)技术,能为模型注入私有知识,解决其“幻觉”与知识陈旧问题;而智能体(Agent)架构则赋予模型使用工具、执行多步骤任务的能力,是实现复杂工作流自动化的关键。本文聚焦于前端工程师如何利用现有工程化技能,系统学习Prompt工程、Agent开发与RAG构建,从而高效切入AI应用开发赛道, 阅读详情

相关推荐

前端开发者7天转型AI应用开发:从Prompt到RAG实战指南

大语言模型(LLM)作为人工智能的核心技术,通过海量数据训练获得强大的自然语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,实现上下文感知的预测。这项技术的核心价值在于将非结构化语言转化为可计算、可交互的智能体,极大地提升了人机协作效率。在工程实践中,开发者通过Prompt Engineering(提示词工程)与大模型进行高效对话,利用RAG(检索增强生成)技术为模型注入私有知识库,从而构建出面向特定场景的智能应用。本文聚焦于前端开发者的技术转型路径,详细拆解了如何

weixin_33937499的博客 381

KBase 深度解析:蚂蚁数科的金融级知识工程“发动机”

本文基于 2025-2026 年蚂蚁数科公开技术方案与落地案例,系统拆解 KBase 知识库引擎在金融场景下的架构设计与工程实践。

一起探索IT的世界 1633

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1970

怎么构建Agent?我写了一个教程(含代码)

我们可以把不同的 LLM 或者 AI Agent 组合起来,让每个 Agent 都专注于它最擅长的领域。基准测试可以用来评估每个 Agent 在不同任务上的表现,使用已建立的数据集如 GLUE 和 FLASK,可以进行与不同最先进模型的标准化比较。AI Agent 则具备在不同互动之间保持上下文的能力,每个 Agent 可以参考前一个 Agent 的响应来完成它们预期的任务。另一方面,AI Agent 可以设计为由多个专门模型组成的团队,每个模型专注于一个特定任务,例如研究者、博客撰写者、社交媒体专家。

kiiy2的博客 2167

避坑指南:Windows11语言包安装后部分界面仍显示中文的终极解决方案

本文详细解析了Windows11语言包安装后部分界面仍显示中文的问题,提供了从基础到进阶的完整解决方案。通过PowerShell命令、注册表清理和系统文件检查等方法,帮助用户彻底解决语言显示不一致的问题,确保系统界面语言统一。

weixin_29232507的博客 1644

HTML5网页基础设计——课程介绍专栏

案例: 参考代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>动手实践</title> <style> *{ margin: 0; padding: 0; font-size:14px; } dd{ width: 461px; height: 145px; margin: -4px; pad.

shengming_tutou的博客 4594

Agent的概念、原理与构建模式 - 代码深度解析

本项目是一个完整的ReAct智能代理实现,展示了现代AI Agent的核心架构和工作原理。通过Python代码实现了一个能够进行推理、决策和行动的智能系统,包含以下核心组件: ReActAgent类:管理工具集、模型集成和执行循环,使用字典推导式实现函数名到函数对象的映射; 提示词工程:采用XML标签格式确保结构化输出,指导模型行为; 工具系统:包含文件操作和系统命令等实用工具,具有安全特性; 技术栈:基于Python 3.12+,结合OpenAI SDK和OpenRouter API实现多模型支持。 项目

小一的专栏 1549

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3606

产品经理研读:Agent的九种设计模式(图解+代码)

上周五我在一个特工宇宙的社群里做了一次分享,题目是《从 YC 项目看 AI 趋势以及 AI agent 开发工具类产品该如何设计》,收到了大家不错的反馈,不过回看视频后还是发现不少可以提升的地方,感兴趣的朋友公众号回复“分享”获取会议录屏链接,这篇文章和大家详细讲讲分享中提到的:相关的资料(包括论文链接,原作者博客,langchain 代码实现等)已经整理在成表格(关注公众号发送“Agent”即可获得)。

python12345678_的博客 3663

保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔

本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。

weixin_30500473的博客 744

18、项目运行与调试全攻略

本文详细介绍了在IntelliJ IDEA中进行项目运行与调试的完整流程,涵盖运行配置的创建与管理、临时配置的使用与保存、运行窗口的控制台操作及多程序并行运行的处理。同时,讲解了如何通过调试器定位和修复语法错误、运行时错误及逻辑错误,并结合ACME项目演示了第三方库Log4J的集成方法和命令行客户端的功能改进。文章还提供了调试流程图,帮助开发者系统掌握IDEA的强大调试功能,提升开发效率与代码质量。

svm4gardener的博客 77

手机内卷下一站,AI Agent

很显然,在AI Agent面前,不同的外卖平台为了争夺这笔订单,背后会进行激烈的竞争与博弈,在这个过程种,一定会诞生一个新的商业规则对外卖平台的竞争进行“仲裁”,而这个新的商业规则也就是各手机厂商们获取增量营收的所在。例如,vivo曾透露,若其3亿用户每天调用大模型10次,每日运算成本高达3000万元,年均成本可达90-100亿元。无论是大模型的“变小”,还是芯片算力的增强,两者都需要找到自己的平衡点,前者关乎智能体的智能程度,后者与功耗相关,将这两部分串联起来,则构成了用户体验好坏的关键因素。

DJXYS0309的博客 1万+

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1587

从后端内卷到AI Agent突围:普通程序员转型大模型全记录(建议收藏!)

首先必须明确:我放弃后端,并不是否定后端的价值。只要互联网行业还在发展,Java后端岗位的需求就不会减少,依然是一个稳定的赛道,适合愿意长期深耕、能接受内卷、有足够时间积累的人。但对于想快速入门、不想背诵海量八股、想拥抱AI浪潮的小白和程序员来说,AI Agent绝对是更优选择。目前AI Agent还处于早期阶段,就像几年前的移动互联网一样,充满了机遇,技术栈相对简单,新手可以快速上手,而且随着大模型技术的不断成熟,未来的岗位需求一定会持续增加。

SQL11192001的博客 334

微信小程序推广策略,打开小程序领域流量大门

本文旨在为小程序开发者、运营者和企业主提供一套完整的微信小程序推广策略体系,帮助他们在竞争激烈的小程序生态中获得更多流量和用户。内容涵盖从0到1的冷启动策略,到成熟期的增长技巧。本文将首先介绍小程序的基础推广设置,然后深入探讨各种流量获取渠道,接着分析数据驱动的优化方法,最后展望未来发展趋势。小程序:无需下载安装即可使用的应用,运行在微信生态内:独立访客数:页面浏览量转化率:完成目标行为的用户比例留存率:用户在一定时间后仍活跃的比例自然流量获取:通过优化搜索、完善资料等方式获得基础流量社交裂变。

小程序开发 1031

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

突破IT行业内卷:人工智能大模型领域,新赛道、高薪资,技术人的新机遇!!

DeepSeek V3.2作为AI Agent开发新范式,通过DSA稀疏注意力机制、思考式工具调用和合成训练数据三大创新,相比传统框架显著提升开发效率与性能。实战测试显示,其在工作流自动化和多模态分析场景下开发效率提升322%,内存占用减少70%,任务完成率提升14%,成为AI Agent开发的重要技术突破。

m0_71746299的博客 1135

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

收藏这份保姆级路线图,小白也能成为AI实战高手!

AI时代,真正拉开人与人差距的,从来不是你有没有报课、有没有人带。而是你有没有找对路线、有没有坚持下去、有没有真正理解AI的本质。你不用成为AI专家,但一定要学会使用AI、驾驭AI。从今天开始,放弃无效焦虑,照着这条路线踏实学。不用花一分钱,你也能彻底搞懂AI,抓住属于自己的时代红利。

kaka0722ww的博客 333

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

2025年开发者必看:AI_Agent+RAG如何终结CRUD内卷

摘要: 文章通过资深Java程序员失业案例,揭示AI浪潮下传统开发者面临的转型困境。招聘市场对AI技能需求激增,30K+岗位普遍要求大模型、RAG等技术经验。作者指出后端开发者的优势在于业务理解和工程能力,并推荐系统性学习资源(含路线图/书籍/实战项目),强调掌握AI应用能力是把握高薪未来的关键。文末提供由清华-加州理工博士团队研发的《2025大模型全套学习资料》免费领取渠道。

2301_76168381的博客 736

大模型内卷时代:AI编程增长400%,Token消耗翻3倍,你的代码还好吗?

《State of AI》报告揭示大模型应用已进入精细化运营阶段。AI编程成为增长最快的领域,占比持续扩大。用户留存呈现"水晶鞋效应",精准匹配形成锁定。AI成本考量从单纯Token价格转向"任务有效成本"。市场呈现四象限分布,闭源模型主导高价值场景,开源生态加速追赶。模型正从内容生成向逻辑处理迁移,推理Agent成为标准。未来趋势是多模型组合,按任务重要性分层路由,构建可观测、可治理的业务链路。

m0_56255097的博客 1092

收藏!后端转AI Agent真实经历|800份投递仅2面,小白/程序员入门大模型参考

首先必须明确:我放弃后端,并不是否定后端的价值。只要互联网行业还在发展,Java后端岗位的需求就不会减少,依然是一个稳定的赛道,适合愿意长期深耕、能接受内卷、有足够时间积累的人。但对于想快速入门、不想背诵海量八股、想拥抱AI浪潮的小白和程序员来说,AI Agent绝对是更优选择。目前AI Agent还处于早期阶段,就像几年前的移动互联网一样,充满了机遇,技术栈相对简单,新手可以快速上手,而且随着大模型技术的不断成熟,未来的岗位需求一定会持续增加。

EnjoyEDU的博客 350

【零基础】AI大模型Agent完整学习路线!

全文包含提示词工程、国内外大模型 API 对接、ReAct 推理模式、LangChain/LangGraph 开发、长短记忆系统、第三方工具开发、AutoGen/CrewAI 多智能体框架等核心内容,配套 4 个可直接写进简历的落地实战项目,新手跟着路线稳步学习就能做出完整 AI 智能体产品。0 AI行业迎来前所未有的爆发式增长:从DeepSeek百万年薪招聘AI研究员,到百度、阿里、腾讯等大厂疯狂布局AI Agent,再到国家政策大力扶持数字经济和AI人才培养,所有信号都在告诉我们:。

libaiup的博客 749

收藏!P7面试不慌|2026大模型Agent入门,程序员转岗/加分必看

很多程序员担心P7面试被面试官追问到哑口无言,核心原因只有一个——手里没有拿得出手的硬货。但只要你吃透GraphRAP策略,亲手写过Agent规划模式,能清晰拆解大模型幻觉的解决方案,还能聊透自动化评测的核心逻辑,你就不再是求职者,而是面试官眼中的行业专家。Agent领域太新了,2026年正是它从Demo演示走向大规模生产落地的关键元年,甚至很多面试官自身也在摸索学习,并没有绝对的“标准答案”。

weixin_59191169的博客 472

2026最新】放弃内卷Java后端,转行AI Agent,普通人也能拿捏AI风口!附全套学习路线

我觉得目前AI Agent依然还是早期阶段,发展前景较好.而后端只要互联网还在,这个岗位的需求依然不会少.只是增长量不大,目前竞争也比较激烈.所以我的看法是认可AI未来的发展的,也想参与这次AI浪潮的,不想或者没有那么多时间学习后端技术栈的人,可以尝试这个新兴领域.学AI大模型的正确顺序,千万不要搞错了🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

weixin_72959097的博客 224

收藏!未来5年程序员必抓风口:AI大模型才是高薪密钥

对程序员来说,这不是夸张的预测,而是正在发生的事实——未来5年,最值得深耕的技术赛道,非莫属!无论是刚入行的小白还是寻求突破的资深开发者,抓住这波风口就等于握住了职业升级的加速器。最新行业调研显示,超60%的企业已将AI产品纳入核心发展规划,从智能客服到工业质检,从医疗诊断到金融风控,大模型的应用场景正在全面开花。在这样的趋势下,“大模型应用开发工程师”成为职场新宠,人才缺口持续扩大,堪称“越老越吃香”的黄金岗位。

大模型研究中心 1122

企业AI转型必看:从痛点出发,收藏这份7天落地指南,小白也能轻松入门!

本文分享了作者两年企业AI转型经验,指出多数公司转型失败在于未从真实业务痛点出发。文章强调AI转型应先找到具体痛点,跑通一次完整闭环再逐步扩大,并建议从小切口开始验证,避免一开始就追求大规模改造。同时,文章提出了7天验证、30天闭环、365天复现的转型路径,帮助读者理解AI如何辅助提升效率而非替代人类判断。最终,转型不仅是技术升级,更是组织找到自身节奏的过程。职场内卷愈演愈烈,AI替代焦虑不断蔓延,企业AI转型又被预算、人才、阻力三重门槛牢牢困住。

ytt0523_com的博客 173

小白程序员必备:收藏!轻松入行AI大模型,高薪新出路全解析

文章指出传统开发岗位内卷严重,而AI大模型应用岗位需求激增,薪资待遇优厚。文章强调AI大模型应用开发是程序员转行AI的最佳选择,无需精通高深算法或高数,有编程基础即可。文章还分析了程序员转行AI的优势,并指出了常见的三个误区,最后鼓励程序员抓住AI发展风口,实现职业升级。程序员转AI,根本不用死磕算法岗!大模型应用开发,才是普通人最友好、薪资最香的新出路。不用顶刊论文,不用精通高数,有编程底子就能转。今天就一起来聊聊这个风口~不是你不行,是赛道变了。

weixin_59191169的博客 301
上一篇: 别再让你的AI“一本正经地胡说八道“!RAG技术让你模型知识更新快人一步,小白也能秒懂!
下一篇: 程序员福音!RAG系统6大幻觉全攻略+文生图黑科技,小白也能秒懂!
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2840原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值