AI大模型应用开发实战:两周掌握从API调用到RAG与Agent的完整技术栈
发布时间:2026/9/8 2:01:03 作者:尧图编辑部 阅读量:1,286

这几年AI大模型的热度大家有目共睹但真正落到“开发”这个层面很多人的状态其实是看了一堆概念、收藏了一堆文章、安装了几个工具然后就没有然后了。如果你正处在“知道大模型很强但不知道从哪下手”的阶段这篇内容就是写给你的。这篇文章不打算给你讲那些空泛的“AI 时代来了”的论调而是直击核心AI大模型应用开发到底在开发什么你需要掌握哪些技术栈有没有一条已经被验证过的路径能让你用最短的时间跑通从调用 API 到交付一个可用应用的全过程。先说判断大模型应用开发不是一个“新编程语言”而是一套“新架构模式”。它不要求你从零实现神经网络但要求你非常清楚模型能力边界、工程化调用方式、数据组织方式以及如何把模型能力和业务逻辑粘合在一起。真正的难点从来不是调用一次接口而是稳定、可控、可维护地让大模型在你的业务里长期可靠地工作。读完这篇文章你会得到一条完整的、以两周为周期的 AI 大模型应用开发学习路径包含环境搭建、核心概念、完整代码示例、常见坑点和工程实践建议。建议先收藏然后跟着一步步走。1. 为什么很多人学了大半年还是写不出一个像样的 AI 应用先聊一个现实问题。这两年我见过太多开发者陷入同一个困境课程买了一堆今天学 Prompt 工程明天看 Agent 框架后天又去研究微调结果学完还是不知道自己能做什么。问题出在哪里学习顺序错了而且知识是碎片化的。大模型应用开发表面上是一堆新名词的集合Prompt、Completion、Token、Embedding、RAG、Agent、Fine-tuning、Function Calling。但如果只盯名词你会永远被新技术拖着跑。正确的思路是先搞清楚一个完整的 AI 应用由哪几部分组成然后围绕这个框架去填充知识点。一个标准的大模型应用无论复杂程度如何都包含下面几个核心模块模块解决的问题典型技术模型接入层怎么调用模型能力OpenAI SDK、Ollama、各大模型 APIPrompt 管理层怎么让模型稳定输出Prompt 模板、Few-shot、系统提示词数据上下文层怎么让模型知道你业务的私有数据RAG、向量数据库、Embedding工具调用层怎么让模型操作外部系统Function Calling、MCP、Agent 框架应用集成层怎么嵌入到真实业务Spring Boot、Django、Vue/React效果验证层怎么评估和监控模型效果评测集、日志追踪、回归测试理解了这张表你就理解了整个大模型应用开发的骨架。后面所有的学习都应该围绕这六个模块展开而不是东一榔头西一棒子。2. 大模型应用开发的核心概念用一篇文章讲透底层原理在开始动手之前有几个基础概念必须彻底搞清楚。否则后面的代码对你来说只是“照着敲一遍”。2.1 Token计费、长度和性能的基本单位Token 是大模型处理文本的最小单位。它既不是字符也不是单词而是一个由分词器拆分出来的片段。1 个汉字大约等于 1 到 2 个 Token。1 个英文单词大约等于 1 到 2 个 Token。模型输入和输出的 Token 总量决定了 API 调用的费用。模型的“上下文窗口”限制本质就是 Token 数量限制。在实际开发中你需要对 Token 消耗有敏感度。一个在循环里反复拼接上下文的 AgentToken 消耗会指数级上升。这也是大模型应用成本失控最常见的原因。2.2 Prompt不是“聊天话术”而是“程序接口”很多新手把 Prompt 理解成“怎么跟 AI 说话”这是误区。在应用开发里Prompt 是你与模型之间唯一的编程接口。它的作用是约束模型行为而不是聊天。一个生产级的 Prompt 通常包含角色设定让模型明确自己是谁。任务描述告诉模型具体要做什么。输入数据用占位符传入动态内容。输出格式规定 JSON 结构、字段名、枚举值。边界条件如果遇到无法处理的问题该怎么回答。// 一个标准的 Prompt 模板示例 你是一个智能客服助手。请根据给定的用户问题调用相关工具获取信息并以 JSON 格式返回结果。 用户问题{{question}} 当前时间{{current_time}} 输出格式 { intent: 意图分类取值为 query_order / query_product / other, parameters: {}, reply_template: 回复模板包含 {placeholder} 占位符 }2.3 RAG让大模型学会“查资料”而不是“编答案”RAGRetrieval-Augmented Generation检索增强生成是目前企业落地大模型最重要的技术。它要解决的问题很实际通用大模型训练时没见过你的企业文档、内部系统数据或最新产品信息。直接问它它就一本正经地胡编。RAG 的思路是先检索再生成。先把用户问题转化为向量在向量数据库中找出最相关的文档片段然后把这些片段拼接进 Prompt让模型基于这些资料回答。RAG 的完整链路包含文档加载与解析。文本切片。向量化Embedding。存储到向量数据库。查询时向量化用户问题。相似度检索。将检索结果拼入 Prompt 后调用大模型。2.4 Fine-tuning什么时候需要微调模型与 RAG 并列的是 Fine-tuning微调。很多人刚开始会把微调想象得很复杂但在当前主流 API 模式下微调更多是“用高质量数据继续训练已有开源模型或 API 模型”。什么情况下适合微调模型需要模仿特定的写作风格或表达方式。模型需要稳定输出特定格式的内容且 Prompt 无法约束。推理成本敏感希望通过微调减小 Prompt 长度压缩 Token 消耗。需要私有化部署开源模型并针对业务数据做定向增强。什么情况下不应该微调知识不足的问题先用 RAG 解决。格式不稳定先优化 Prompt 和输出解析。数据量不够微调只会让效果更差。2.5 Agent从“回答问题”到“完成任务”Agent 是当前大模型应用开发中最活跃的方向。它的本质是让大模型具备规划、调用工具、观察结果、继续决策的能力。一个完整的 Agent 循环通常包括接收用户任务。大模型进行任务拆解。根据规划调用外部工具搜索、查数据库、调 API、执行代码。获取工具返回结果。将结果反馈给大模型。大模型判断任务是否完成决定继续调用还是输出最终回答。Agent 的关键在于 Function Calling函数调用。也就是让模型输出一个结构化的“调用意图”而不是自由文本。开发者解析这个意图执行真实代码再把结果回传给模型。3. 环境准备搭建一套可复用的开发底座动手之前先把环境准备好。这里我给出的是通用方案版本信息请以官方文档为准。3.1 语言环境主推 Python 3.10。原因是大模型生态最成熟的 SDK、工具链和示例代码都在 Python 生态里。如果你主攻 Java也可以走 Spring AI 路线但建议先会用 Python 跑通原型再用 Java 做工程化落地。3.2 模型获取方式API 还是本地部署初学者建议优先使用 API 方式。原因有三API 模式免去 GPU 部署的硬件门槛。生态工具最丰富排错资料最多。上下文窗口、模型版本更新及时。本地部署开源模型如通过 Ollama适合以下场景数据不能出内网。需要离线推理。需要高频调用且 Token 成本敏感。想深入学习模型推理原理。这里推荐一个组合方案日常开发和原型验证用 API涉及隐私数据或想要离线运行时就切到 Ollama。两者的接口设计比较接近切换成本可控。# 安装 OllamamacOS / Linux 通用方式 curl -fsSL https://ollama.com/install.sh | sh # 拉取一个适合开发测试的开源模型以 qwen2.5 为例 ollama pull qwen2.5:7b # 启动本地模型服务 ollama serve3.3 依赖库不管走 API 还是本地模型都需要安装下面这些基础库pip install openai # 大模型 API 调用 pip install langchain # 应用框架可选但推荐了解 pip install chromadb # 轻量级向量数据库 pip install fastapi # 后端服务框架 pip install pydantic # 数据校验和结构化输出 pip install python-dotenv # 环境变量管理3.4 开发工具IDE 推荐 VS Code 或 Cursor。接口调试推荐 Postman 或 Apifox。代码管理使用 Git建议从第一天就建仓。需要离线验证时安装一个 Ollama 就够。4. 两周学习路线分阶段拆解 AI 大模型应用开发实战路径这套两周计划是基于前文六个核心模块设计的。前一周打基础后一周做综合实战。每天保证 3 到 4 小时高效学习即可。4.1 第 1 天到第 2 天跑通第一个模型调用目标用最少代码完成大模型从“输入”到“输出”的全流程。不要一上来就研究复杂框架。先用原生的 OpenAI SDK 写一个最小示例把模型 API 的请求和响应结构印在脑子里。from openai import OpenAI client OpenAI( api_keyyour-api-key, base_urlhttps://api.your-provider.com/v1, ) response client.chat.completions.create( modelyour-model-name, messages[ {role: system, content: 你是一个熟悉 Python 的编程助手。}, {role: user, content: 请用 Python 写一个快速排序函数。}, ], temperature0.7, ) print(response.choices[0].message.content)这个阶段不需要写业务代码重点是理解几个关键参数model指定使用哪个模型。messages对话消息列表包含 system、user、assistant 三种角色。temperature控制随机性值越低越稳定。max_tokens限制最大输出长度。4.2 第 3 天理解 Prompt 工程的核心方法今天的任务是学会用 Prompt 控制模型输出。做一个练习让模型从一段电商评论中提取用户情感、购买商品、评价维度并输出 JSON。prompt 你是一个文本信息抽取助手。请从下面的评论内容中提取结构化信息以 JSON 格式返回 评论{{ content }} 要求返回的 JSON 格式如下 { sentiment: positive / negative / neutral, product: 评论涉及的商品名称, aspects: [评价维度1, 评价维度2] } 只返回 JSON不要输出其他内容。 .replace({{ content }}, review_text)练完之后你会发现与其到处找“提示词技巧”不如把 Prompt 当成接口来设计。字段、格式、约束、示例越明确输出越稳定。4.3 第 4 天掌握 RAG让模型基于私有知识库回答今天的核心是实现一个最简 RAG 链路。不需要复杂框架原生代码就能跑通。from openai import OpenAI import chromadb # 初始化客户端 client OpenAI(api_keyyour-api-key, base_urlhttps://api.your-provider.com/v1) chroma_client chromadb.Client() collection chroma_client.get_or_create_collection(knowledge_base) # 1. 构建知识库每一条文本先向量化再写入向量数据库 def add_document(doc_id, text): response client.embeddings.create( modelyour-embedding-model, inputtext, ) vector response.data[0].embedding collection.add(ids[doc_id], documents[text], embeddings[vector]) # 2. 检索把用户问题向量化然后查最相似的片段 def search(query, top_k3): response client.embeddings.create( modelyour-embedding-model, inputquery, ) query_vector response.data[0].embedding results collection.query(query_embeddings[query_vector], n_resultstop_k) return results[documents][0] # 3. 增强生成把检索到的片段拼入 Prompt再调用大模型 def ask_with_rag(question): docs search(question) context \n.join(docs) response client.chat.completions.create( modelyour-model-name, messages[ {role: system, content: 你是一个基于知识库回答问题的助手。只能使用提供的资料回答资料不足时如实说明。}, {role: user, content: f参考资料\n{context}\n\n用户问题{question}}, ], ) return response.choices[0].message.content这段代码是 RAG 的最小骨架。它是你理解 LangChain、LlamaIndex 等框架的底层基础也是以后排查线上问题的知识储备。4.4 第 5 天学习 Function Calling 与 Agent 基础今天开始接触 Agent。先掌握 Function Calling也就是让模型在回答中输出一个“要调用哪个函数、参数是什么”的结构化请求。# 定义一个让模型可以调用的“工具” tools [ { type: function, function: { name: get_weather, description: 查询指定城市的实时天气, parameters: { type: object, properties: { city: {type: string, description: 城市名称}, }, required: [city], }, }, } ] response client.chat.completions.create( modelyour-model-name, messages[ {role: user, content: 北京今天天气怎么样}, ], toolstools, ) # 模型会返回 tool_calls而不是直接给出最终答案 tool_calls response.choices[0].message.tool_calls print(tool_calls)看到tool_calls的输出之后你就明白 Agent 的原理了模型负责决策代码负责执行执行结果再喂回给模型继续推理。4.5 第 6 天用 Web 框架封装 AI 能力今天开始“应用化”把前面写的能力封装进 Web 服务。from fastapi import FastAPI, HTTPException from pydantic import BaseModel app FastAPI() class ChatRequest(BaseModel): message: str use_rag: bool True app.post(/api/chat) async def chat(req: ChatRequest): try: if req.use_rag: answer ask_with_rag(req.message) else: answer ask_basic(req.message) return {answer: answer} except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.get(/health) async def health(): return {status: ok}到此你已经有了一个带 API 入口的 AI 应用雏形。4.6 第 7 天复盘与补漏第一周周末完成以下练习手写一遍完整的 RAG 代码不参考任何资料。为你的 Prompt 写 10 个测试用例检查输出格式是否稳定。把你的 FastAPI 服务跑起来用 Postman 调用/api/chat接口。这一天的重点是“查漏”而不是“学新”。哪一环卡住了就回去看对应章节。4.7 第 8 天到第 10 天开发一个完整项目第二周开始进入综合实战。推荐做一个“企业知识库问答助手”因为它覆盖了大模型应用开发的核心闭环。项目需求上传 PDF、TXT、Markdown 文档。解析并切片。存进向量数据库。用户提问时基于知识库回答。标注回答依据了哪些文档片段。功能拆解模块实现方案文件上传FastAPI 静态文件和 UploadFile文档解析PyPDF2 或 Unstructured文本切片按固定长度加重叠并用 RecursiveCharacterTextSplitter向量化调用 Embedding API存储检索ChromaDB问答生成Chat Completion API前端界面HTML Vue CDN 或 Streamlit4.8 第 11 天到第 12 天引入 Agent 能力并优化给知识库助手加上 Agent 能力让它不仅能查知识库还能调用外部工具查数据库订单信息。调用计算器做数值计算。通过 Web Search API 查询实时信息。自动判断用户意图决定是走知识库还是走工具调用。4.9 第 13 天部署上线将项目部署到云服务器或内网服务器。部署时重点做三件事用 Gunicorn Uvicorn 启动 FastAPI 服务。用 Nginx 做反向代理。配置环境变量文件把 API Key 和数据库连接串从代码中分离。# 安装部署依赖 pip install gunicorn # 启动服务4 个 worker 进程 gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:80004.10 第 14 天总结、复盘、写文档最后一天写清楚三份文档架构设计说明。部署运维手册。效果评测报告。写出文档才是真正的“会了”因为你必须把隐性知识显性化。5. 完整示例一个生产向的知识库问答服务为了让上面的路线更具体下面给出一份接近生产实践的代码实现。文件结构如下ai-knowledge-base/ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── config.py │ ├── models.py │ ├── rag.py │ └── prompts.py ├── docs/ # 存放待索引的知识文档 ├── requirements.txt └── .env5.1 配置文件app/config.pyimport os from dotenv import load_dotenv load_dotenv() OPENAI_API_KEY os.getenv(OPENAI_API_KEY) OPENAI_BASE_URL os.getenv(OPENAI_BASE_URL, https://api.your-provider.com/v1) CHAT_MODEL os.getenv(CHAT_MODEL, your-chat-model) EMBEDDING_MODEL os.getenv(EMBEDDING_MODEL, your-embedding-model) CHROMA_DIR os.getenv(CHROMA_DIR, ./chroma_data)5.2 数据模型app/models.pyfrom pydantic import BaseModel, Field from typing import List, Optional class ChatRequest(BaseModel): question: str Field(..., description用户问题) top_k: int Field(3, description检索的文档片段数量) class SourceItem(BaseModel): content: str score: float class ChatResponse(BaseModel): answer: str sources: List[SourceItem]5.3 RAG 核心实现app/rag.pyfrom openai import OpenAI import chromadb from app import config client OpenAI(api_keyconfig.OPENAI_API_KEY, base_urlconfig.OPENAI_BASE_URL) chroma_client chromadb.PersistentClient(pathconfig.CHROMA_DIR) collection chroma_client.get_or_create_collection(knowledge_docs) def add_document(doc_id: str, text: str): response client.embeddings.create( modelconfig.EMBEDDING_MODEL, inputtext, ) vector response.data[0].embedding collection.upsert(ids[doc_id], documents[text], embeddings[vector]) def search_documents(query: str, top_k: int 3): response client.embeddings.create( modelconfig.EMBEDDING_MODEL, inputquery, ) query_vector response.data[0].embedding results collection.query( query_embeddings[query_vector], n_resultstop_k, include[documents, distances], ) docs results[documents][0] distances results[distances][0] return list(zip(docs, distances)) def ask_question(question: str, top_k: int 3): sources search_documents(question, top_k) context \n\n.join([doc for doc, _ in sources]) prompt f 你是一个企业知识库问答助手。请基于提供的参考文档回答用户问题。 要求 1. 只能使用参考文档中的信息回答。 2. 如果参考文档无法回答请如实说明“根据现有资料无法回答”。 3. 使用清晰的结构化文本回答。 参考文档 {context} 用户问题 {question} completion client.chat.completions.create( modelconfig.CHAT_MODEL, messages[ {role: system, content: 你是一个严谨的知识库问答助手。}, {role: user, content: prompt}, ], temperature0.2, ) answer completion.choices[0].message.content source_items [SourceItem(contentdoc, scoreround(1.0 - dist, 4)) for doc, dist in sources] return ChatResponse(answeranswer, sourcessource_items)5.4 启动入口app/main.pyfrom fastapi import FastAPI from app.models import ChatRequest, ChatResponse from app.rag import ask_question, add_document app FastAPI(titleAI Knowledge Base API) app.post(/api/chat, response_modelChatResponse) async def chat(req: ChatRequest): return ask_question(req.question, req.top_k)5.5 运行与测试# 安装依赖 pip install fastapi uvicorn chromadb openai pydantic python-dotenv # 启动服务 uvicorn app.main:app --reload --port 8000用 curl 验证curl -X POST http://localhost:8000/api/chat \ -H Content-Type: application/json \ -d {question: 公司的年假政策是什么, top_k: 3}如果知识库中没有相关文档模型应该返回“根据现有资料无法回答”而不是编造答案。这本身就是验证 RAG 是否生效的关键信号。6. 如何验证“你确实学会了”学习路线和示例代码都给出后最容易被忽略的就是效果验证。很多人代码跑通了就觉得完事了但真实项目里的问题往往在测试环节暴露。建议从四个维度建立自己的验证体系。6.1 功能验证准备一组带标准答案的测试问题覆盖正常问题、模糊问题、无答案问题三类的边界场景。跑通后对比输出确认 RAG 是否命中正确文档、格式是否合法。6.2 稳定性验证同一个问题连续调用 10 次统计输出格式的稳定性。如果出现多次 JSON 解析失败就需要在 Prompt 中加入更严格的格式约束或使用模型的结构化输出能力。6.3 性能验证用工具模拟并发请求观察接口的响应时间和失败率。大模型接口的延迟通常在秒级这是正常现象。但如果并发一高就超时就要考虑加缓存、改异步、限制并发数、使用流式输出。6.4 成本验证记录每一次请求的输入和输出 Token 数估算单位调用成本。上线前做一个成本估算表避免业务跑起来后费用超预期。7. 常见问题与排查思路下面的表格汇总了初学者最多遇到的问题建议直接保存。问题现象可能原因排查方式解决方案API 调用报认证失败API Key 错误或忘记配置环境变量打印环境变量检查 Base URL 是否正确重新配置.env确认 Key 有效模型返回内容被截断输出 Token 上限太小查看响应的finish_reason是否为length增加max_tokens或让回答更简洁RAG 检索结果相关性差文本切片太短或太长打印检索片段人工查看相关性调整切片长度和重叠度尝试换 Embedding 模型模型回答与资料不符知识库被污染或 Prompt 约束不足检查检索结果是否包含无关文档加强 Prompt 限制过滤低分数片段Agent 调用工具死循环没有设定最大轮数查看 Agent 运行日志增加最大调用次数限制和超时控制并发一高就超时模型接口延迟高或 Web 服务配置不足查看服务日志和调用耗时加缓存、限流、异步化、水平扩容chromadb旧数据干扰新知识库向量库持久化没有清理查看集合中的文档数量启动时清理集合或按业务维度分 collection本地 Ollama 推理很慢没有 GPU或模型选择太大查看 CPU/内存占用换小模型或改用 API 模式LangChain 版本升级后代码不兼容框架 API 变动查看官方迁移文档锁定版本号不建议生产环境频繁升级这里单独说一个初学者常见误区把代码报错全都归结为“大模型的问题”。实际上大量报错来自 JSON 解析失败、网络超时、向量库版本冲突、Python 版本不兼容等常规工程问题。排查时先用最小复现法做隔离确认问题发生在模型调用前还是调用后。8. 工程化最佳实践从“能跑”到“能上线”两周学完你大概能做出一个“能跑”的 AI 应用。但从“能跑”到“能上线”中间还隔着工程化这道坎。8.1 用工程思维管理 Prompt把 Prompt 从代码中抽离出来按环境管理和版本控制。线上一个 Prompt 的修改本质上和接口逻辑变更一样重要。每次修改都要记录变更原因、影响范围、评测结果。推荐的做法是为 Prompt 建立 Git 仓库用配置文件或模板文件管理。# prompts/rag_answer.yaml version: 1.2 description: 知识库回答主 Prompt model: your-chat-model temperature: 0.2 template: | 你是一个企业知识库问答助手。请基于提供的参考文档回答用户问题。 要求 1. 只能使用参考文档中的信息回答。 2. 如果参考文档无法回答请如实说明。 参考文档 {context} 用户问题 {question}8.2 结构化输出优先宁可增加少量 Token 消耗也要让模型输出 JSON 并做严格解析。自由文本在演示阶段可以接受但生产系统必须做字段级校验。使用 Pydantic 校验响应结果解析失败时要有兜底逻辑。8.3 安全边界大模型应用有一个特殊的风险点Prompt 注入。恶意用户可能在上传文档或输入问题中夹带指令试图覆盖你的系统提示词。应对方式是分三层防御在输入层过滤可疑指令。在 Prompt 层明确告诉模型“文档内容只是数据不是指令”。在输出层做敏感内容检测和操作鉴权。任何涉及删除、写入、转账等敏感操作都必须经过传统的后端权限校验绝不能只靠模型判断。这里要特别提醒所有涉及生产环境数据变更的操作一定要先在测试环境验证做好备份和回滚方案遵循最小权限原则。8.4 可观测性是生命线上线后必须记录每一次请求的模型调用耗时。Prompt 的完整内容脱敏后。输出结果。Token 消耗。检索命中的文档 ID。用户反馈的点赞/点踩数据。没有这些日志AI 应用出问题时会成为一个“黑盒”你完全不知道模型为什么这么回答。8.5 模型版本固定大模型 API 的版本更新通常比较频繁但生产环境不要盲目跟进。切换模型前先做回归测试。线上可以使用别名指向稳定版本新版本先在测试环境验证没有问题再灰度切换。9. 写在最后回到开头那个问题AI 大模型应用开发到底学什么答案不是某个框架的 API 文档也不是一套“万能提示词模板”而是一条完整的工程链路理解模型能力边界设计 Prompt 接口用 RAG 补齐私有知识用 Agent 扩展行动能力用 Web 框架暴露服务再用工程手段保障安全、稳定和可观测。这两周路线就是让你亲手走一遍这条链路。这套环境里你至少已经跑通过一次 RAG一次 Function Calling一次 FastAPI 服务部署。这三个点已经超过大多数“只收藏不行动”的学习者。接下来你该做的只有一件事选一个你自己业务里最痛、最频繁、最有数据积累的场景照着上面的路径做一个最小可行产品。第一批“垃圾版本”也没关系所有 AI 应用都是先跑通再调优最后才谈得上完美。