1. 这个项目清单是怎么选出来的:5个项目背后的递进逻辑
先说结论:这份清单不是把网上热门的AI项目随便拼五个,而是按照一条完整的技能成长链路排出来的。我自己从写爬虫、做后端,到后来专职做AI应用架构,中间踩过很多弯路。最深的感受是:泛泛地刷Demo没有用,真正有用的是把每个项目都按"能上线、能维护、能说清楚为什么这么做"的标准做完。
这篇文章给的目标读者是两类人:一是刚入门、会写一点Python但没接触过大模型的小白;二是已经在业务里写过代码、想把大模型能力真正落地的程序员。如果你是这两类人中的任意一类,下面这5个项目可以让你比较系统地补齐"AI架构师"这个角色日常要面对的核心问题:怎么让模型更精准地回答、怎么让模型调用工具、怎么协调多个模型角色、怎么让模型适配自己的业务、怎么把模型服务稳定地跑在生产环境里。
我选项目的原则很简单,只有三条:
- 每个项目都必须能独立上线,不是一个跑完就删的玩具;
- 技术点不重复,5个项目覆盖检索、工具调用、多Agent协作、模型微调、推理部署五个方向;
- 难度要平滑递进,不能在第一个项目就把人劝退。
实际执行的时候,我建议你也按照下面的顺序来:先做RAG知识库,再做Function Calling智能体,接着挑战多Agent协作,然后做一次LoRA微调,最后才是推理服务的生产级部署。很多人一上来就想微调模型或搭建部署平台,结果前置概念没补齐,做到一半又回头翻文档,效率反而更低。
时间上给你一个参考:RAG项目业余时间大概2到3周,Function Calling项目2到3周,多Agent项目3到4周,微调项目3到4周,生产部署项目4周左右。当然这是比较从容的节奏,如果集中投入,两个多月也是可能的。关键不是快,而是每个项目都要留下可复用的代码和笔记,后面面试或者做正式项目时可以直接拿出来。
2. 项目一:RAG知识库问答系统——从"聊得起"到"聊得对"
2.1 为什么第一个项目必须是RAG
这几年大模型对话能力已经很成熟,但企业场景里最常被问到的不是"帮我写一首诗",而是"我们产品手册里那个报错码是什么意思""上季度的运营规范第几条说了这个流程"。这种问题有一个共同点:答案必须来自给定的资料,不能靠模型发挥。
RAG(检索增强生成)是目前解决这个问题性价比最高的方案。它的思路很朴素:先把文档切块并向量化,用户提问时先从库里检索出最相关的几段内容,塞进提示词里,再让大模型基于这些片段生成回答。模型不需要记住你的全部文档,只需要在回答时"看一眼"相关资料。这样一来答案有依据,文档更新了也不需要重新训练模型,改一下知识库就行。
2.2 最小可运行架构:五个组件一个不能少
我把这个项目的落地架构拆成五个部分:文档加载器、切分器、向量化模型、向量数据库、生成环节。第一阶段先跑通完整链路,不要追求花哨。
实际代码里最核心的流程大概是这样的:
# 简化版 RAG 主流程,用于本地验证 def build_knowledge_base(doc_path): docs = load_document(doc_path) # 支持 PDF/Word/Markdown chunks = split_document(docs, chunk_size=512, overlap=48) vectors = embed_texts(chunks) # 用 embedding 模型生成向量 store_vectors(chunks, vectors) # 写入向量数据库 def answer_question(question): top_chunks = retrieve(question, top_k=5) # 向量检索 或 混合检索 prompt = assemble_prompt(question, top_chunks) reply = llm_chat(prompt) return reply, top_chunks # 返回引用来源第二阶段的优化重点放在切分参数和检索策略上。切分时我会同时记录这个块来自哪个文档、哪个章节,方便后面做引用跳转。向量数据库选择很多,开发期可以用轻量的本地方案,正式业务里再根据并发量选独立的向量库。
2.3 实际踩坑:切块、阈值、召回质量
这个项目看起来简单,但做深了你会发现到处都是细节。我列几个自己踩过的问题,你大概率也会遇到。
| 常见问题 | 表现 | 我的解决思路 |
|---|---|---|
| 切块太碎 | 一段完整逻辑被拆散,检索答非所问 | 切块前做章节结构识别,表格和代码单独处理 |
| overlap 设置不合理 | 边界信息丢失或重复冗余 | 默认 overlap 设为块长的8%到10%,根据实际文档调整 |
| 相似度阈值过低 | 无关内容被强行塞进上下文 | 先统计正常问答的分数分布再定阈值 |
| 检索只看向量 | 同义词和精确词匹配弱 | 加全文检索做混合召回,再做一次重排序 |
| 回答没有引用 | 用户无法验证答案真伪 | 强制生成环节输出引用编号,前端展示来源 |
最容易被忽视的是"阈值"。很多人觉得Top K取5就一定准,但知识库里如果有一堆相近的文档,向量分数可能都差不多。我的习惯是先跑100条真实问题进行分布分析,再确定一个既能保证召回又不至于乱给答案的阈值区段。这一步做完,答案质量会有肉眼可见的提升。
2.4 做完这个项目你掌握了什么
完成RAG项目后,你会把文档处理、文本向量化、向量检索、提示词拼装、引用溯源这一整条链路弄明白。以后再遇到"知识库问答""企业搜索""客服辅助"这类需求,你已经有了可以直接复用的骨架。这也是后面所有项目的基础,因为大部分AI应用本质上都离不开"先把信息正确地组织起来"这件事。
3. 项目二:基于Function Calling的智能体项目——给大模型装上工具调用能力
3.1 Function Calling的技术本质:模型只点菜,代码来做饭
做完RAG之后,你的系统还处在"你问我答"的阶段,模型没有行动能力。但真实业务里,用户说"帮我查一下订单状态,然后取消它",你不可能让模型凭空变出订单数据,也不可能让它真的去改后台状态。这时候就需要Function Calling(函数调用)。
它的原理一句话就能说清:大模型不直接执行工具操作,而是根据用户语义输出一个结构化的调用请求,由你的外部代码去执行真实操作,再把结果返回给模型做最终总结。你可以把这个过程想象成用户在餐厅点菜,模型是点菜员,只负责填写下单单(工具调用参数),真正炒菜的是后厨(你的代码)。
3.2 项目场景:做一个能查单、能取消、能解释的客服助手
这个项目我强烈建议你做"订单售后助手"方向。因为它足够真实,涉及查询、修改、判断,能完整体现工具调用的价值。
系统的工具大致有三个:
query_order_status(order_id):查订单状态;check_return_rule(sku):查退货规则;create_after_sale(order_id, reason, item_list):创建售后单。
运行循环的核心代码结构如下:
# 智能体主循环:模型决策 + 代码执行 def run_agent(user_input, tools): messages = [{"role": "user", "content": user_input}] for round in range(max_rounds): res = llm_chat_with_tools(messages, tools) if not res.tool_calls: return res.content # 模型不再调用工具,直接回答 messages.append(res) for call in res.tool_calls: result = execute_tool(call) # 真实执行工具函数 messages.append(tool_result_message(call, result))注意这里必须设置最大轮数,我一般设5轮,超过就兜底回复"无法完成操作"。防止模型在一个问题上反复调用工具不收敛。
3.3 参数校验、失败兜底与多轮调用的坑
这个项目最容易翻车的地方不在模型,而在工具层。大模型再聪明,生成的参数也可能带着幻觉——比如把订单号格式传错、把用户没授权的操作的入参补全。我的建议是工具入口必须做严格校验,尤其是涉及资金、退换货这类有副作用的操作,一定要在代码层二次确认:先查权限,再校验参数,最后才执行。
这里我吃过一个亏:早期图省事,直接把模型生成的参数传给内部接口,结果发现模型把"取消订单"和"申请退款"两个工具混在一起调用,差点出现重复退款流程。后来我在工具封装层加了幂等检查和状态机控制,只允许在"待处理"状态下执行取消操作,这才堵住问题。
另外一个常见问题是多函数连调。例如用户说"这个订单能不能退?能的话帮我退了",模型可能需要先查单,再查退货规则,再创建售后单。每一步的结果都要重新塞回上下文,让模型看得到进展。所以消息列表的维护特别重要,不要只回传最终结果,要把中间的结果和原始用户意图一起整理好再发给模型。
3.4 用哪些指标验收这个项目
工具调用类系统不能只靠"感觉好用"来验收,我建议你给自己定几个硬指标:
| 指标 | 衡量方式 | 达成线 |
|---|---|---|
| 工具调用准确率 | 人工标注100条请求,看调用是否合理 | 90%以上 |
| 任务完成率 | 明确意图的请求最终是否完成闭环 | 85%以上 |
| 无效调用比例 | 不该调工具却调了的比例 | 低于5% |
| 平均轮数 | 从开始到结束模型调用了几轮 | 3轮以内 |
做完Function Calling项目,你就理解了"模型负责意图理解,代码负责确定性"这个架构原则。这个认知会贯穿后面所有项目。
4. 项目三:多智能体协作——让几个模型角色在一个流程里开会
4.1 为什么单Agent不够用,多Agent解决什么问题
当你把Function Calling做完,会发现一个瓶颈:单个Agent只能沿着一条思路执行,它既当规划者又当执行者又当质检员,很容易顾此失彼,而且上下文一长就开始忘前面说了什么。
多智能体协作的思路是:把不同职责拆给不同的Agent,由编排层来控制它们之间的调用顺序和信息传递。你可以说它是一间会议室,有人负责出方案,有人负责挑毛病,有人负责做总结。最后输出统一成果。
4.2 一个可落地的多Agent项目:技术方案评审助手
这个项目我推荐做"需求说明书评审"。输入一份产品需求文档,输出一份带风险点和模块拆解的评审意见。
我设计的角色划分是这样的:
- 架构Agent:把需求拆成系统模块,输出模块清单;
- 风险Agent:从授权、边界、性能三个角度检查潜在问题;
- 数据Agent:识别核心实体,输出数据字段草案;
- 评审Agent:汇总前三者输出,生成最终评审报告。
执行顺序是串行加并行的混合:架构Agent先出骨架,然后风险Agent和数据Agent可以并行跑,最后全部汇总给评审Agent。
4.3 状态管理和记忆组织:多Agent最容易崩的地方
多Agent实际写起来,崩溃点往往不是模型,而是状态管理。每个Agent都有一堆输入和输出,如果不建立一个统一的数据结构,整个流程很快变成一锅粥。
我的做法是定义一份全局状态字典,每一轮Agent运行后把结果写回固定字段,下一个Agent只从状态里取它需要的键。这样做的好处有三个:节点之间解耦、出错时能定位是哪个环节写了脏数据、方便断点重跑。以下是伪代码:
state = { "requirement": raw_doc, "modules": None, "risks": None, "data_entities": None, "review_report": None } state["modules"] = run_architecture_agent(state["requirement"]) state["risks"], state["data_entities"] = run_parallel_agents(state["requirement"]) state["review_report"] = run_review_agent(state)对话记忆方面,我建议每个Agent只保留自己的局部上下文,不要让它看到全部历史。否则长流程跑下来,几千字的对话历史直接超过上下文窗口,费用和延迟都吃不消。
4.4 我在调试多Agent时踩过的三个坑
第一个坑是死循环式的"争论"。两个Agent一个坚持用方案A,一个坚持方案B,来回输出意见。后来我加了两条硬规则:一是设置最大迭代轮数,超过就强制走仲裁Agent;二是要求每个Agent输出时必须附带"置信度"和"依据来源",没依据的意见不进入最终报告。
第二个坑是幻觉信息在Agent之间传染。比如风险Agent脑补了一个需求里不存在的合规条件,评审Agent又拿这个条件做依据,最后整份报告都偏离原始需求。我的对策是要求每个Agent的输出必须引用原文片段或明确指出"当前知识无法确认"。
第三个坑是长流程超时。一个完整的评审流程四个Agent跑下来可能要好几分钟,用户等不起。后来我把整个流程拆成了"预评审"和"详细评审"两段,第一段先让一个轻量Agent快速过一遍,给出大体结论;详细评审只在用户确认后才跑,体验明显提升。
5. 项目四:LoRA/QLoRA微调——把通用底座变成你的领域专家
5.1 什么时候才需要微调
经历了前面三个项目,你会发现提示词工程和检索能解决80%的问题。但总有那么20%搞不定:比如要求输出严格的企业标准格式,比如希望模型拥有特定行业的表达习惯,再比如提示词写得再复杂,模型也会在某些边界案例上反复出错。
这时候就应该考虑微调。微调的本质是调整模型权重,让它在你的数据分布上表现更好。不是所有问题都要微调,但掌握微调是通向高级工程师的必经之路。
5.2 微调项目第一步不是选模型,是整理数据集
很多新手一上来就挑模型、调参数,其实微调项目里最重要的永远是数据集。数据质量直接决定最终效果。我的建议是至少准备3000到5000条高质量样本,少于这个数先不用急着训练。
数据结构我强烈建议用统一的指令格式,字段包含instruction、input、output三个部分。以你的项目为例,如果你要微调一个售后话术模型,数据大概长这样:
{ "instruction": "用户因为商品破损发起退款,请生成安抚话术并告知处理流程。", "input": "商品是玻璃杯,到货后杯口有裂纹。", "output": "非常抱歉给您带来不便,商品破损属于售后范围,您可以申请退款或补发。我已为您记录,处理结果将在1个工作日内通过短信通知。" }整理数据时你会遇到大量脏数据:重复样本、格式混乱、答案长度参差不齐。我通常会用脚本做去重和格式清洗,再人工抽检500条确认质量。这一步看着枯燥,但对最终效果影响是决定性的。
5.3 用QLoRA做低资源微调的关键参数
普通全参数微调需要非常大的显存,个人开发者基本不用考虑。QLoRA是目前性价比最高的方案,它把模型量化到4bit,只训练一小部分低秩适配器,显存占用大幅下降。
我常用的参数如下,这套配置在单张消费级显卡上就可以跑7B或13B量级的模型:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| lora_r | 16 | 秩越大适配能力越强,但过大容易过拟合 |
| lora_alpha | 32 | 缩放系数,一般取 lora_r 的2倍 |
| lora_dropout | 0.05 | 防止过拟合 |
| learning_rate | 2e-4 | 比全参微调大一些 |
| num_epochs | 2到3 | 数据充足时1到2个epoch往往就够 |
| batch_size | 4到8 | 视显存调整 |
训练的时候我习惯同时记录训练集loss和验证集loss。如果训练loss持续下降,验证loss反而上升,说明过拟合了,赶紧减epoch或者加大dropout。训练完成后的适配器文件很小,只有几百MB,可以和底座模型合并后导出。
5.4 微调效果的评估:不要被loss骗了
评估微调效果时,我的做法是准备一份单独的测试集,里面包含两类问题:一类是微调目标场景的,另一类是原有通用能力的问题。
目标场景的题目考察你的业务效果,比如话术是否准确、格式是否符合规范;通用能力的题目考察有没有发生灾难性遗忘。我自己见过很典型的反面案例:一个模型微调后外贸话术说得头头是道,但让它写一段简单的招聘文案,输出质量断崖式下降。这就是因为训练数据里混杂了太多特定风格,挤掉了模型的通用能力。
缓解灾难性遗忘的方法,我常用的三种:训练集中混入至少10%的通用指令数据、训练epoch控制在3以内、评估时必须保留一份通用能力测试集。这三点做到位,基本能保证微调后的模型不会"偏科"。
5.5 这个项目做完后你的能力边界
做完LoRA/QLoRA微调,你就真正触碰到了模型训练的边界。你会理解什么是基座模型、什么是适配器、什么是损失曲线,也明白了为什么"数据比模型更重要"。概念里程碑上,你已经从"用模型的人"变成了"会改模型能力的人"。
6. 项目五:生产级推理服务——从单机Demo到能扛流量的模型平台
6.1 为什么把部署单独当成一个大师级项目
模型训练完不等于能用。现实中你还要面对并发请求、限流、灰度、监控、成本等一系列问题。很多团队Demo跑得好好的,一上线被流量冲击就崩,就是因为缺了一层正规的推理服务架构。
6.2 推理引擎选型与容量估算
推理服务第一步是选定推理引擎。我建议直接采用支持动态批处理和量化推理的开源方案,而不是裸跑PyTorch。选择时重点看三件事:吞吐量、显存占用、是否支持主流量化格式。
容量估算有一个很实用的经验公式:模型的显存需求大约等于参数量乘以每参数字节数。以7B模型为例,如果加载成FP16,每参数占2字节,光权重就需要约14GB显存;如果采用4bit量化,权重降到约4GB,但还要额外预留一定显存给KV Cache和运行时开销。
| 模型规模 | FP16权重显存 | 4bit量化权重大约 | 建议最低显存 |
|---|---|---|---|
| 7B | 14GB | 4GB | 12GB到24GB |
| 13B | 26GB | 7GB | 24GB到40GB |
| 70B | 140GB | 40GB | 多卡部署 |
这只是权重部分,真实部署还要算并发带来的KV Cache增长。我一般按"每千并发预留少量额外显存"来估算,先小流量压测,再按观测数据调整。
6.3 服务治理:限流、多模型路由、灰度发布
生产级和Demo最大的区别在于服务治理。我建议至少做好三件事:
- 限流:按用户维度对请求频率做限制,防止个别调用方拖垮整体服务;
- 多模型路由:不同业务配置不同模型版本,通过路由规则转发明文请求;
- 灰度发布:新模型先切5%的流量,观察一段时间再逐步放量。
这三件事听起来复杂,但在网关层做并不难。模型服务内部保持无状态,网关层负责路由和限流,两边的职责清晰后,线上问题更好排查。
6.4 质量、成本与可观测性
生产级系统必须能回答三个问题:模型今天回答得好不好、花了多少钱、系统稳不稳定。
我的实践是:所有请求统一写结构化日志,记录模型名、输入输出token数、延迟、响应内容;延迟指标不只算平均值,重点看P95和P99,因为平均值会被长尾拖平。成本方面,按天统计各模型消费的token数,定期分析性价比。质量方面,每天跑一份固定的黄金测试集,用脚本和人工抽检结合打分,一旦分数低于阈值立刻告警。
这套观测体系搭起来之后,你的系统才算真正"敢上线"。生产环境出问题时,你能通过日志快速定位是模型问题、代码问题还是基础设施问题,而不是靠猜。
7. 刷完这5个项目,我对"AI架构师"这个目标的几句实在话
标题说得轻松,什么"轻松逆袭AI架构师",实际上AI架构师不是一个能靠背概念速成的岗位。但如果你把这5个项目认真做完,你确实已经摸到了这条路的核心门槛。
我在实际项目中见过很多工程师卡在一个误区里:要么永远在调提示词,要么永远在追新模型,却很少把检索、工具调用、编排、微调、部署这几个能力串成一条完整的链路。而这恰恰是架构师和普通开发者的区别。架构师要的不是某一招特别强,而是遇到业务问题时能快速判断应该用哪种技术组合,并能在生产环境里把方案跑稳。
最后给你几个实操上的建议:每个项目做完后,花半天时间写一篇复盘笔记,记录你踩了什么坑、用了什么方案、如果重做会怎么改。这些东西比代码本身值钱。另外,不要一次性把5个项目都做完才去找真实场景练手,做到第二个项目时就可以用这个能力去帮身边人解决一个真实的小需求,比如给一个小团队搭一个内部问答机器人。真实的业务约束会逼你把问题想得更全面,这是自己刷Demo永远学不到的。
模型迭代的速度很快,但这些项目背后的基本功不会过时。你现在花的时间,都是在给未来的自己铺垫。