自学AI应用开发半年后,我为什么还是报了课?

先交代个背景:我花了半年时间自学 AI 应用开发,从刚开始拿着 API 文档一行行调接口,到后来能自己做出带知识库的问答机器人。本来以为这条路能一直走下去,但最后我还是报了个课。这篇文章不吹不黑,就把我这半年的真实经历、踩过的坑,以及最后为什么做出这个决定的思考过程,原原本本写出来。如果你也在自学 AI 应用开发,或者在犹豫要不要报课,这篇文章应该能给你一些参考。

1. 先说说这半年我到底学了什么

1.1 前三个月:会调 API 的兴奋期

刚起步的时候,我做的事情其实很简单。先把 Python 基础过了一遍,其实也没学多深,能用requests发 HTTP 请求、会处理 JSON、能写简单的循环和函数,我就觉得自己“准备好”了。然后我开始申请各种大模型的 API key,照着文档敲代码,第一次成功让模型帮我写出一段周报的时候,那种成就感确实挺强的。

这个阶段我特别爱研究那些参数,temperature、top_p、max_tokens,每个都翻来覆去地试。我还记得当时调temperature的场景:设为 0 的时候模型输出稳定得像复读机,设为 1.5 的时候又放飞自我,什么离谱的话都敢说。后来我才明白,这些参数本质上是控制模型采样的随机性,温度越低越保守,越高越发散。对于大多数应用场景,temperature设置在 0.2 到 0.7 之间比较合理。我做了个小工具——把一段口语化的产品介绍改写成正式商务文案,用temperature=0.3加一个简单的“改写”指令,效果居然还不错。那阵子我到处给朋友演示,觉得自己已经是“AI 开发者”了。

现在回头看,这个阶段虽然简单,但非常必要。它帮我建立了一个基本概念:大模型应用开发,本质上是“用代码去编排模型的智能能力”。你不需要重新发明模型,而是要搞清楚模型能做什么、怎么让它稳定地做、做了之后怎么接进你的业务流程。

1.2 后三个月:从“会调用”到“能交付”之间的断层

兴奋期过去之后,我开始琢磨做一个真正能用的东西。当时接了一个需求——想做一个内部知识库问答工具,把一堆 PDF 文档传进去,然后像聊天一样问问题,它把答案和出处一起返回。

于是我开始接触 RAG,也就是检索增强生成。这趟水比我预想的深多了。文档加载、分块、向量化、存储、检索、重排、生成,每一步都有无数细节。最典型的一个问题:我把一份几十页的合同文本按固定字数切块,每块 500 个字符,结果用户问“合同里违约金比例是多少”的时候,答案怎么都检索不回来。原因是这个问题涉及的内容横跨了两个分块,语义被切断了。后来我把分块策略改成按 Markdown 标题结构切,并且让相邻块有 50 个字符的重叠,效果一下子好了很多。

但更大的问题在于:我发现网上教程很多,但大多数都是“Hello World”级别。它们会教你怎么用 LangChain 加载文档、怎么调用 OpenAI API,但没人告诉你分块大小到底设多少合适、top_k召回多少个向量、embedding 模型选哪个、向量数据库用 Chroma 还是 Milvus。这些东西只能靠我一遍一遍试错去猜。我一度把top_k从 4 调到 20,效果没变好反而变差了,因为召回的噪声多了,模型反而被无关信息干扰。这些经验,都是拿时间砸出来的。

1.3 试水 Agent 和对话应用时被工具链淹没

后面我又对各种 Agent 开发框架产生了兴趣。LangChain、LangGraph、Coze扣子、Dify、FastGPT,我全都注册体验了一遍。低代码平台确实震撼到我了——不用写代码,拖拖拽拽就能搭一个能够联网搜索、调用工具的智能体。我拿 Coze 做了一个能查天气、查新闻的智能体,整个过程不到半小时。但越是用这些工具,我越发现一个问题:模板化的应用好做,定制化的应用很难。一旦涉及私有数据、复杂权限、特定的交互逻辑,低代码平台就显得力不从心。

这段时间我的状态可以用一个词形容:信息过载。工具太多了,每个都有自己的一套概念体系,我今天学一点这个,明天学一点那个,每个都停留在“会用”的层面,但没有一个让我觉得“我能拿它接活”。更让我焦虑的是,我不敢确定自己学到的东西是不是行业主流做法,也许我花两周研究的框架,业内早就换新方案了。

