很多想转行做 AI Agent 的朋友,以及刚入门的研究生,最喜欢问的一个问题就是:我是不是应该先学 LangChain?或者直接上手 Dify 搭个工作流?这类问题我每年都收到几十次,每次的回答都很一致:先别急着碰框架,框架会给你一种“什么都能做”的错觉,但同时也会让你在遇到真正问题的时候完全无从下手。AI Agent 这个方向虽然叫“未来”,但它底层的技术栈和工程逻辑,其实比很多人想象的要朴素得多。这篇内容,我想结合自己从传统后端转战 AI 应用开发的真实路径,聊聊新手和转行者到底应该先学什么,怎么绕开最容易被浪费的那三个月。
1. 为什么“一上来就啃框架”是新手最大的坑
不是框架本身有问题,而是你把它当成了学习的起点。LangChain、Dify、CrewAI、AutoGen,这些框架确实解决了 Agent 开发中绝大多数的重复劳动,比如 Prompt 模板拼接、工具调用循环、记忆管理、多 Agent 协作编排。但也正因为它们抽象层级太高,新手往往会陷入一个特别尴尬的局面:照着文档能跑通 Demo,一旦 Demo 稍微改改、加点需求,直接就懵了。
我见过不少转行者,简历里写了“熟悉 LangChain”,问他“如果你的 Agent 在调用工具时连续返回三次错误,你如何让它自行恢复?”答不上来。这不是个例,而是普遍现象。原因是,他的“熟悉”只是知道怎么构造一个 Chain 对象,并没有理解背后的 ReAct 模式、Function Calling 协议、Prompt 与工具返回的交互逻辑。
另外还有一个很现实的问题:**框架版本更新太快,文档经常落后于代码。**我印象很深的一次是,项目里要升级 LangChain 的版本,从 0.1 到 0.2,光是一个AgentExecutor被拆成create_react_agent的迁移,就让团队里的新人折腾了两天。你可以说我这是特例,但老手都知道,框架生态每天都在变,如果你的底层认知没有建立起来,今天学的 API 可能三个月后就废弃了,而底层 LLM 的交互逻辑、Token 的消耗方式、工具调用的编排本质,这些才是十年都不会变的东西。
还有一个问题上,很多人没有意识到,现在的 Agent 框架不只是“一个库”,它们往往是“一套世界观”。LangChain 的世界观是 Chain + Tool + Memory,Dify 的世界观是可视化工作流,CrewAI 的世界观是 Role + Task + Team。你上来就接受了某一套世界观,后面再切换别的工具时,思维会被严重禁锢。我身边有朋友一直被 LangChain 的LCEL语法带着走,让他纯手写一个 ReAct 循环,他居然会觉得无从下手,这就是被框架驯化了的典型症状。
当然我不是让所有人都不学框架,而是要说明白一个顺序问题:**在框架之前,你需要先拥有“手搓”的能力。**当你对底层协议足够清楚时,再去看框架,你会觉得它的每个抽象都有迹可循,而不是在变魔法。到那个阶段,框架反而是节省时间的好帮手。
2. 动手搭 Agent 前,先搞懂这四个地基概念
这部分是我对外培训时必讲的内容,也是我认为适合所有新手和转行者的“最短必修清单”。我把它们拆成四个你能在下周就上手验证的概念,而不是泛泛地让你去学数学或读论文。
2.1 大模型调用不是魔法,本质就是一次接口请求
很多新手容易把 LLM 想得太神秘,动不动就觉得里面有“智能体”“推理模块”,实际上落到工程层面,你调用的就是一个 HTTP 接口。你给一个字符串列表进去,它给你吐一个字符串出来,仅此而已。
我建议新人第一周就做一件事:拿任意一个模型 API,用 Python 写一个最简请求,感受一下输入输出。这里有个很容易被忽略的细节,messages的构造方式直接决定了模型的输出质量,尤其是system与user的分工。很多人把所有约束都塞进user,结果模型就是不听你的;你要是把一个清晰的system写明白,模型听话的程度会显著提升。
from openai import OpenAI client = OpenAI(api_key="your_key", base_url="https://your_provider") response = client.chat.completions.create( model="your-model-name", messages=[ {"role": "system", "content": "你是一个严谨的代码助手,只输出能直接运行的Python代码,不要任何解释。"}, {"role": "user", "content": "写一个快速排序。"} ], temperature=0.2 ) print(response.choices[0].message.content)这段代码不应该让你觉得“就这”,而应该让你意识到一个关键问题:模型现在只是一个“输入输出非常强”的壳,所有智能感都来自调用方怎么组织和流转信息。你要想清楚的一点是,如果你连原始 API 交互都没摸熟,就直接上框架,你根本不知道框架替你做了什么。
2.2 Token:你的成本、长度与性能瓶颈全在这
Token 这个概念,看起来简单,实际上它牵涉到 Agent 开发里最重要的一切。你 Prompt 太长会捅到上下文窗口,你还得为每个请求付钱,Token 的估算方式还直接决定了你的缓存命中率。
可以大概给个经验值:中文场景下,1 个汉字约等于 1~2 个 token,这取决于模型和 Tokenizer。英文大概 4 个字符等于 1 个 token。很多人不知道的是,**工具返回的内容也是要计费的。**你的 Agent 调了个数据库查询,返回了完整表结构,这个表结构会作为下一轮 Prompt 的一部分再发给模型,于是 Token 费用翻倍了。
我在实际工程里吃过一次亏:一个内部报表 Agent,每次查询都直接把原始 SQL 结果全部返回给模型,几千行数据,一次调用花掉几十万 Token。后来加了一步精简器的逻辑,把返回内容先做关键词提取和摘要,Token 成本直接降到原来的十分之一。这个优化的思路你只有在理解了 Token 机制之后才做得出来,而框架通常只会告诉你“这里支持传工具返回,很方便”,它不会提醒你烧了多少钱。
2.3 工具调用(Function Calling):Agent 之所以“能干”的根因
Agent 和普通 Chat 的区别在哪?普通 Chat 是:你问我答。Agent 是:模型根据你的问题,判断需要调用某个工具,拿到结果后,再继续推理。这里面最关键的技术就是 Function Calling——让模型输出一个结构化的“函数调用指令”,而不是直接输出文本。
很多人刚入门时以为“让模型调用工具”就是把工具描述写在 Prompt 里,然后用text解析模型的输出。这确实是最原始的方式,但实际工程里,各大模型厂商都提供了原生的工具调用接口,模型会输出一个 JSON,包含工具名和参数。我用一个简单例子来说明,假设你有一个查询天气的工具:
tools = [ { "type": "function", "function": { "name": "get_weather", "description": "查询指定城市的当前天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名,比如北京"} }, "required": ["city"] } } } ]当你把这个tools传给模型后,模型不会直接回答“北京的天气是晴,16 摄氏度”,而是先返回类似这样的一段 JSON:
{"name": "get_weather", "arguments": {"city": "北京"}}接着,你的代码负责真正调用天气 API,把结果(“晴,16 度”)再以tool角色的消息发回给模型。模型看到结果后,才组织自然语言回答你。这就是整个 Agent 闭环最核心的单元。
而 LangChain 这类框架,实际上就是把这个“闭环”封装成了AgentExecutor或者新的LangGraph状态机。如果你不理解上面这个循环,一旦工具多了、调用链长了,你就会在排查问题时完全迷失:到底是工具没写好,还是模型没理解,还是返回消息格式错了?相信我,这个 Bug 我看过无数次,而排错的唯一依靠,就是你对底层循环的熟悉程度。
2.4 记忆与 RAG:先看看到底有哪些“记忆”
记忆这个概念在 Agent 里被玩得很花,短期记忆、长期记忆、向量记忆、实体记忆……新手很容易被绕晕。我用最朴素的分法帮你理一下:
- 短期记忆:就是放在当前
messages里的对话历史。模型天然只能看到这些。 - 长期记忆:将重要的信息存到外部系统(如数据库或向量库),需要时再通过检索塞回上下文。
- RAG(检索增强生成):本质上是一种“先检索后回答”的模式,它让模型在进行生成前先获取外部知识库里的相关片段。
建议新手不要一上来做很复杂的记忆系统,先搞清楚一件事:**模型的上下文有限,你不可能把所有东西都塞给它。**当你意识到要控制输入长度的时候,自然会遇到 RAG、摘要、向量检索这些议题。Dify 这类平台确实可以帮你搭建一个带知识库的 Agent 应用,但我强烈建议你至少手写一次“读取文本 → 分割成块 → 向量化 → 检索 → 组装 Prompt → 调用模型”的全流程。不用自己训练向量模型,直接用 OpenAI Embedding 接口或开源模型就行,这样 50 行代码以内就能跑通,你会对 RAG 建立真正的体感。
3. 我给新手和转行者的推荐学习路径:先手写,再框架
聊完了地基,我给你一条可执行的路线。这条路线在公开课上我用过三次,验证过不少学生确实能在四周内建立真正的 Agent 开发手感。
3.1 第一步:用模型 API 做一个“会查天气的机器人”(不要用 Agent 框架)
我这里特别强调不要用 Agent 框架。因为我们要练的就是前面提到的“函数调用闭环”。
你可以用 FastAPI 写一个最简接口,或者干脆写一个命令行脚本。功能很简单:用户问“北京天气怎么样”,你的程序先判断用户意图,然后调用高德天气或 OpenWeather 的接口,再把结果返回给模型组织语言。四步重复几遍,你就有体感了。
编程基础如果比较弱,可以直接用requests和openai这两个包来完成。第一步先不要考虑多轮对话,只做单轮,把工具调用跑通。
from openai import OpenAI client = OpenAI(...) def get_weather(city: str) -> str: # 这里写真实的天气API调用,简化起见直接返回固定字符串模拟 return f"{city}的天气是晴,23度" while True: user_input = input("请提问:") messages = [{"role": "user", "content": user_input}] resp = client.chat.completions.create( model="...", messages=messages, tools=[...你定义的工具...] ) msg = resp.choices[0].message if msg.tool_calls: # 找到第一个工具调用 tool_call = msg.tool_calls[0] func = tool_call.function result = get_weather(**json.loads(func.arguments)) messages.append(msg) # 把模型的“工具调用意图”消息加入历史 messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": result }) final = client.chat.completions.create( model="...", messages=messages ) print(final.choices[0].message.content)这段代码跑通之后,你已经掌握了 Agent 最核心的一环。往里加新的工具会变得很自然:多定义几个函数,在tools列表里声明它们,然后在代码里做一个name -> function的映射表就行。
3.2 第二步:理解 ReAct,把有向环变成你脑子里的图
有了最基础的 Tool Call 循环之后,你要正式认识一个叫 ReAct 的概念。ReAct 是 Reason + Act 的缩写,思想很朴素:让模型反复执行“思考 → 采取行动 → 观察结果 → 再思考”的循环,直到得出最终答案。
为什么单独把这一步提出来?因为你后面看任何框架的文档,都会反复看到agent参数有react或function这类选项,你如果不懂 ReAct,就无法理解某些 Agent 之间为什么行为和成本差异巨大。
一般的 ReAct Agent 在每一步都会输出类似这样的结构:“Thought: 我需要查询用户数据库中的订单状态 → Action: 调用查询订单工具 → Observation: 拿到订单状态为已发货”。这就是它“推理”的过程。
实操上,你不一定非要手写这个循环。OpenAI 这类商业模型已经帮你把 ReAct 的大部分“思考”压缩到了 Function Calling 协议里。但你应该理解它的意义,这样你才会明白为什么一个 Agent 调用工具的次数多了之后,Token 消耗会爆炸——因为每一轮思考都会把所有历史再发一遍。了解了这个机制,做成本优化和上下文裁剪时才会有明确的方向。
3.3 第三步:现在再去学框架,你会觉得它是降维打击
当你手写过一遍工具调用循环、理解过 ReAct,再回头用一个框架,你的视角会完全不一样。看 LangChain 文档时,你能猜测出它内部大概怎么拼消息、怎么循环;看 Dify 的工作流节点时,你能脑补出它底层对应的是哪种 API 调用。
我实测下来的感受是:这个阶段去学框架,效率奇高。因为你不再是被动接受文档说辞,而是带着“我大概知道这底下是什么”的预期去看新工具。偶尔遇到框架的报错信息模糊不清,你也能靠底层知识去猜它在哪一步挂了(是解析输出阶段?还是工具执行阶段?),排查速度比起从零开始完全是两个量级。
4. 框架不是不能学,问题在于怎么选
等你有了基础,再选框架时,就不怕别人问你“你觉得 LangChain 好还是 Dify 好还是 CrewAI 好”了。我的回答通常是:看你想要什么。
为了帮你快速建立坐标系,我把主流的几类框架做了一个“功能倾向性”的划分:
| 框架/平台 | 定位 | 适合的人群 | 优点 | 劣势 |
|---|---|---|---|---|
| LangChain / LangGraph | 开发库 | 想深度定制、以代码为主的开发者 | 灵活度高,生态成熟,支持复杂状态编排 | 学习曲线陡,API 更新频繁 |
| Dify | 可视化平台 | 产品/运营/刚入门的人 | 上手快,带知识库和流程编排界面 | 定制逻辑受限,深度场景要写插件 |
| CrewAI | 多 Agent 协作框架 | 想做“角色分工+团队协作”模式的场景 | 概念清晰,角色编排简单 | 多 Agent 通信调度复杂,调试难度不小 |
| AutoGen | 多智能体对话框架 | 研究/实验向 | 多 Agent 会话流灵活,适合探索 | 工程化配套能力弱,生产落地难度高 |
说实话,这些框架之间不存在绝对的“哪个好”,只有“哪个更适合你当前的目标”。比如你想快速做一个带知识库的问答机器人验证想法,Dify 确实可以让你在一个下午就上线 Demo。但你如果想把 Agent 嵌入到自己复杂的业务系统里,做权限管控、多轮状态管理、数据库事务协调,那么 LangGraph 这类偏工程化的方案会更稳妥。
这里顺便纠正一个常见的误区:**别以为用了框架就不需要写代码了。**哪怕是 Dify,一旦你涉及复杂工具逻辑、私有化部署、消息回调、外部系统对接,你就得写 Python 或 JavaScript 插件。框架只是帮你省掉了“重复造轮子”的时间,不能帮你省掉“理解业务”和“写胶水代码”的工作。
我个人的建议是:第一个正式项目可以选一个“中间路线”——用手写脚本把核心逻辑实现,再套一层轻量的 FastAPI 服务,把工具调用、Agent 推理和业务接口对接到一起。这样比直接用 LangChain 多写不了多少代码,但对你的能力提升非常明显。等你把这一套流程跑顺了,再评估是否有必要引入 Dify 这类平台来降低维护成本。
5. 一个适合入门的项目:个人知识库问答助手
项目练手,我特别推荐做“知识库问答助手”,因为它的链路完整、需求直观,而且在面试或转行作品集里都能直接展示,比单纯跑官方 Demo 有说服力得多。
这个项目的核心链路是:文档上传 → 文本分割 → 向量化 → 存入向量库 → 用户提问 → 向量检索相关片段 → 组装 Prompt → 模型生成回答。下面我把每一步容易踩的坑和背后的原理写清楚。
5.1 文档加载与分割:别小看这一步
很多人文档没清理干净就开始做向量化,结果检索出来的内容里有大量无关片段,甚至还有“下一页”“目录”这种残留。建议先用正则或unstructured这类库做一下简单的清洗,再去切块。
文本分割有两个参数需要调:chunk_size(块大小)和chunk_overlap(重叠长度)。为什么需要重叠?因为如果一句话刚好被切在边界上,检索时它的语义不完整,模型答出来的东西就会支离破碎。一般情况下,中文字符可以设置 500~800 的 chunk_size,重叠 50~100 个字符。你可以先用这个区间跑,再根据实际问答效果调整。
from langchain_text_splitters import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( chunk_size=600, chunk_overlap=80, separators=["\n\n", "\n", "。", "!", "?", ";", ",", " "] ) chunks = splitter.split_text(cleaned_text) print(f"共分成 {len(chunks)} 块")值得说明的是,separators的顺序很重要,它是按优先级来尝试分割的。先按段落\n\n切,再按句子标点切,最后才按空格和字符兜底。这样能最大程度保证每个块是语义完整的文本片段。
5.2 向量化与存储:选型和成本控制
向量化这一步,入门阶段直接用 OpenAI Embedding 接口(text-embedding-3-small)或者国产的 BGE 开源模型都行。OpenAI 的优势是无需部署、效果稳定;BGE 的优势是免费、可本地部署,保护隐私。
如果你的知识库不超过几百篇文档,用Chroma这种嵌入式向量库就足够了,它可以直接跑在本地,不需要额外运维一个数据库服务。如果文档量上了百万级别,再考虑 Qdrant、Milvus 这些专门的向量数据库。
这里有一个很多入门教程不会讲的点:**向量化是按 Token 计费的。**一篇长文档切成几十个 chunk,可能要几千 Token,如果重复测试很多次,费用容易被忽略。我建议在项目早期,把向量化的结果本地缓存成文件,或者存到向量库里长期复用,不要每次测试都重新跑一遍向量化。
5.3 检索与答案组装:这是整个项目最体现功力的地方
向量检索返回的是“语义上相似”的片段,不代表这些片段直接可以用来回答。大多数情况下,你还需要做一层“答案组装”:把检索到的多个片段按相关性排序,截取前几个,然后连同用户问题一起组装成新的 Prompt。
很多人不知道的是,检索的结果有时候会自相矛盾。比如你问“这个产品的退货政策是什么”,文档 A 说“7 天内可无理由退货”,文档 B 说“生鲜类产品不支持退货”。模型如果同时看到这两个片段,很可能随机挑一个回答,造成结果不一致。
遇到这种情况,我一般会在 Prompt 里加一条指令:“当检索到的内容存在冲突时,明确说明存在歧义,并要求用户提供更具体的信息。”同时适当减少检索片段的数量(比如 3~4 个),让信息更聚焦。
5.4 评测:让项目真正“拿得出手”的关键一环
新手做这类项目最容易忽略评测,代码跑通就算完事。实际上,你往作品集或简历上一放,对方随便抽几个刁钻问题,你就可能露馅。
建议建立一份简单的评测集:30~50 个真实问题,覆盖简单事实、对比、总结、编码等不同类型。针对每个问题,手动标注期望回答要点。然后写一个简单的评测脚本,对 Agent 的每次回答做“是否包含要点”的判定,统计召回率。
这一步不需要很智能,哪怕只是枚举关键词也算一种基础评测。它带来的好处是你再改 Prompt 或调整 chunk 大小时,有了客观指标,而不是“感觉回答变好了”这种幻觉。很多 Agent 开发的老手都会告诉你:Prompt 改来改去,没有评测集支撑,最终你根本不知道哪些改动是有用的。
6. 转行者最容易踩的三个坑
文章到了最后,我想聊点比技术更重要的东西。我见过不少转行者,技术上很快能上手,但思维方式上还在用老一套,结果在实际项目里吃亏。这三个坑非常有代表性,值得仔细说一遍。
6.1 把 Agent 当成另一门编程语言
传统开发的特点是:确定性逻辑。你写一个if,它就一定会走那条分支。但 Agent 不一样,它的输出有概率性,同样的 Prompt,这次调用和下次调用的结果可能不同。很多转行者刚接触时极度不适应,老是想着“怎么让模型 100% 按我的意愿走”,结果折腾半天,发现做不到。
正确的思路是:**不要试图让模型百分之百可控,而是通过流程设计,把不确定的影响限制在一个小范围内。**比如调用工具时,你尽量不用自然语言让模型“自己看着办”,而是让模型输出严格的 JSON 参数;对模型返回的解析,尽量做兜底校验,不合法就重新请求或走异常分支。这样的设计逻辑,比单纯调 Prompt 重要得多。
6.2 忽视评测,凭感觉调优
这一条承接了前面评测的部分。很多转行者跟我以前犯过的错误一样:项目能跑出几个漂亮的回答,就急着展示。但一问边界情况,比如用户的问题包含错别字,或者知识库里没有答案,系统就崩了。
其实这不完全是坏事,边界情况出现问题很正常,但你要有处理它的预案。我的建议是:从第一个 Demo 开始,就顺手写一个“难以回答的问题列表”,持续往里加。这个列表以后就是你的回归测试集,每个版本的改进,都知道有没有把之前的问题弄好。
6.3 只看新不看旧,忽略经典技术栈
最后这一个坑,可能有点反直觉。现在很多新手盯着 LangChain、Dify,却忽视了底层的基础技术栈。AI Agent 不是凭空冒出来的技术,它依赖的是数据库、缓存、消息队列、API 网关、监控日志这些传统后端能力。如果一个转行者连 SQL 都写得不太利索,对 HTTP 协议理解又不深,那他做 Agent 项目时,一定会在工程化环节被卡住。
说个实在的例子:很多 Agent 应用需要与微信/钉钉这类 IM 工具集成,这就需要你理解回调、消息签名、Webhook 重试机制。这些知识你翻遍所有 Agent 框架的文档都学不到,它们是通用的后端基本功。所以在我给转行者的建议里,几乎没有“多学几个 Agent 框架”这一条,更多的反而是“把 Python、SQL、HTTP、基础运维补齐”。
我自己带过的一个成功转行者,之前是做运营的,Python 基础一般,但他非常听劝:花了三周老老实实手写工具调用,再花两周把 FastAPI 和 MySQL 的基础过了一遍,后面再做 LangChain 项目时,速度反而比一些科班但直接上框架的同事还快。原因很简单,他不会一遇到奇怪报错就卡死,他能看懂日志,能定位问题出在“工具执行”还是“模型返回”,这种能力说实话不是框架给你的,而是基础功换来的。
所以这篇文章的最后,我还是想重复一下开头的观点:AI Agent 是一门工程学科,不是套壳魔法。框架当然可以学,但请把它放在你掌握底层概念之后,让它成为你的效率工具,而不是你所有认知的来源。新入行的朋友,先扎扎实实把“模型调用、工具调用、上下文、检索”这四件事用最原始的方式跑一遍,再来谈框架选型和架构设计。路不怕慢,就怕一开始就跑歪了方向。等到手里有项目、脑子有底层的状态,那时候你再看各种新出的框架,眼里就不再是恐惧,而是清清楚楚的“这不就是个封装好的某某东西嘛”,这种从容感,才是真正入门了的标志。