核心内容摘要
EcomGPT-中英文-7B电商模型VMware虚拟机部署:在Windows宿主机上搭建Linux测试环境
最近花了一周左右的时间给内部的一个传统研发平台接入了 Agent 开发的能力很多同学对 Agent 的底层实现非常感兴趣所以此篇给大家介绍下我是怎么做的希望能对想自建 Agent 的同学有所启发。
因人力原因有些细节方案问题没太做深度评测而是直接选择业界实践较多的成熟方案。
主要参考思路和上下文管理的过程。
文中用到了一些内部平台的基础能力比如 rag、代码管理、deepwiki等外部开发者如需使用需要自行寻找替代品。
背景简介奥德赛研发平台是 ICBU 买家技术的 TQL淘宝基于开源 GraphQL 的定制版本 研发平台大量开发者会在上面通过编写 TQL 脚本来实现 BFF 接口。
近一年 AI Coding 工具层出不穷在深度使用了 cursor、claude code 等顶尖产品后大量解放了自己在前端的生产力所以就在想让团队的后端兄弟还有姐妹们也吃好点告别纯手搓代码这不BFF 的 Agent 模式小 D 同学来了技术选型原来的平台长这样开发者在上面可以完成编码、调试、发布等工作要在现有的平台内集成一个 Agent 且能感知前台页面的环境甚至对页面进行操作一般有三种方式默认都采用 AI 辅助 Coding如果只是一般的对话 Agent直接用一些开放的应用平台搭建就完事了不必自己写。
综合考量了三种方案后我们决定优先保证用户体验开发效率选择了第三种。
宿主页面 Iframe 嵌入 Agent整体的数据流转概要宿主页面暴露 脚本内容、请求参数、调试结果 等上下文信息以及脚本执行、脚本 Diff 预览等操作页面的工具接口给 Agent。
Agent 感知宿主页面上下文环境然后请求服务并推送内容编辑、脚本执行等工具执行 action 给宿主页面。
流程概要图如下应用框架选择应用框架选择上不做过多对比直接给出我的选择不一定最好但是一定很契合我当前的场景。
集团 Faas 基建简介FaaSFunction as a Service函数即服务平台是一个面向研发人员的全托管、事件驱动、弹性伸缩的 Serverless 计算基础设施其核心目标是让开发者只关注业务逻辑代码本身无需操心服务器运维、资源扩缩容、中间件对接等底层细节。
划重点Faas 可以让你只关注代码免运维。
这正是当前这种轻量 Agent 需要的。
Next.js React前后端应用框架我选择了Next.js React为什么集团有前后端一体化的框架可以直接用。
前后端共用一套开发语言Nodejs、JavaScript并集成在一个应用中AI Coding 非常友好谁用谁知道。
可以真正做到只关注功能AI 帮你做实现。
LangGraphLangChain [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-
5-haiku的模型。
那么接下来的重点就是从能用到好用后续的内容非常关键。
也就是上下文工程的优化接下来的优化是不分顺序的因为上下文工程是一个综合命题比如你往往需要在系统提示词优化完成后发现某些工具调用不符合预期又回过头来优化系统提示词。
不同类型的上下文往往是交叉影响的要根据具体场景做甄别。
系统提示词优化Anthropic 官方推荐了提示词优化[2]的诸多技巧非常有效下面介绍我高频用到的几个基础技巧更多技巧真的强烈建议直接学习原文。
角色设定角色设定可以显著提高模型的性能参考Qwen 的 MOE 机制并改进模型的注意力发现更多的关键问题。
使用 XMLAnthropic 官方推荐使用 XML 构建提示词[3]有诸多好处实测非常有效。
遇到模型不遵循指令或上下文过长出现遗忘/幻觉时试试更换提示词格式为 XML。
使用示例也就是 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命令上第一条命令比较有意思在没有这条命令之前模型会过于自信即便已经是最严谨状态 temperature0拿到用户需求后直接开始上手写 GraphQL 出现了与 TQL 非常不相符的代码。
用第一条指令弱化了模型的信心模型才开始谨慎地调用知识库了解更多上下文信息。
TQL 在 GraphQL 的扩展内容部分为了防止提示词内容爆炸我做了一轮精简只保留基础介绍部分索引知识放在提示词中并引导模型在使用到具体能力的时候动态通过工具查询具体知识从而保护了模型的注意力。
自定义指令directives 非常重要系统有大量的扩展指令具体用法需要通过工具查询相关知识 在使用这些指令时一定要先学习指令的用法不要盲目使用。
指令一般紧挨着字段或函数 fieldA 指令名 或 funcA(xx) 指令名 这样使用。
以下是常用指令格式: 指令名:描述|参数: ![CDATA[{ 转换类:{unwrap:解包/对象拍平/对象解构,toBool:转布尔|not,encode:编码|protocolhttp,wrap:包装,toInt:转整数|offset,toUpperCase:转大写,decode:解码|protocolhttp,autoflat:自动扁平化}, 字符串操作:{suffix:添加后缀|value,prefix:添加前缀|value}, 条件过滤:{hide:隐藏字段,filterBy:表达式过滤|spel,aviator,include:条件包含|if!,skip:条件跳过|if!,default:默认值|value}, 列表操作:{index:取元素|offset,ascBy:升序|path}, 逻辑脚本:{mapping:映射|func,const:常量|value,beforeExecutefalse}, 高级扩展:{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: 数字脱敏末位补0value 【输出与重命名】 - 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 serverdeepwiki 的 mcp server远程工具主要用来召回上文知识库建设的内容由于其提供的工具比较全而我实际只会用到其中的部分所以在系统中设计了白名单机制只加载白名单内的工具还是那句话节约上下文保护注意力。
btwmcp 的鉴权认证需要自行参考官方文档不做赘述。
本地工具编辑脚本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 在调用【执行脚本】的方法时本质上还需要前端页面响应点击执行按钮后然后把执行结果回传给 AgentAgent再继续处理。
聪明的你肯定想到了前后端用全双工通信维护一个长连接服务端调用 runScript 时实际上什么也不做就等待前台页面执行完工具后将结果传回服务端服务端再继续后续的状态流转链路。
是的确实如此很多带 GUI 的工具也确实是这么处理的在 LangGraph 中称之为中断也就是人们常说的 HITLhuman in the loop遗憾的是Faas 的设计之初是不支持长连接的def 上函数能设置的最长保活时间是 300s默认 50s。
所以我们肯定得曲线救国了 允许我先卖个关子 上下文管理其实有了上面能力建设现在已经有了一个可以帮助用户编写脚本执行验证的智能体了但是面临两个非常现实的问题模型本身不支持连续对话会话需要自己做持久化管理尽管在前期做了大量节约上下文窗口的优化工作但真正要处理一个复杂脚本的时候模型上下文窗口会快速膨胀导致模型注意力变得稀疏出现幻觉准确率下降用户体验下降。
一轮简单的对话只要包含工具调用就会耗掉 1/4 5w的 token。
因为在默认的设计中每个节点的返回消息都是默认拼接到 LLM 消息列表中的。
连续对话先来处理简单的连续对话实现非常简单。
也可以参考 LangGraph checkpoint [5]的设计可以从任意节点重新开始。
BFF Agent 暂时没用到这个能力。
在用户开始一次新对话时创建一个 sessionId用来记录存储消息列表在消息列表每次发生变化的时候持久化存储起来这里我用的 tair用户有新输入时直接 sessionId 记录的历史消息列表做拼接合并发给大模型就可以实现连续对话了。
UI 工具是如何调用的在支持连续对话的基础上就有了一个非常巧妙的设计Agent 的接口设置为 SSE 的方式服务端在收到请求后流式向前端推送分片消息同时将每轮消息持久化存储起来。
SSE 的方式只支持服务端单向给客户端推送消息当调用到需要前台 UI 响应的工具时在把工具调用信息输出给前端后直接退出 LangGraph 的状态流转结束此次请求。
是的直接结束。
前端特殊处理该类工具调用后含 diff 脚本接受或拒绝 Agent 的修改执行脚本等增加一条隐藏消息如【脚本执行成功结果是xxx请继续处理】重新调用 Agent 的流式接口接口内部取出之前持久化的消息内容拼接上隐藏消息从头开始初始化 AgentGraph 的调用。
用户在前台看到的实际上发送给模型的至此就实现一个可以自己执行、验证、修复、再执行的智能体。
对应的会话中断恢复也就不难处理了因为在服务端完整缓存了会话内容中断后只需要发送新消息接口内部就自动拼接上之前的会话重新走进 Agent 的状态流转。
会话压缩解决了连续对话的问题上下文超长的问题怎么办呢现在答案是压缩只保留摘要信息。
不知道以后模型是否可以自行处理压缩工具响应结果既然调用外部工具如此废 token那么如果先将工具的调用结果缓存起来再用一个工具函数去精准检索内容并只把检索后的内容放到消息列表中就能极大的缓解问题了。
于是我在 Agent 内部增加了工具结果缓存 检索详情的 tool summaryToolResult)在工具调用结束后增加如下机制当然summaryToolResult 的任务非常明确普通的模型也有不错的据实回答问题的能力所以这里选择更轻量的 Qwen 模型做检索召回还能省不少钱为了尽可能让 summaryToolResult 在回答时结构化且保留原始信息我对工具的提示词作了优化使用 xml 格式响应。
是的还是 anthropic 优化提示词的那一招。
?xml version
0 encodingUTF-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 requiredtrue/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 requiredtrue/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 locationFIELD/location locationQUERY/location !-- 可应用的位置FIELD, QUERY, FRAGMENT_SPREAD, INLINE_FRAGMENT 等 -- /locations arguments arg requiredtrue/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 ruleXML 中的示例代码直接写入 example 标签内/rule rule如果某个字段没有值可以省略该标签或留空/rule /outputFormat outputHint如果查询内容不涉及上述特殊功能类型则按照常规方式简洁输出关键信息无需使用 XML 格式。
/outputHint /prompt这样 qwen 模型也能高质量输出结构化的信息工具输出示例包含具体字段的名称、描述、类型、出入参数等field namefreight/name type复合类型/type description物流模型/description arguments arg required\false\ namedispatchCountryCode/name typeString/type description发货地代码/description /arg arg required\false\ nameneedAlibabaGuaranteed/name typeBoolean/type description是否返回半托管物流信息false不返回null 或 true均返回/description /arg arg required\false\ namemoqType/name typeString/type descriptionMOQ档位实验推全全部第一档 first/description /arg /arguments /field对工具响应做优化后同样一个问题主 Agent 的上下文窗口占用只需要花不到原来 1/10 的 token 就能解决问题了。
从 5w 下降到 4k上下文压缩但即便是对工具响应进行了压缩也还是会有窗口超限的问题为什么 cursor 、cc 等产品好像从来没给用户暴露过这类问题呢GitHub 上有个 cc 的逆向工程秘密就藏在上下文自动压缩的机制里 Claude-Code-Reverse[6]。
比较靠谱的说法是有两个触发自动压缩的时机上下文窗口即将超限。
据传 cc 是窗口超过 82% 时触发自动压缩新对话与历史对话毫无关联。
因为当前场景Agent 的负担还算比较轻所以我只选择了第一种压缩机制就足够用了。
因为上下文压缩实际上是有损的一旦触发压缩Agent 就似乎忘记了之前的任务所以 CC 在压缩的时候非常的谨慎所以 BFF Agent 也直接复用了这份提示词做压缩。
在这个基础之上为了使用户近期的对话被完整保留避免一旦压缩节点就瞬间遗忘的现象压缩时我默认会完整保留自用户近 3 轮开始对话后的消息列表。
最终的线上配置为{ enabled: true, // 启用压缩 dangerThreshold: 80, //
当上下文窗口使用超过 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 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】