2. 真正卡住我的不是“不会”,而是没有判断标准

2.1 调 Prompt 全靠玄学,感觉像在掷骰子

在我自学进入第三个月的时候,一个绕不开的坎出现了——Prompt 调优。一开始我觉得写 Prompt 很简单,不就是告诉模型要做什么吗?但真正做应用时,我发现同样的指令,改几个字,效果就可能天差地别。

举一个真实例子。我做了一个客服问答机器人,最初的核心指令是:“你是一个客服助手,请回答用户的问题。”后来我为了提升效果,把指令改成了“你是一个专业、友好、耐心的客服助手,请认真分析用户意图后给出准确回答。”我以为加了“认真分析”效果一定更好,结果跑了一轮测试,效果不仅没有提升,反而出现了过度解释的情况——用户问“退货流程”,它非要先分析半天“用户情绪”。问题的根源在于:我根本没有一个客观的评估标准,我只能靠手动试二十条问题,凭感觉判断“好像变聪明了”或者“怎么变傻了”。

后来我在别人的项目里看到一个比较科学的 Prompt 模板,才恍然大悟。真正实用的 Prompt 应该分成四部分:

  • 指令:告诉模型精确要做什么,动词开头,不要含糊;
  • 上下文:给它必要的背景信息;
  • 格式约束:明确输出的结构和样式;
  • 兜底策略:告诉模型遇到不知道的东西怎么办,不要瞎编。

我之前写的 Prompt 大部分是“情感鼓励词”加一个笼统的要求,比如“请仔细分析”“请认真回答”,这些对模型来说没有任何信息量,反而会稀释真正重要的指令。我还学到一个更底层的观念:Prompt 本质上是一种编程语言,只是它的“编译器”是神经网络。你不能靠情绪价值来引导它,而要靠清晰、结构化、可验证的信息。

2.2 检索效果差,分不清是哪个环节出了问题

做知识库问答那段时间,我每天都会被一个声音折磨:为什么这个问题答不好?是文本切块切坏了?是向量化模型选得不对?是相似度阈值设太高了?还是生成的 Prompt 没写对?在没有方法论的时候,排查问题只能靠“逐个环节拆开看”的笨办法。

我后来总结了一个排查链路,分享给你:

环节常见问题排查方法
文档清洗PDF 里存在扫描件或乱码转成文本后人工抽查 10% 内容
分块策略块之间语义断裂按文档结构切块,加重叠窗口
Embedding 模型相似度区分度差用一组正负样本测试检索排序
向量检索召回噪声多调低top_k或提高相似度阈值
重排 Rerank相关结果排序靠后换更强的重排模型或调整权重
生成 Prompt模型忽略检索内容在指令里明确“仅基于以下语料回答”

这个表格看起来简单,但当时我花了很多天才总结出来。自学的过程中最痛苦的一点就在这里——你面对的是一个多环节的复杂系统,出了问题,你不知道应该在哪里用力。有时候你在 Prompt 上死磕了三天,结果问题出在分块大小上;有时候你费尽心思调整向量检索参数,结果真正的问题是文档里压根没有这个信息,模型在硬编答案。这种“猜谜式”的调试过程非常消耗信心。

2.3 架构选型时的信息过载,不知道该投入谁

另一个让我头疼的问题是:AI 应用开发的工具链迭代太快了。我学 LangChain 学了两周,发现社区开始讨论 LangGraph;我刚在 Dify 里搭好一个工作流,朋友告诉我这个用代码写更灵活;我研究完 LlamaIndex 的文档索引机制,转头看到有人在用向量数据库自带的检索接口,根本不需要套这么重的框架。

这种信息过载带来一种很隐蔽的消耗——我在每个工具上都投入了一点,但每个都不够深,时间就这样被切碎了。后来我得出一个教训:工具选型不是追求“最新”,而是追求“最匹配你的交付能力”。如果你负责做一个业务系统,要求稳定、可控,那就老实选一套你有把握的技术栈;如果你只是想快速验证想法,就用 Coze 这类低代码平台,半小时搞定原型。别在“学工具”的满足感里自我感动,工具只是手段,交付才是目的。

2.4 认知盲区:我不知道“什么程度算好”

