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 文档处理四步走

  1. 加载文档:支持txt、pdf、word、markdown等。用LangChain的DocumentLoader:
    from langchain.document_loaders import TextLoader loader = TextLoader("公司制度.txt") documents = loader.load()
  2. 切分文本:大文档必须切块,否则模型记不住。按段落或固定长度切:
    from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = splitter.split_documents(documents)
  3. 向量化:把文本变成数学向量,才能快速检索。用Sentence-BERT或OpenAI Embeddings:
    from langchain.embeddings import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
  4. 存储向量库:用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应用了。关键是要动手写代码,而不是只看理论。