AI大模型实战指南:从RAG到Agent的完整技术栈解析
1. 先搞清楚这套教程到底解决什么问题
如果你刚接触AI大模型,看到RAG、Agent、LangChain、Prompt、微调这些词,第一反应可能是“每个字都认识,连起来不知道在说什么”。这套教程最实际的价值,是把这些看似高大上的概念,拆解成可操作的步骤:从怎么让大模型回答你公司的内部文档问题(RAG),到怎么让模型按流程执行任务(Agent),再到怎么用框架把多个工具串起来(LangChain),最后到怎么调教模型更懂你的需求(Prompt和微调)。
我一般会先跟新手说:别急着跑代码,先弄明白每个技术到底解决什么场景的问题。RAG适合“模型知识库之外”的问答,比如内部文档、最新政策、私有数据;Agent适合“多步骤任务”,比如先查天气再订机票;LangChain是帮你把模型、工具、数据源连接起来的脚手架;Prompt是告诉模型“具体怎么回答”的指令;微调则是让模型彻底适应你的业务话术或专业领域。
这套组合拳学下来,你才能真正把大模型用起来,而不是只停留在聊天界面。但要注意,这些技术栈有学习梯度——建议按RAG → Prompt → LangChain → Agent → 微调的顺序推进,别一上来就啃最难的。
2. 环境准备:最低什么配置能跑起来?
很多人卡在第一步:环境装不上。这里我给一个最低可行配置,以及推荐配置。
最低配置(能跑通Demo)
- CPU:4核以上(Intel i5或同级)
- 内存:8GB(跑小模型或API调用)
- 磁盘:20GB剩余空间(放模型、依赖包)
- 系统:Windows 10/11、macOS 10.15+、Linux Ubuntu 18.04+(推荐Linux,少踩坑)
- 网络:能稳定访问Hugging Face、PyPI(必要时配置镜像源)
推荐配置(流畅学习+小规模实测)
- CPU:8核以上(Intel i7或同级)
- 内存:16GB~32GB(本地跑7B以下模型)
- GPU:可选,但有GPU会快很多(GTX 3060 12GB或以上,能跑13B模型)
- 磁盘:100GB SSD(模型文件很大)
关键依赖清单
- Python 3.8~3.11(别用3.12,很多包还没适配)
- pip 20.3+
- 虚拟环境(必选!用conda或venv隔离项目)
- 基础包:torch、transformers、langchain、openai(或其他模型API包)
安装时最容易翻车的是torch和CUDA版本不对应。我建议直接用官方命令查兼容版本:
# 查看CUDA版本 nvidia-smi # 根据CUDA版本安装torch(示例为CUDA 11.8) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果没GPU,就用CPU版torch,但推理速度会慢10倍以上,建议先跑小模型或直接用API(如OpenAI、通义千问、DeepSeek)。
3. RAG实战:从零搭建一个企业知识库问答
RAG(Retrieval-Augmented Generation)是大模型落地最实用的技术之一。核心思路是:先从你的文档里检索相关片段,再让模型基于这些片段生成答案。这样模型就不会胡编乱造,尤其适合内部文档、产品手册、法规条文等场景。
3.1 文档处理四步走
- 加载文档:支持txt、pdf、word、markdown等。用LangChain的DocumentLoader:
from langchain.document_loaders import TextLoader loader = TextLoader("公司制度.txt") documents = loader.load() - 切分文本:大文档必须切块,否则模型记不住。按段落或固定长度切:
from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = splitter.split_documents(documents) - 向量化:把文本变成数学向量,才能快速检索。用Sentence-BERT或OpenAI Embeddings:
from langchain.embeddings import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") - 存储向量库:用FAISS、Chroma等存起来,方便后续检索:
from langchain.vectorstores import FAISS vectorstore = FAISS.from_documents(chunks, embeddings) vectorstore.save_local("faiss_index")
3.2 检索与生成闭环
检索阶段最怕“搜不到”或“搜偏了”。建议先测试检索质量:
query = "年假有多少天?" docs = vectorstore.similarity_search(query, k=3) # 返回最相关的3个片段 for doc in docs: print(doc.page_content) # 看检索结果是否相关确认检索片段靠谱后,再拼接到Prompt里给模型:
from langchain.llms import Ollama # 本地模型示例 llm = Ollama(model="qwen2.5:7b") context = "\n".join([doc.page_content for doc in docs]) prompt = f"基于以下资料回答问题:\n{context}\n问题:{query}" answer = llm.invoke(prompt)3.3 避坑指南
- 块大小不是越大越好:超过模型上下文长度会截断,一般设500~1000字。
- 重叠度影响连贯性:chunk_overlap设50~100,避免关键信息被切碎。
- 嵌入模型选通用的:先用all-MiniLM-L6-v2这种通用模型,别一上来就训专用模型。
- 检索数量k=3起步:太少信息不足,太多噪声大,根据文档密度调整。
如果输出答案还是胡编乱造,90%是检索环节出了问题——不是文档没切好,就是向量模型没选对。先别急着调模型,把检索结果打印出来看看。
4. Prompt工程:让模型听懂人话的关键
Prompt是你和模型沟通的“翻译器”。同样的模型,Prompt水平差,输出可能完全没法用。我总结了三层Prompt技巧:基础指令、思维链、模板化。
4.1 基础指令结构
坏Prompt:“介绍一下云计算” 好Prompt:“用通俗易懂的方式向高中生介绍云计算,包括定义、主要特点、常见服务形式。分点输出,每点不超过20字。”
好Prompt包含:
- 角色:向高中生介绍
- 任务:介绍云计算
- 要求:通俗易懂、分点、每点20字内
- 格式:分点输出
在代码里,可以用LangChain的PromptTemplate规范起来:
from langchain.prompts import PromptTemplate template = """你是一名{role}。请用{style}的方式回答以下问题: 问题:{question} {format_requirement}""" prompt = PromptTemplate( input_variables=["role", "style", "question", "format_requirement"], template=template ) filled_prompt = prompt.format( role="科技科普作者", style="通俗易懂", question="什么是区块链?", format_requirement="分三点说明,每点不超过30字" )4.2 思维链(Chain-of-Thought)
对于复杂问题,让模型“一步一步想”:
请逐步推理:如果小明每天存10元,存了30天后花掉一半,然后又每天存15元存了20天,最后有多少钱? 第一步:计算第一阶段存款... 第二步:计算花掉一半后剩余... 第三步:计算第二阶段存款... 第四步:计算总额...在代码中可以用LangChain的LLMChain实现多步推理:
from langchain.chains import LLMChain chain = LLMChain(llm=llm, prompt=prompt) result = chain.run({ "role": "数学老师", "style": "步骤清晰", "question": "小明存款问题", "format_requirement": "分四步推理,最后给出答案" })4.3 模板化应对批量任务
当你要处理大量相似问题时,建一个Prompt模板库:
templates = { "summary": "用不超过100字总结以下内容:{text}", "qa": "基于已知信息回答:已知:{context} 问题:{question}", "classification": "将以下文本分类为{classes}中的一类:{text}" } # 使用时根据任务类型选择模板 prompt_type = "qa" formatted = templates[prompt_type].format(context=doc_text, question=query)常见错误:Prompt太长导致截断。模型有上下文限制(如4K、8K、16K token),算上你的Prompt和输出,别超限。看到"prompt is too long"错误时,先压缩Prompt或换长上下文模型。
5. LangChain框架:把零散工具组装成流水线
LangChain不是魔法,它只是一个“连接器”——把模型、工具、数据源连接成可复用的流程。学LangChain最关键的是理解其核心概念:Model I/O、Retrieval、Chains、Agents。
5.1 Model I/O:统一接口调用不同模型
不管用OpenAI、本地模型还是开源API,写法统一:
from langchain.llms import OpenAI from langchain.chat_models import ChatOpenAI from langchain.llms import Ollama # 三种调用方式示例 llm_openai = OpenAI(api_key="你的密钥") # OpenAI GPT chat_model = ChatOpenAI(model="gpt-3.5-turbo") # 聊天模式 llm_local = Ollama(model="qwen2.5:7b") # 本地模型 # 同样的调用方式 response = llm_local.invoke("你好")这样换模型时只需改一行代码,不用重写整个项目。
5.2 Chains:把多个步骤串起来
比如先检索文档再生成答案的RAG链:
from langchain.chains import RetrievalQA qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", # 简单拼接检索结果 retriever=vectorstore.as_retriever(), return_source_documents=True # 返回参考文档 ) result = qa_chain.invoke({"query": "公司年假政策"}) print(result["result"]) # 答案 print(result["source_documents"]) # 参考来源Chain_type有四种选择:
stuff:所有检索结果拼一起喂给模型(简单快速)map_reduce:先分别处理每个片段,再汇总(处理长文档)refine:迭代式逐步完善答案(质量高但慢)map_rerank:给每个片段打分,选最好的(平衡质量速度)
新手先用stuff,文档大或要求高时用map_reduce。
5.3 与LangGraph的区别
LangChain是线性流水线,LangGraph支持循环、分支等复杂流程。比如一个客服Agent:用户提问→检索知识库→生成答案→用户不满意→转人工。这种带反馈循环的场景用LangGraph更合适。
刚开始学不必纠结区别,90%的场景LangChain够用。等需要复杂工作流时再上LangGraph。
6. Agent开发:让模型学会使用工具
Agent是大模型应用的进阶阶段——模型不再只是回答问题,而是能调用工具完成任务。比如“查一下北京天气然后推荐穿衣”这种多步骤任务。
6.1 工具定义:告诉模型能用什么
首先定义工具函数:
from langchain.agents import tool import requests @tool def get_weather(city: str) -> str: """获取指定城市的天气情况""" # 模拟API调用 return f"{city}天气:晴,25℃" @tool def recommend_clothing(temperature: int) -> str: """根据温度推荐穿衣""" if temperature > 30: return "建议穿短袖" elif temperature > 20: return "建议穿长袖" else: return "建议穿外套"6.2 创建Agent:组合工具和模型
from langchain.agents import initialize_agent, AgentType from langchain.tools import Tool tools = [get_weather, recommend_clothing] agent = initialize_agent( tools=tools, llm=llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 最稳定的类型 verbose=True # 显示思考过程 )6.3 执行任务:看模型如何思考
result = agent.run("北京天气怎么样?该穿什么衣服?")设置verbose=True后,你会看到模型的思考过程:
Thought: 用户问了两个问题:天气和穿衣建议。我需要先获取北京天气,再根据温度推荐穿衣。 Action: get_weather Action Input: {"city": "北京"} Observation: 北京天气:晴,25℃ Thought: 现在温度是25℃,需要调用推荐穿衣工具。 Action: recommend_clothing Action Input: {"temperature": 25} Observation: 建议穿长袖 Final Answer: 北京天气晴朗,25摄氏度,建议穿长袖。这种结构化的思考-行动-观察循环,就是Agent的核心。
6.4 常见问题排查
- 模型不调用工具:检查工具描述是否清晰,Prompt是否明确要求使用工具。
- 工具参数错误:确保工具的参数类型和描述匹配。
- 无限循环:设置max_iterations参数限制最大步数。
对于复杂任务,建议先用Hermes Agent、PI Agent这类现成框架,它们已经处理了很多边界情况。
7. 微调:让模型真正理解你的业务
当Prompt工程无法满足需求时(比如需要特定术语、固定格式、专业领域知识),就需要微调。但微调成本高,要先判断是否必要。
7.1 什么情况需要微调?
- 领域专有名词:医疗、法律、金融等专业术语
- 固定输出格式:始终返回JSON、特定报告格式
- 风格一致性:公司特有的文案风格、客服话术
- 大量私有数据:成千上万的业务问答对
如果只是偶尔需要特定格式,用Prompt模板更划算;如果需要处理大量私有数据且要求高一致性,再考虑微调。
7.2 微调数据准备
数据质量决定微调效果。需要准备问答对或指令-响应对:
[ { "instruction": "用公司标准格式介绍产品A", "input": "产品A参数:尺寸10x10cm,重量200g", "output": "产品A是一款尺寸为10x10cm、重量200g的优质产品..." }, { "instruction": "回答客户关于退换货政策的问题", "input": "购买后7天内可以退换吗?", "output": "根据我司政策,商品购买后7天内无理由退换货..." } ]至少需要几百条高质量数据,最好覆盖所有业务场景。
7.3 微调实战步骤
以Qwen2.5-7B为例,使用PEFT(参数高效微调)技术:
from transformers import AutoModelForCausalLM, AutoTokenizer from peft import LoraConfig, get_peft_model # 加载基础模型 model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B") tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B") # 配置LoRA(降低显存占用) lora_config = LoraConfig( r=8, # 秩 lora_alpha=32, target_modules=["q_proj", "v_proj"], # 注意力层 lora_dropout=0.1 ) model = get_peft_model(model, lora_config) # 训练配置 training_args = TrainingArguments( output_dir="./results", per_device_train_batch_size=4, # 根据显存调整 gradient_accumulation_steps=4, learning_rate=2e-5, num_train_epochs=3 )7.4 微调避坑指南
- 显存不够:用QLoRA进一步压缩,4GB显存就能微调7B模型。
- 过拟合:早停(early stopping)、验证集监控、数据增强。
- 效果不好:检查数据质量、增加数据量、调整学习率。
微调后一定要做评估:准备测试集,对比微调前后的回答质量。
8. 完整项目实战:搭建企业知识库问答系统
现在我们把所有技术串起来,搭建一个真实可用的系统。
8.1 系统架构设计
用户提问 → LangChain路由 → 简单问题: 直接Prompt回答 复杂问题: RAG检索 → 生成答案 多步骤问题: Agent调度工具 答案 → 格式检查 → 返回用户8.2 核心代码框架
from langchain import LangChain from langchain.agents import AgentExecutor from langchain.chains import RetrievalQA class EnterpriseQASystem: def __init__(self): # 初始化组件 self.simple_llm = load_model("local:7b") # 简单问题模型 self.rag_chain = self.setup_rag() # RAG链 self.agent = self.setup_agent() # Agent def setup_rag(self): # 加载已有向量库 vectorstore = FAISS.load_local("faiss_index", embeddings) return RetrievalQA.from_chain_type(llm=self.simple_llm, retriever=vectorstore.as_retriever()) def setup_agent(self): tools = [get_weather, search_internet, calculate] # 自定义工具 return initialize_agent(tools, self.simple_llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION) def route_question(self, question): # 简单路由逻辑 if len(question) < 10: # 短问题直接回答 return self.simple_llm.invoke(question) elif "步骤" in question or "先" in question: # 多步骤用Agent return self.agent.run(question) else: # 复杂问题用RAG return self.rag_chain.invoke(question) # 使用系统 qa_system = EnterpriseQASystem() answer = qa_system.route_question("公司年假政策是什么?")8.3 部署优化建议
- 本地部署:用Ollama、LM Studio管理本地模型,避免API费用。
- API混合:关键任务用付费API(稳定性高),内部测试用本地模型。
- 缓存机制:相同问题缓存答案,减少模型调用。
- 监控日志:记录问答历史,用于后续优化。
9. 学习路线与资源推荐
9.1 四阶段学习路径
阶段1:基础入门(1-2周)
- 跑通第一个Prompt工程示例
- 理解RAG基本概念和流程
- 学会使用LangChain基础组件
阶段2:项目实战(2-3周)
- 搭建个人知识库问答系统
- 实现多工具调用的Agent
- 掌握Prompt优化技巧
阶段3:进阶优化(2-3周)
- 模型微调实战
- 系统性能调优
- 复杂工作流设计
阶段4:生产部署(1-2周)
- Docker容器化部署
- API服务化
- 监控与维护
9.2 优质资源
- 官方文档:LangChain、Hugging Face文档最权威
- 实战项目:从RAG系统开始,逐步增加复杂度
- 社区资源:GitHub热门项目、技术博客、论文解读
9.3 常见误区避免
- 不要追求最新技术:先掌握稳定可用的基础方案
- 不要一上来就微调:Prompt能解决的先用Prompt
- 不要忽视数据质量:垃圾进,垃圾出
- 不要过度设计架构:从最小可行产品开始迭代
最实用的建议:先用一个周末把RAG系统跑通,再花一周加入Agent功能,一个月内你就能独立开发大多数AI应用了。关键是要动手写代码,而不是只看理论。