这是我在自学后半段最强烈的一种焦虑。我不知道自己做的系统在行业标准里是什么水平。你说它能跑,它确实能跑;但要真拿去交付,我又隐约觉得不踏实。比如我做出来的问答系统,答案就是光秃秃的一段文字,没有引用、没有置信度、没有“我不确定”。我当时觉得这已经够用了,直到后来在一个开源项目里看到人家的应用,不仅给出来源段落,还能在用户问题超出知识库范围时,礼貌地拒绝回答。那一刻我意识到,我的应用在工程上是不合格的“半成品”。

造成这种认知差距的根本原因是:自学时缺乏参照物。你不知道成熟产品长什么样,不知道业界现在用什么方法解决幻觉问题,不知道什么样算好的 RAG 系统。网上零散的教程只会告诉你“怎么做”,几乎不会告诉你“做到什么程度才算做好了”。这个反思直接促成了我最后报课的决定。

3. 为什么半年后,我还是报了课

3.1 一个触发点:朋友的一次真实提问

真正让我决定报课的,是一个特别具体的瞬间。当时一个朋友听我说在搞 AI 应用开发,想让我帮他做一个项目——把公司内部的售后记录变成可检索的知识库。我嘴上说没问题,心里却开始打鼓。因为他一定会问我一个问题:“这个准确率有多少?”而我根本答不上来。我没有测试集,没有评估指标,没有基线对比。我能做的只是给他演示“你看,它回答得还挺像那么回事”。那一刻我非常清楚:demo 能跑和能交付之间,隔着一条需要用工程方法填平的大河。

就是从那时候起,我开始认真思考——我缺的到底是什么?是更多教程吗?不是。网上的免费教程多到我三辈子都看不完。我缺的是两个东西:反馈和验收标准。我需要有人告诉我,你现在做的这个水平行不行;我需要一个明确的交付目标,而不是漫无目的地“学习”。

3.2 我需要的是反馈回路,而不是更多输入

如果你自学过任何一门新技能,你会有一种感觉:输入是无限供给的,反馈却是极度稀缺的。我可以每天看十篇教程、存二十个收藏,但这些都不会告诉我“你写的 Prompt 还缺一个格式约束”或者“你的召回逻辑有 bug”。在 AI 应用开发里,反馈尤其重要,因为很多问题不是靠“懂了”就能发现的,必须亲手做了、被人看了,才能暴露出来。

类比一下:学游泳。你在岸上看一万个视频,也学不会换气时手的角度。你需要一个教练站在水里,指出你的手肘抬得太高了,或者你的头没有在吐气完之后再抬。报课对我来说,本质上就是给自己请了一个“游泳教练”——我需要有人站在岸上看到我看不到的问题。

3.3 我在选课时做的功课:避免被割韭菜

决定报课之后,我没有立刻打开搜索引擎报最贵的机构。我花了差不多一周时间做选课调研。这里顺便分享几条我自己总结的判断标准,给想报课的人参考:

第一,看课程大纲里有没有“评估”相关内容。如果一个课只教你调 API、写多个 Prompt 案例,那它只值几十块钱。真正有价值的课,一定会教你如何量化效果、如何制作测试集、如何做回归测试。

第二,看有没有真实项目交付。好的课程学习周期里会带你完整走一个从需求拆解到上线部署的项目,过程里包含数据清洗、检索调优、接口开发、成本优化,而不只是“跟着敲一遍代码”。

第三,看是否有作业评审机制。这一点极其关键。如果课程只放录播视频,没有批改、没有反馈,那它和免费教程的区别仅仅在于帮你把内容排了个序。我需要的是“有人看我的作业并挑出毛病”。

第四,看讲师背景。有没有做过真实的交付项目、踩过生产的坑,听一节课就能判断出来。纯科研背景的老师往往讲不清成本和工程落地,而纯讲师背景的人又容易停留在 URL 级别。

我最后选的那门课并不是最贵的,但完全符合上述四条。事实证明,这几个判断标准帮我避开了很多坑。

3.4 买课不是为了“知识”,而是买一个“确定性交付过程”

在决定付费之前,我把这笔账算得很清楚:我买的不只是 20 节课的内容。对于我这种有一定基础的自学者,大部分知识点我自己查也能查到。真正值钱的是三样东西——作业会被认真批改、问题能被及时回答、进程被死线推着走。

自学期间我最明显的一个问题就是“收藏夹吃灰”。我收藏了几百个教程,真正看完的不到百分之十。今天想学这个,明天觉得那个更重要,最后什么都没有深入。课程则给了我一个外部强制的节奏:每周都有产出要求,每两周必须提交一个能跑的项目。这种“被 deadline 推着走”的感觉,对于自驱力一般的人来说,是花钱都难买到的。

