如果你最近在跟 AI Agent、RAG、MCP 这些方向,大概率会看到一类现象:教程很多,Demo 也很多,但真正能从零开始跑通一个“能回答问题、能调用工具、能检索知识库”的完整项目,并且把中间过程讲明白的内容并不多。这次我们来看的项目,就是一条相对完整的进阶路线:基于 Harness 架构的学习助手,从代码分析开始,一路打通 AI Agent、RAG、MCP、Embedding、上下文工程和 Skills,最后落到一个可以交互、可以扩展、可以接业务数据的实战项目。
先给结论:这不是一个“装个依赖跑个 demo”的简单项目,而是一套偏工程实践的学习路径。它重点解决的是:Agent 的推理过程不可控、RAG 检索和生成脱节、工具调用没有标准协议、上下文管理靠手写字符串拼接这些问题。如果你已经会调 OpenAI API,但不知道 Agent 该怎么组织、RAG 该怎么和 Agent 结合,这个项目的价值会非常大。
这篇文章会从 Harness 架构的设计思路讲起,拆解 RAG、MCP、Embedding、上下文工程和 Skills 在项目里的实际角色,然后给出环境准备、部署启动、功能测试、API 调用和批量任务处理的方法。最后是一份常见问题排查清单和工程化建议,确保你看完能照着跑,而不是只收藏吃灰。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | AI Agent + RAG 学习助手实战项目,偏代码分析与知识库问答场景 |
| 核心架构 | Harness 架构,将 Agent 推理过程结构化、参数化 |
| 主要功能 | 代码分析、知识库问答、工具调用、多轮对话、上下文管理 |
| 关键技术 | AI Agent、RAG、MCP、Embedding、上下文工程、Skills、大模型推理 |
| 启动方式 | 命令行启动为主,可扩展 WebUI 或 API 服务 |
| 支持 API | 支持,项目核心能力可通过服务接口暴露 |
| 批量任务 | 支持,知识库构建、文档处理、批量问答可脚本化执行 |
| 推荐硬件 | 纯 API 调用可跑在普通电脑;本地模型推理需按模型尺寸配置 GPU |
| 显存占用 | 取决于所选 Embedding 模型和 LLM,实际占用需以本机测试为准 |
| 适合人群 | 有 Python 基础、想深入 AI Agent 工程的开发者 |
从项目标题和搜索热词来看,这套项目把 AI Agent 学习过程中最常被问到的几个点全串起来了:Harness 架构、RAG、MCP、Embedding、上下文工程、Skills。它们不是孤立的技术名词,而是一个完整 Agent 系统的不同层次。
2. Harness 架构与 AI Agent 的设计思路
2.1 Harness 架构解决什么问题
多数人第一次接触 AI Agent,是从“给大模型一个 system prompt,然后让它自己调用工具”开始的。这种写法的优点是简单,但缺点很致命:大模型的中间推理不可控,它可能跳过关键步骤,可能调错工具,也可能在一个无关问题上反复横跳。一旦任务链条变长,这种不可控就被放大。
Harness 架构的核心思路,是把 Agent 的“思考过程”从自由发挥变成模板化执行。每个任务类型定义一套结构化的执行流程——先做什么、再做什么、每一步需要哪些参数、什么时候调用外部工具、什么时候直接生成答案。大模型不再凭感觉走,而是在 Harness 约束的轨道上完成推理。
从代码分析这个具体场景看,Harness 架构的优势非常明显。分析一个仓库时,Agent 需要先扫描目录结构、读取关键文件、提取函数与类定义、再结合用户问题生成结构化答案。如果让模型“自由发挥”,它可能跳过源码扫描直接猜答案。用 Harness 约束后,每一步都是可验证、可回溯的。
2.2 Harness 与 AI Agent 的分层关系
一个典型的 Harness 架构 Agent 项目,可以拆成这样几层:
- 任务解析层:接收用户问题,判断属于哪类任务。
- 执行编排层:根据任务类型加载对应的 Harness 模板,按步骤执行。
- 工具调用层:通过 MCP 协议调用外部工具,包括代码搜索、文档读取、API 请求。
- 知识检索层:通过 RAG 链路从知识库中检索相关内容,作为上下文补充。
- 生成输出层:将中间结果填入上下文,由大模型生成最终回答。
每一层都可以独立替换。换一个大模型,不影响工具层和检索层;换一个 Embedding 模型,不需要改动 Agent 编排逻辑。这种解耦设计,才是这个项目真正值得学习的地方。
3. RAG、MCP、Embedding 与上下文工程拆解
3.1 RAG 不是简单的“检索加生成”
很多文章把 RAG 讲成“把文档切碎、向量化、存起来、搜索、塞给大模型”,这个描述没有错,但太粗糙了。真正落地时,至少要考虑四个问题:
- 文档怎么分块才能不过度切碎语义?
- Embedding 模型选多大、用 CPU 还是 GPU 推理?
- 检索结果怎么重排,才能把最相关的内容放到前面?
- 检索到的上下文怎么组织,才不会让模型被无关信息干扰?
如果说 Harness 架构是 Agent 的骨架,RAG 就是 Agent 的知识来源。没有 RAG 的 Agent,只能靠模型参数里那点训练知识硬撑;有了 RAG,它才能查到私有文档、最新文档、甚至整个代码仓库里不经常更新的模块。
在代码分析场景中,RAG 通常不是直接把整个仓库塞进向量库,而是先做结构化解析——提取函数签名、类定义、模块依赖关系,再把这些结构信息和原始代码片段一起索引。用户问“这个项目里谁调用了某个函数”时,检索模块可以同时命中调用关系和代码位置,生成答案的准确性会大幅提高。
3.2 MCP 让工具调用标准化
MCP 全称 Model Context Protocol,解决的是大模型和外部工具之间的接口混乱问题。没有 MCP 时,Agent 每接入一个工具,就要写一套独立的调用代码,不同工具的参数格式、返回结构都不一样。用 MCP 后,工具以统一标准暴露服务,Agent 只需要理解一套协议,就能调用各种工具。
在 Harness 架构的学习助手里,MCP 承担的工具包括:
- 代码仓库读取工具:读取指定路径下的文件、目录、git 历史。
- 文档解析工具:解析 PDF、Markdown、TXT 等格式。
- 向量数据库工具:写入和查询 Embedding。
- 外部 API 工具:如果项目需要,可以扩展天气、搜索、数据库等接口。
从搜索热词里也能看出来,MCP 现在是 AI Agent 开发的高频话题。MCP server 怎么写、MCP 协议怎么理解、怎么把 Claude Code、Cursor 这些工具接到 MCP 上,这些问题在实战项目中都会遇到。
3.3 Embedding 选型与语义检索
Embedding 是把文本变成向量,让机器能够计算语义相似度。项目里通常有两个位置用到 Embedding:
- 知识库构建时,把文档分块、向量化、写入向量库。
- 用户提问时,把问题向量化,去向量库检索最相似的片段。
Embedding 模型的选择直接影响检索质量。小模型推理快、占用低,但语义理解能力相对弱;大模型效果更好,但 CPU 推理慢、GPU 显存占用高。实践中最稳的做法是在本机准备一个中等规模的 Embedding 模型,先小批量测试检索效果,再决定是否换更大模型。
需要注意,Embedding 模型需要语义理解能力,它不是简单的关键词匹配。选型时要重点看它在相似问题、同义词、上下文无关短语上的表现。
3.4 上下文工程是 Agent 质量的隐藏关键点
很多 Agent 项目跑起来效果差,问题不在模型,而在上下文。Harness 架构里,上下文工程的作用是把“该让模型看到什么、按什么顺序看、每段信息占多大权重”设计好。检索到的知识、工具返回的结果、历史对话,都需要在进入模型之前完成筛选和排序。
一个简单的上下文模板可能长这样:
系统指令:你是学习助手,请基于上下文回答问题。 用户问题:{question} 检索知识:{retrieved_context} 工具结果:{tool_result} 历史对话:{chat_history}看起来简单,但每个字段怎么生成,直接决定了回答质量。工具结果和检索知识冲突时以谁为准、历史对话裁剪多少轮、上下文总长度控制在多少 token,这些都是需要实际调试的点。
4. 适用场景与使用边界
这个项目最适合三类人:一类是想深入了解 AI Agent 工程化的开发者,一类是准备 RAG 相关内容面试的技术人,还有一类是需要在代码库上做智能问答的团队。
它可以解决这些问题:让 Agent 按照固定流程分析代码、回答“某个函数在哪里实现”“这个仓库的模块结构是什么”这类问题;把团队内部文档做成知识库,让新成员通过自然语言提问获取答案;把多个工具通过 MCP 接入 Agent,形成可扩展的自动化工作流。
不适合的场景也要说清楚:它不适合提升模型常识问答能力,不适合替代搜索引擎做全网信息检索,也不适合没有明确边界、需要强创造力的开放式任务。
使用边界上,涉及代码仓库、内部文档、私有数据时,必须确认数据使用授权和隐私边界。如果项目对外提供服务,还要关注生成内容的版权合规问题,不能把未授权的第三方文档直接放入知识库。
5. 本地部署环境准备
动手之前,先把环境准备好。下面的清单是通用要求,具体版本以你实际的项目 README 为准。
5.1 软件环境
| 依赖项 | 建议说明 |
|---|---|
| 操作系统 | Windows 10/11、Ubuntu 20.04+、macOS 均可,Linux 服务器部署最稳 |
| Python | 3.10 或更高版本,建议使用虚拟环境 |
| 包管理工具 | pip 或 uv,推荐 uv 提升依赖安装速度 |
| 大模型接入 | OpenAI 兼容 API,或本地 Ollama/vLLM 服务 |
| 向量数据库 | Chroma、FAISS、Milvus 等,根据项目依赖选择 |
| 代码仓库 | Git,用于拉取项目代码和依赖 |
5.2 硬件门槛
如果纯用 API 模式(远程大模型 + 远程或本地 Embedding),普通办公电脑就可以跑,不需要独立显卡。如果要把 Embedding 模型和 LLM 都跑在本地,则需要根据模型尺寸评估:
- 1B 到 3B 级别的模型:8GB 显存可以尝试,CPU 也能跑但速度偏慢。
- 7B 级别模型:建议 12GB 以上显存,最好有 NVIDIA GPU。
- 70B 级别模型:需要多卡或纯 API 模式。
显存占用不是固定的,它跟推理框架、量化方式、上下文长度都有关系。最稳妥的判断方式是自己跑一次,观察模型加载后和推理过程中的显存曲线。
5.3 安装依赖
假设项目已经拉到本地,创建虚拟环境并安装依赖:
# 创建并激活虚拟环境 python -m venv .venv source .venv/bin/activate # Windows 激活命令 # .venv\Scripts\activate # 安装依赖,具体以项目 requirements.txt 为准 pip install -r requirements.txt如果项目使用 pyproject.toml,可以换成:
pip install -e .不建议全局安装依赖,因为 AI 项目依赖冲突概率很高,虚拟环境可以隔离掉大部分问题。
6. 从代码分析到学习助手的功能落地方案
这个项目的起点是“代码分析”,终点是“学习助手”。这两者之间,需要一套清晰的落地路径。下面给出一个通用实现方案,具体实现细节要根据项目本身调整。
6.1 代码分析流程的 Harness 化
代码分析是一个天然适合 Harness 约束的任务。把分析过程拆成五个步骤:
CODE_ANALYSIS_HARNESS = { "task_type": "code_analysis", "steps": [ "list_repository_structure", # 扫描仓库目录结构 "read_key_files", # 读取关键文件 "extract_symbols", # 提取函数/类/方法定义 "build_dependency_map", # 构建模块依赖关系 "generate_structured_answer" # 结合用户问题生成答案 ] }每一步执行后,把结果写入一个中间状态对象。下一步只能读取上一步的输出,不允许模型临时改变执行顺序。这样做的直接收益是:Agent 在哪个阶段卡住、哪个阶段返回空结果,都能快速定位。
6.2 构建 RAG 知识库
把代码仓库中的文档、注释、核心模块说明等内容构建成 RAG 知识库,流程如下:
import os from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # 1. 读取文档 documents = [] for root, dirs, files in os.walk("./docs"): for file in files: if file.endswith(".md"): with open(os.path.join(root, file), "r", encoding="utf-8") as f: documents.append(f.read()) # 2. 分块 splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=100 ) chunks = splitter.create_documents(documents) # 3. 向量化与存储 embeddings = HuggingFaceEmbeddings(model_name="your-embedding-model") vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")这段代码是通用模板,实际使用时需要替换 Embedding 模型名称和文档路径。分块大小和重叠量会对检索效果产生直接影响,建议在真实语料上对比不同参数。
6.3 Agent 与 RAG 结合
学习助手拿到用户问题时,执行链路是:
- 判断问题类型:代码分析类、知识库问答类、通用对话类。
- 如果是知识库问答类,先向量化用户问题,检索 Top-K 相关片段。
- 将检索结果作为上下文的一部分交给大模型。
- 如果是代码分析类,走 Harness 模板,逐步执行代码分析步骤。
- 生成最终答案,同时保留中间过程日志。
def ask_assistant(question: str, history: list): # 1. 判断任务类型,加载对应 Harness harness = select_harness(question) # 2. 如果涉及知识检索,先走 RAG if harness.need_retrieval: retrieved_chunks = vectorstore.similarity_search(question, k=5) # 3. 构建上下文 context = build_context( question=question, retrieved=retrieved_chunks, tool_results=harness.execute(), history=history ) # 4. 生成回答 return llm.generate(context)这样组织代码后,Agent 的每一步都可单独测试。先用纯 RAG 测试检索质量,再单独跑代码分析 Harness,最后把链路串起来。出了问题,不用把整个 Agent 都推倒重来。
7. 功能测试与效果验证
7.1 基础问答测试
测试目的:确认大模型接入正常,能完成普通对话。
- 输入:你好,请介绍你自己。
- 预期:模型返回自我介绍,不报错、不超时。
- 判断标准:服务能跑通,响应时间在可接受范围内。
7.2 RAG 检索测试
测试目的:确认知识库能检索到相关内容。
- 输入:这个项目里有没有关于 MCP server 的说明?
- 预期:返回结果中包含文档里的相关知识片段。
- 判断标准:检索结果与问题相关,命中片段不是空话。
- 常见问题:检索结果不相关。排查方向是 Embedding 模型是否合适、分块参数是否合理。
7.3 代码分析测试
测试目的:确认 Harness 架构下的代码分析流程能正确执行。
- 输入:请分析项目里 main.py 的主要功能。
- 预期:Agent 按步骤读取文件、提取关键结构、给出回答。
- 判断标准:回答中提到的函数名、类名和真实代码一致。
- 常见问题:中间步骤返回空数据。排查方向是路径解析、文件读取权限。
7.4 多轮对话测试
测试目的:确认 Agent 能结合历史对话信息。
- 输入:先问“项目使用什么数据库”,再问“它支持事务吗”。
- 预期:第二个问题能结合第一个问题中提到的数据库类型继续回答。
- 判断标准:回答前后一致,没有把两个问题孤立处理。
- 常见问题:历史对话过长导致上下文超限。排查方向是历史裁剪策略。
7.5 工具调用测试
测试目的:确认 MCP 协议下的工具调用能正常工作。
- 输入:请列出项目目录下的所有二级目录。
- 预期:Agent 调用文件读取工具,返回目录列表。
- 判断标准:返回的目录列表与磁盘真实结构一致。
- 常见问题:工具调用失败、超时。排查方向是 MCP server 是否启动、端口是否可达。
7.6 稳定性测试
测试目的:确认在连续任务下服务稳定。
- 操作:连续发送 20 条不同类型的请求。
- 观察项:是否有超时、内存是否持续增长、显存是否溢出。
- 判断标准:20 条请求全部返回,服务进程没有退出。
- 常见问题:内存泄漏、并发请求失败。排查方向是日志中的异常堆栈。
8. 接口 API 与批量任务
如果项目把 Agent 封装成 API 服务,下面是通用的请求格式模板。具体字段名以项目的服务端实现为准。
8.1 服务启动
# 启动 API 服务,实际参数需按项目调整 python serve.py --host 127.0.0.1 --port 8000启动后,用浏览器访问http://127.0.0.1:8000/docs,如果能打开 Swagger 文档,说明服务正常。
8.2 单条问答请求
import requests url = "http://127.0.0.1:8000/api/ask" payload = { "question": "这个项目里 MCP 相关的代码放在什么位置?", "history": [], "task_type": "auto" } response = requests.post(url, json=payload, timeout=180) print(response.json())8.3 curl 调用方式
curl -X POST "http://127.0.0.1:8000/api/ask" \ -H "Content-Type: application/json" \ -d '{ "question": "如何构建 RAG 知识库?", "history": [], "task_type": "auto" }'8.4 批量任务设计
批量问答场景下,不建议用多线程暴力并发请求同一个服务,尤其是本地大模型推理时,显存和计算资源有限,并发过高会导致排队和超时。
更稳的方案是“串行 + 失败重试”:
import time questions = [ "第一个问题", "第二个问题", "第三个问题" ] for i, question in enumerate(questions): result = None for attempt in range(3): try: result = ask_api(question) break except Exception as e: print(f"第 {i} 个问题第 {attempt + 1} 次尝试失败: {e}") time.sleep(2) if result is None: print(f"第 {i} 个问题处理失败") else: print(f"第 {i} 个问题回答完成")这样做的好处是:单条任务失败不会拖垮整个批次,日志里能看到失败位置,重试策略也不会压垮服务。
8.5 知识库批量构建
如果知识库文档很多,建议把构建流程做成独立脚本,支持增量更新:
# 全量构建 python build_knowledge_base.py --data-dir ./data --output ./chroma_db # 增量更新,只处理新增文档 python build_knowledge_base.py --data-dir ./data --output ./chroma_db --incremental批量构建时注意观察向量库的写入速度,如果越来越慢,可能需要检查索引策略或改用更合适的向量数据库。
9. 资源占用与性能观察方法
这个部分不给出固定的显存数字,因为不同模型、不同量化方式、不同上下文长度,实际占用差别很大。这里给的是观察方法和控制思路。
9.1 如何观察显存占用
Linux 下用nvidia-smi实时观察显存,Windows 下可以用任务管理器或nvidia-smi命令。
# 每 2 秒刷新一次显存状态 watch -n 2 nvidia-smi重点看两个数值:进程的显存占用,以及显存总量。如果显存占用接近总量,就该考虑减少并发或换小模型。
9.2 CPU 推理与 GPU 推理的区别
CPU 推理没有显存瓶颈,但速度慢,特别是大模型生成长文本时,等待时间会非常明显。GPU 推理速度快,但显存有限,大上下文或大模型的场景下容易出现 OOM。
实践建议是:Embedding 模型可以用 CPU 跑,因为它单次推理耗时相对短;LLM 尽量用 GPU,否则用户体验会比较差。
9.3 影响性能的关键因素
- 上下文长度:上下文越长,推理耗时和显存占用越大。
- 检索 Top-K:K 值越大,塞给模型的上下文越多。
- 知识库文档量:文档量越大,构建和检索的时间越久。
- 并发请求数:并发越高,显存和计算资源竞争越严重。
- 日志级别:DEBUG 日志会拖慢整体速度,生产环境使用 INFO 或 WARNING。
9.4 降低资源占用的方法
如果你在本地测试时发现显存不够,可以按顺序尝试这三种方案:
- 换用更小的 Embedding 模型或 LLM 量化版本。
- 减少检索返回的 Top-K 值和上下文截断长度。
- 关闭多进程并发,改成串行处理请求。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后页面打不开 | 端口被占用或服务未启动 | 检查日志和端口监听情况 | 更换端口或重启服务 |
| 依赖安装失败 | Python 版本不匹配或包冲突 | 查看报错堆栈,确认包名和版本 | 升级 Python 或使用虚拟环境重新安装 |
| 模型文件缺失 | 模型未下载或路径配置错误 | 检查模型目录是否存在 | 下载模型并更新配置文件 |
| CUDA 相关报错 | 显卡驱动或 PyTorch 版本不匹配 | 运行python -c "import torch; print(torch.cuda.is_available())" | 安装匹配的 CUDA 版 PyTorch |
| 显存不足 | 模型过大或并发过高 | 观察 nvidia-smi 显存占用 | 换小模型、减少并发或降级为 API 模式 |
| RAG 检索结果不相关 | Embedding 模型不合适或分块策略不佳 | 单独测试检索输出 | 更换 Embedding 模型或调整分块参数 |
| 工具调用失败 | MCP server 未启动或端口错误 | 检查 MCP server 进程和网络连通性 | 重启 MCP server,修正端口配置 |
| API 调用超时 | 服务端负载高或响应时间过长 | 查看服务端日志 | 调大超时时间,降低并发 |
| 批量任务卡住 | 单条任务异常但未抛出错误 | 增加任务日志和进度输出 | 为每条任务加超时和重试机制 |
| 输出质量不稳定 | 上下文组织方式不合理 | 对比不同上下文模板的输出 | 调整 Harness 步骤和上下文拼接逻辑 |
日志是最好的排查工具。如果项目里还没有日志系统,可以用 Python 内置的 logging 模块快速加上:
import logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__)11. 最佳实践与使用建议
11.1 先跑通最小闭环,再扩展功能
第一次拿到这个项目,不要急着把所有工具、所有数据都接进来。先完成“用户提问 -> 检索知识 -> 模型回答”的最小闭环,确认基座能用,再逐步加入代码分析 Harness、MCP 工具和多轮对话。
11.2 把中间过程可视化
Harness 架构最大的优点是可观测性。开发时把每一步骤的输入输出打印到日志里,出问题时能直接看到 Agent 是在哪一步产生了错误判断。这一步非常值得做,不要嫌麻烦。
11.3 输入、输出、模型文件分开管理
建议目录结构如下:
project/ ├── data/ # 原始文档和输入素材 ├── outputs/ # 生成结果和日志 ├── models/ # 本地模型文件 ├── chroma_db/ # 向量数据库持久化目录 ├── src/ # 项目源码 └── configs/ # 配置文件这样清理缓存、备份数据、迁移环境都比较方便。
11.4 批量任务必须加日志和重试
批量任务跑的时间越久,越需要完善的日志。每条任务至少记录:开始时间、输入摘要、是否成功、失败原因。重试次数建议 2 到 3 次,间隔 2 到 5 秒,避免瞬时抖动导致批量任务中断。
11.5 接口服务要限制访问范围
如果 API 服务部署在服务器上,不要直接暴露到公网。先绑定127.0.0.1,需要远程访问时再通过内网或反向代理加认证。涉及代码仓库和内部文档的接口,必须有明确的权限控制。
11.6 注意数据授权与隐私合规
代码分析、知识库问答这类场景,数据通常是团队内部的重要资产。用于构建知识库的文档、代码,必须确认有合法使用和存储的授权。如果项目涉及人脸、声音、个人信息等敏感数据,更要在数据采集、存储、生成和发布全链路做好合规控制。
12. 总结与下一步
这个项目最值得尝试的点,是它把 AI Agent 学习路上的几个关键深水区都覆盖了:Harness 架构解决可控性问题,RAG 解决知识来源问题,MCP 解决工具接入问题,Embedding 解决检索质量,上下文工程解决模型输出质量,Skills 则把常用的能力沉淀成可复用资产。
建议你先从 RAG 知识库问答跑起来,这是最容易看到效果的功能。接着再验证代码分析的 Harness 流程能否正常执行,最后再把 MCP 工具接进来。只要这三个环节跑通,这套学习助手的基本能力就完整了。
最容易踩的坑有两个:一个是 Embedding 模型选型不合适导致检索效果差,一个是上下文拼接顺序不合理导致模型被无关信息干扰。遇到这两个问题时,先单独验证每个环节的输出,再整体联调,定位会快很多。
后续可以扩展的方向包括:把 Skills 模块做成可插拔的插件体系、接入更多 MCP 工具、将 API 服务部署到 Docker、在知识库中配置增量更新任务。如果你正在准备 AI Agent 相关的面试或团队内部要做智能学习助手,这个项目值得花时间吃透。
这套项目的核心不是某个模型有多强,而是让你掌握一套完整的 Agent 工程化方法。把 Harness 架构、RAG、MCP、Embedding 和上下文工程串起来的能力,放到任何一个 Agent 项目里都可以复用。建议收藏备用,动手实践一次比看十遍文章有用得多。