4. 报课之后,我的状态发生了哪些实质性变化

4.1 从“随便学学”切换到“按周交付”

报课之后最直观的变化,是作息变了。以前我是夜深人静了看几篇技术文章,时间完全由心情决定。上完第一周课之后,我被迫调整成“项目制”节奏:周一做数据准备、周二跑基线实验、周三调 Prompt 和检索参数、周四整理评估结果、周五提交作业。这种节奏一开始让我很不适应,但坚持了三周之后,我发现自己对项目的掌控感肉眼可见地增强了。

这里我想多说一句:此前我总觉得“自学能力”等于“在没有外力的情况下自己把东西学完”。但实际上这只适合领域足够窄、反馈足够快的技能。AI 应用开发是一个系统性强、反馈周期长的领域,外部节奏比内部动力更可靠。

4.2 老师最值钱的能力是挑刺

我在课程里做过一个问答应用,当时觉得已经做得很不错了:知识库能检索、答案能生成、界面虽然丑但能交互。结果交上去的评测意见让我印象极深。老师指出的第一个问题就是“没有引用溯源”。用户问一个问题,模型给了一段回答,但没有任何依据标记,这在真实业务场景里不可接受的——用户凭什么信任这段回答?如果模型答错了,你连追责的依据都没有。

那次评审之后,我给我的应用加了两个关键模块:一个是引用溯源,回答中涉及的每条关键信息都标注出来源文档和片段;另一个是“不确定答案”的处理策略。当系统没有检索引到足够相关的内容时,直接返回“知识库中没有相关内容”,而不是强行编造一段答案。坦白讲,这两个改动做进去之后,整个应用的专业度立刻提升了一个档次。这就是有人挑刺的价值——他能看到你看不到的工程漏洞。

4.3 我第一次认真对待“评估”这件事

说来惭愧,做了半年自学项目,我在报课之前从来没有建过测试集。平时顶多手动试个二三十条问题,心里大概有个数。到了课程里,老师要求我们做一个至少 50 条问答对的数据集,并计算命中率、忠实度、相关性这三个指标。

第一次跑完评估,我发现自己自以为“效果很好”的应用,命中率只有不到 60%。这意味着五条问题里至少两条根本没检索到正确信息。最让我震惊的是,系统性能相比我手动测试时差距很大,因为手动测试时我会下意识选一些“更好回答”的问题,产生一种盲目的乐观。建立评估集之后,一切虚妄的自我感觉都消失了。

这里分享一个简化的评估实现思路,不需要引入复杂框架就能跑起来:

# 简化版:用LLM作为裁判,判断生成答案与标准答案是否相关 import pandas as pd from openai import OpenAI client = OpenAI() def llm_judge(question: str, ground_truth: str, answer: str) -> str: prompt = f""" 你是评估助手,请你判断模型生成答案是否忠实于标准答案。 问题:{question} 标准答案:{ground_truth} 模型回答:{answer} 请只输出一个词:pass 或 fail """ response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}] ) return response.choices[0].message.content.strip() # 加载测试集 df = pd.read_csv("eval_set.csv") df["judge"] = df.apply( lambda row: llm_judge(row["question"], row["ground_truth"], row["answer"]), axis=1 ) pass_rate = (df["judge"] == "pass").mean() print(f"Pass rate: {pass_rate:.2%}")

这段代码的价值不在于它多高级,而在于它把“效果好不好”这个问题,从主观感觉变成了一个可量化的数字。有了这个数字,你每次改动 Prompt、调整检索参数,都能立刻知道是变好了还是变差了。这个能力,比多学十个框架都实用。

4.4 一个意外收获:拥有了一群同路人

还有一个我没预料到的收获,是认识了一批同学。自学者最大的隐形损失,其实是“没有可以讨论的人”。技术问题卡住了,身边没有能一起 debug 的人;学会了新东西,也没有人能分享。但在课程社群里,我找了三个同学组了一个小战队。每周我们都会做一次代码互评,看彼此的检索逻辑、Prompt 写法、项目架构。互相批改的过程里,经常能学到自己完全没想到的思路——比如有人给检索环节加了一个预过滤关键词的步骤,极大减少了无关噪声;比如有人用“带学”的方式强制模型在回答问题前先输出三条理由,再加 Final Answer 结构,效果出奇稳定。

说实话,就凭这段互评经历,我觉得课程的钱就已经值回来了。因为这种反馈密度,在纯自学模式下几乎不可能达到。

5. 如果你也想少走弯路,给你一些很诚实的建议

5.1 先想清楚:你是为了兴趣,还是为了交付

我很反对“一刀切”地劝人报课。因为真的不是所有人都需要报课。如果你学 AI 应用开发只是兴趣使然,想用 Coze 搭一个 Agent 玩玩、想给朋友做个 AI 聊天机器人,那你完全没必要花钱——网上免费资源足够了,低代码工具甚至不需要写一行代码。

但如果你和我一样,目标是靠这个技能找工作、接项目、做产品交付,那你就必须认真补上“工程化”这一课。你可以先做一个自检:你能否回答下面四个问题?

  • 你的应用上线后,单次请求的成本大概是多少?
  • 你的应用在用户并发访问时,预计响应时延是多少?
  • 你的应用效果有没有量化的指标?你现在能说出准确率吗?
  • 如果模型回答错误,你的系统有没有兜底策略?

如果你有任何一道题答不上来,说明你还停留在“demo 水平”,需要进一步深入学习。这时候报课就是一条值得考虑的路径。

5.2 决定自学的话,也要给自己造“反馈回路”

如果你暂时不想报课,我完全理解。但我不建议你重走我那种“闷头自学”的老路,一定要想办法给自己制造反馈。这里有几个方法,是我觉得还不错的替代方案:

第一,自己做基准测试集。哪怕只有 30 条问答对,也请把它固化下来。每次改动代码,跑一遍基准集,记录得分变化。这一步能让你少走很多弯路。

第二,去开源社区贡献代码。不用非得写多复杂的功能,去修文档、去补测试用例、去解决一个简单的 Issue 都可以。重点是让更多人 review 你的代码,别人的 issue 和 comment 就是最真实的反馈。

第三,参加黑客松或者线下 Meetup。找个周末和一群人一起做个小项目,deadline 会逼你把事情做完。而且线下最容易找到能长期讨论问题的同伴。

第四,找一位有经验的工程师做一对一咨询。价格往往远低于培训课程,但每两周一次的高质量交流和方向纠偏,性价比很高。

5.3 如果决定报课,送你一份“避坑清单”

最后分享一个我的选课避坑清单,每一条都是真金白银换来的经验:

  1. 看大纲是不是只讲调用 API。如果大纲超过一半在讲“怎么调模型”“Prompt 的几种写法”,多半是割韭菜。
  2. 看有没有讲评估和测试集。没有评估体系的课程,教不出能落地的人。
  3. 看有没有真实的项目交付环节。要做的是从零到一完整的项目,而不是十几个互不关联的 demo。
  4. 看有没有作业批改机制。有直播、有答疑很重要,但作业批改才是反馈的核心。
  5. 看课程有没有生产环境相关内容。部署、成本、并发、日志监控,这些从免费的“hello world”教程里学不到。
  6. 看讲师是否有真实交付案例。自己能做出产品来的人,和只会讲 PPT 的人,身体语言不太一样。
  7. 看往期学员的作业产出。学员作业水平比课程宣传语更能说明课程质量。

记住一件事:报课不是买秘籍,而是买一个有反馈的交付过程。如果你报了课却依然不写作业、不跑项目、不和其他人交流,那这个钱一定打水漂。课程只是给你搭了一条有护栏的路,走路这件事,任何人都替代不了你。

最后再分享一个我这半年下来最大的体会。报名之前,我一直觉得“报课”是对自学能力的认输,是花钱买一个别人已经消化过的东西。但真正读下来之后我才明白,我买的最值钱的东西根本不在课程视频里——它是我每次提交作业后得到的那些批评,是同学代码里让我眼前一亮的写法,是一个被 deadine 逼着不得不动手的早晨。

如果你现在也处在一个“看了很多教程、收藏了很多文章,但没一个项目真正做完”的状态里,我特别理解那种无力感。你不用急着站队说“自学好”或“报课好”,你要做的是先问自己一个问题:我现在缺的到底是新知识,还是一面能照出自己的镜子?答案如果是后者,那想尽办法把它搞到手——不管你用报课、找 mentor,还是拉一群朋友组队解决。自学也好,报课也好,都只是手段。真正让你进步的,永远是那个愿意被别人挑刺、并一遍一遍改到能交付的你自己。