零基础入门大模型实战:从Prompt工程到RAG与LangChain应用开发

📅 2026/8/15 10:17:35
零基础入门大模型实战:从Prompt工程到RAG与LangChain应用开发
这次我们来看一套面向零基础学习者的完整大模型实战教程。这套内容不是某个单一工具或框架而是一个覆盖从基础概念到核心应用再到工程化落地的系统性学习路径。如果你正想入门大模型但被海量信息、复杂概念和不确定的学习路线困扰这篇文章可以直接收藏。本文的核心目标是帮你构建一个清晰、可执行的大模型知识体系。我们将围绕三个最核心的实战方向展开Prompt Engineering提示词工程、RAG检索增强生成和LangChain应用开发框架。这不是一个理论综述而是一个“从环境搭建到项目上线”的实操指南。你会看到具体的代码示例、环境配置、常见坑点以及如何将学到的技能应用到实际场景中比如搭建一个智能问答系统。无论你是开发者、产品经理还是对AI技术感兴趣的学习者只要具备基本的编程概念就能跟随本文的节奏。我们重点关注的是“怎么做”和“为什么这么做”而不是空泛的概念。接下来我们将从整体能力速览开始一步步拆解这个大模型学习地图。1. 核心能力速览大模型学习路径全景图这套教程不是一个软件而是一个结构化的知识体系。下表概括了其核心覆盖范围、技术栈和预期产出帮助你快速判断是否适合自己。能力项说明与目标核心学习模块Prompt Engineering、RAG检索增强生成、LangChain应用框架技术栈Python, OpenAI API / 开源大模型API, 向量数据库如Chroma, Milvus, LangChain/LangGraph, 常用开发工具硬件门槛极低。大部分练习可通过云服务API如DeepSeek、智谱AI完成无需本地GPU。高级RAG和微调实验需一定算力但入门阶段不强制。环境准备Python 3.8 pip包管理 代码编辑器VS Code等 网络可访问主流大模型API。启动方式无“一键启动”而是分模块的代码实践。每个模块从环境配置、代码编写到运行验证提供完整步骤。主要功能/产出1. 掌握编写高效Prompt的技巧。2. 能搭建本地知识库问答系统RAG。3. 能用LangChain构建具备记忆、工具调用能力的AI应用。4. 了解模型微调Fine-tuning的基本流程。是否支持API是核心依赖API。教程大量使用各类大模型API进行演示是学习的关键部分。是否支持“批量任务”是。在RAG和LangChain部分会涉及批量文档处理、批量问答测试等场景。适合场景AI应用开发者入门、产品经理理解技术边界、学生完成毕业设计、个人开发者构建智能工具。2. 适用场景与使用边界2.1 这套教程适合谁零基础开发者想进入AI领域但不知从何下手需要一条明确的、代码驱动的学习路径。有一定经验的工程师希望系统掌握Prompt、RAG和LangChain快速将大模型能力集成到现有产品中。产品经理与业务人员需要理解大模型能做什么、不能做什么以便更好地设计AI功能或评估技术方案。学生与研究者寻找一个结构化的实践项目作为学习或研究的起点。2.2 能解决什么问题概念落地难将“大模型”、“AGI”等宏大概念拆解为可编码、可测试的具体任务如写一个总结邮件的Prompt。技术选型迷茫在面对众多框架LangChain, LlamaIndex和工具时提供清晰的对比和选用建议。工程化瓶颈解决如何让大模型回答更准确RAG、如何让应用有记忆LangChain、如何管理成本与性能等实际问题。学习路径碎片化提供从A到Z的连贯学习体验避免在零散教程中迷失方向。2.3 不适合什么场景追求尖端模型原理研究本教程侧重应用层开发不深入讲解Transformer架构、模型训练等底层算法。需要立即部署高并发生产系统教程涵盖基础搭建但生产级的负载均衡、监控、安全加固需要更深入的工程经验。完全离线/内网环境教程演示严重依赖访问外部大模型API或下载开源模型纯离线环境需自行准备模型资源。2.4 合规与安全边界API使用使用任何第三方大模型API如OpenAI、DeepSeek时必须严格遵守其服务条款注意隐私数据不上传、不进行违法内容生成。知识版权构建RAG系统时确保使用的文档、数据拥有合法的使用权避免侵犯版权。内容安全对模型生成的内容进行审核和过滤防止产生有害、偏见或虚假信息特别是在构建对外服务时。3. 环境准备与前置条件在开始编码之前需要准备好以下基础环境。这是保证所有后续示例能顺利运行的前提。3.1 基础软件环境操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)。本文命令以macOS/Linux为例Windows用户建议使用WSL2或Git Bash。Python版本 3.8 至 3.11。推荐使用3.10兼容性最好。避免使用3.12等过新版本可能遇到库依赖问题。包管理工具pip(Python自带)。强烈建议使用虚拟环境venv或conda隔离项目依赖。代码编辑器Visual Studio Code (推荐) PyCharm 或任何你熟悉的编辑器。Git用于克隆示例代码和版本管理。3.2 关键账户与API密钥本教程的实践部分需要调用大模型服务你需要提前准备DeepSeek访问其官网注册获取API Key。它提供免费额度非常适合学习和测试。智谱AI (GLM)或百度千帆作为备选同样提供免费试用。(可选) OpenAI如果你有海外支付方式且需要体验GPT-4可以准备。但大部分功能用DeepSeek等国产API足以实现。重要API Key是敏感信息切勿上传至公开的Git仓库。我们将使用环境变量来管理。3.3 创建并激活虚拟环境这是避免包冲突的最佳实践。# 1. 创建项目目录并进入 mkdir llm-tutorial cd llm-tutorial # 2. 创建Python虚拟环境 python -m venv venv # 3. 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: # venv\Scripts\activate # 激活后命令行提示符前应显示 (venv)3.4 安装核心依赖库我们将分批安装依赖对应不同的学习模块。# 基础请求和数据处理 pip install requests python-dotenv # Jupyter Notebook (可选用于交互式学习) pip install notebook # LangChain 及其相关组件 (核心框架) pip install langchain langchain-community langchain-core # 用于连接DeepSeek等Chat模型 pip install langchain-openai # 向量数据库与文本嵌入 (RAG核心) pip install chromadb sentence-transformers # 文档加载器 (用于处理PDF、Word等) pip install pypdf unstructured # 可能用到的其他工具 pip install tiktoken # Token计数安装完成后可以通过pip list检查主要包是否安装成功。4. 模块一Prompt Engineering 实战入门Prompt Engineering是与大模型对话的核心技能。目标不是死记硬背模板而是掌握“结构化思考清晰表达”的方法。4.1 第一个Prompt与模型建立连接首先让我们用最简单的代码调用一次API验证环境是否通畅。设置API密钥在项目根目录创建.env文件写入你的密钥。# .env 文件内容 DEEPSEEK_API_KEYyour_deepseek_api_key_here BASE_URLhttps://api.deepseek.com切记将your_deepseek_api_key_here替换为你的真实密钥并将.env加入.gitignore文件。编写测试脚本创建test_prompt.py。import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI # 加载环境变量 load_dotenv() # 初始化DeepSeek模型 (LangChain将其视为OpenAI兼容接口) # 注意这里api_key和base_url从环境变量读取 llm ChatOpenAI( modeldeepseek-chat, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(BASE_URL), temperature0.1 # 控制随机性越低输出越确定 ) # 定义你的第一个Prompt prompt 请用一句话介绍人工智能。 # 调用模型并打印结果 try: response llm.invoke(prompt) print(模型回复, response.content) except Exception as e: print(f调用失败{e}) print(请检查1. API Key是否正确 2. 网络是否通畅 3. 余额是否充足)运行与验证python test_prompt.py预期成功控制台打印出一句关于人工智能的介绍。失败排查ModuleNotFoundError检查虚拟环境是否激活依赖是否安装。AuthenticationError检查.env文件中的DEEPSEEK_API_KEY是否正确。超时或网络错误检查网络连接或尝试更换API服务商。4.2 进阶Prompt技巧角色、上下文与结构化输出单一指令的Prompt能力有限。下面演示几个提升效果的核心技巧。技巧1系统提示词 (System Prompt) - 为模型设定角色系统提示词在对话开始前设定用于定义模型的角色和行为准则比用户提示词拥有更高的优先级。from langchain.prompts import ChatPromptTemplate from langchain_core.messages import SystemMessage, HumanMessage # 方法1使用Message列表 messages [ SystemMessage(content你是一位资深软件开发工程师擅长Python和系统架构设计。回答要专业、简洁并给出代码示例。), HumanMessage(content如何用Python高效地读取一个大型JSON文件) ] response llm.invoke(messages) print(response.content) # 方法2使用ChatPromptTemplate (更规范) prompt_template ChatPromptTemplate.from_messages([ (system, 你是一位幽默的科技历史学家。), (human, 请讲述一下互联网的早期发展史。) ]) formatted_prompt prompt_template.format_messages() response llm.invoke(formatted_prompt) print(response.content)技巧2少样本学习 (Few-Shot Learning) - 提供示例当任务复杂或格式要求严格时在Prompt中提供输入输出的例子能极大提升模型表现。# 任务将用户评论分类为“正面”、“负面”或“中性” few_shot_prompt 请根据以下示例将新的用户评论分类。 示例 评论”这款手机电池续航太差了半天就没电。“ - 分类负面 评论”物流速度很快包装完好给五星好评。“ - 分类正面 评论”产品收到了还没开始用。“ - 分类中性 现在请分类新的评论 评论”相机效果远超预期夜拍特别清晰就是价格有点贵。“ 分类 response llm.invoke(few_shot_prompt) print(分类结果, response.content.strip()) # 预期输出正面 (虽然提到价格贵但整体评价是正面的)技巧3要求结构化输出 (JSON, XML)让模型直接输出结构化的数据方便后续程序处理。这是构建自动化流程的关键。structured_prompt 请分析以下新闻标题并提取实体和情感倾向。 以JSON格式返回包含title(原标题), entities(实体列表), sentiment(情感取值为positive/negative/neutral)。 新闻标题“OpenAI发布新款大模型GPT-4o支持实时语音对话股价应声上涨。” # 为了更稳定地获得JSON可以在系统提示词中强调或使用LangChain的OutputParser response llm.invoke(structured_prompt) print(response.content) # 目标输出类似{title: ..., entities: [OpenAI, GPT-4o], sentiment: positive}4.3 常见Prompt问题与调优问题输出过于冗长或简短调优在Prompt中明确指定长度如“请用100字以内总结”、“分三点说明每点不超过一句话”。问题模型忽略部分指令调优将重要指令放在Prompt的开头或结尾使用分隔符如---、将指令与上下文分开。使用系统提示词强化角色。问题生成内容事实错误幻觉调优这是大模型固有问题。Prompt层面可以要求“基于已知事实”、“如果不确定请说明”但根本解决方案需要引入RAG下一模块。问题prompt is too long错误调优所有模型都有上下文长度限制。需要精简Prompt删除无关信息或使用“摘要”、“提取关键词”等方式压缩长文本输入。5. 模块二RAG检索增强生成系统搭建当模型需要回答关于特定、最新或私有知识的问题时Prompt Engineering就不够了。RAG通过“检索”相关文档片段并交给模型生成来提升回答的准确性和可靠性。5.1 RAG核心流程与本地环境搭建一个典型的RAG流程包括文档加载 - 文本分割 - 向量化嵌入 - 存储到向量数据库 - 提问时检索 - 组合Prompt生成答案。准备知识库文档在项目下创建knowledge_base文件夹放入你的文档如company_faq.pdf,tech_guide.txt。我们以一段文本为例。初始化向量数据库ChromaChroma轻量易用适合本地开发和测试。# rag_basic.py import os from dotenv import load_dotenv from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings # 本地嵌入模型无需API from langchain_community.vectorstores import Chroma from langchain_openai import ChatOpenAI load_dotenv() # 1. 加载文档 loader TextLoader(./knowledge_base/sample.txt, encodingutf-8) documents loader.load() print(f加载了 {len(documents)} 个文档) # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个片段约500字符 chunk_overlap50 # 片段间重叠50字符保持上下文 ) texts text_splitter.split_documents(documents) print(f分割为 {len(texts)} 个文本片段) # 3. 创建嵌入模型和向量库 # 使用开源的 sentence-transformers 模型完全本地运行 embedding_model HuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2) # 指定向量库持久化目录 vectorstore Chroma.from_documents( documentstexts, embeddingembedding_model, persist_directory./chroma_db # 数据将保存到此目录 ) vectorstore.persist() # 显式保存 print(向量数据库已创建并持久化到 ./chroma_db)首次运行会下载all-MiniLM-L6-v2嵌入模型约80MB请保持网络通畅。5.2 实现问答链检索 生成数据库建好后实现一个完整的问答流程。# rag_qa.py from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 加载已存在的向量数据库 embedding_model HuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2) vectorstore Chroma( persist_directory./chroma_db, embedding_functionembedding_model ) # 初始化大语言模型 (使用DeepSeek API) llm ChatOpenAI( modeldeepseek-chat, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(BASE_URL), temperature0.1 ) # 定义自定义Prompt模板指导模型如何利用检索到的上下文 custom_prompt_template 请根据以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题请直接说“根据已知信息无法回答此问题”不要编造答案。 上下文 {context} 问题{question} 请给出答案 PROMPT PromptTemplate( templatecustom_prompt_template, input_variables[context, question] ) # 创建检索式问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的方式将所有检索到的上下文塞入Prompt retrievervectorstore.as_retriever(search_kwargs{k: 3}), # 检索最相关的3个片段 chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回参考来源便于验证 ) # 进行提问 question 什么是LangChain的主要用途 # 假设你的知识库文档中提到了LangChain result qa_chain.invoke({query: question}) print(问题, question) print(答案, result[result]) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[片段{i1}]: {doc.page_content[:200]}...) # 打印前200字符运行与验证成功模型能基于你提供的文档片段生成答案并打印出参考来源。失败排查如果答案与文档无关检查检索到的source_documents是否相关。可能需要调整chunk_size或检索数量k。如果报错No such file or directory: ./chroma_db请先运行rag_basic.py创建向量库。5.3 高级RAG技巧与优化基础RAG可能遇到检索不准、上下文过长等问题以下是一些优化方向检索器优化相似度阈值设置一个最低相似度分数低于此分数的片段不返回避免无关信息干扰。retriever vectorstore.as_retriever( search_typesimilarity_score_threshold, search_kwargs{score_threshold: 0.5, k: 5} )混合搜索结合关键词搜索如BM25和向量搜索提升召回率。上下文处理优化重排序 (Re-ranking)先用向量检索出较多候选如10个再用一个更精细的模型对候选片段进行重排序只保留最相关的3-4个。这需要额外的重排序模型如bge-reranker。上下文压缩如果检索到的片段总长度超过模型限制可以使用ContextualCompressionRetriever对片段进行摘要或提取关键句。多轮对话RAG标准的RAG是单轮的。要实现多轮对话需要将历史对话也纳入检索考量。一种简单方法是将当前问题与最近几轮的历史拼接起来作为检索查询。6. 模块三LangChain智能应用开发LangChain是一个用于开发大模型应用的框架它通过“链”Chain将模型、提示词、记忆、工具等组件连接起来构建复杂的应用逻辑。6.1 构建一个具有记忆的对话机器人没有记忆的对话机器人每次都是全新的对话。使用LangChain可以轻松为机器人添加短期或长期记忆。# langchain_memory.py from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain from langchain_openai import ChatOpenAI llm ChatOpenAI( modeldeepseek-chat, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(BASE_URL), temperature0.7 # 对话可以稍活泼一些 ) # 初始化记忆体保存对话历史 memory ConversationBufferMemory(return_messagesTrue) # 创建对话链 conversation ConversationChain( llmllm, memorymemory, verboseTrue # 打印内部日志便于调试 ) print( 具有记忆的对话机器人 ) print(输入 exit 结束对话。\n) while True: user_input input(你: ) if user_input.lower() exit: print(对话结束。) break # 调用链自动处理历史记忆 response conversation.invoke({input: user_input}) print(f机器人: {response[response]}\n) # 可以查看当前记忆内容 # print(当前记忆:, memory.buffer)运行体验你可以连续问“我叫小明”、“我今年多大”、“我的名字是什么”。机器人能记住之前对话中你告诉它的名字但年龄信息因为没有提供它会承认不知道。verboseTrue会显示LangChain是如何将历史记录组合到Prompt里的。6.2 为机器人添加“工具”能力让大模型调用外部工具如计算器、搜索引擎、数据库是构建智能体的关键。这里演示一个简单的“计算器”工具。# langchain_tools.py from langchain.agents import initialize_agent, AgentType from langchain.agents import Tool from langchain_openai import ChatOpenAI # 1. 定义工具函数 def calculator(query: str) - str: 一个简单的计算器能处理加减乘除。输入如 3 5 或 10 / 2 try: # 安全警告实际生产中应对输入进行严格检查和沙箱化避免执行任意代码。 # 这里仅作演示使用eval有安全风险。 result eval(query) return f计算结果: {result} except Exception as e: return f计算错误: {e} # 2. 将函数包装成LangChain工具 tools [ Tool( nameCalculator, funccalculator, description用于执行数学计算。输入应是一个数学表达式如 3 5 或 (12 - 4) * 2。 ) ] # 3. 初始化模型和智能体 llm ChatOpenAI( modeldeepseek-chat, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(BASE_URL), temperature0 ) # 创建智能体它能够根据问题自动决定是否使用工具、使用哪个工具 agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 一种通用的智能体类型 verboseTrue, handle_parsing_errorsTrue # 优雅处理解析错误 ) # 4. 运行测试 questions [ 3的平方是多少, # 模型应使用计算器计算 3**2 今天北京的天气怎么样, # 没有天气工具模型应回答无法处理 请计算 (15 7) * 3 的值。 ] for q in questions: print(f\n问题: {q}) try: answer agent.invoke({input: q}) print(f回答: {answer[output]}) except Exception as e: print(f执行出错: {e})运行观察当模型遇到数学问题时verbose日志会显示Thought:过程表明它决定调用Calculator工具并生成最终答案。对于没有对应工具的问题它会礼貌地表示无法处理。6.3 使用LangChain Expression Language (LCEL) 构建自定义链LCEL提供了一种更声明式、更灵活的方式来组合链。它是构建复杂、可定制应用流的最佳实践。# langchain_lcel.py from langchain.prompts import ChatPromptTemplate from langchain.schema.output_parser import StrOutputParser from langchain_openai import ChatOpenAI # 1. 定义组件 prompt ChatPromptTemplate.from_messages([ (system, 你是一个专业的文案助手。请将用户输入的技术术语翻译成通俗易懂的比喻。), (human, {input}) ]) model ChatOpenAI(modeldeepseek-chat, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(BASE_URL)) output_parser StrOutputParser() # 2. 使用管道操作符 | 组合链 chain prompt | model | output_parser # 3. 调用链 input_text 神经网络中的反向传播算法 result chain.invoke({input: input_text}) print(f术语: {input_text}) print(f通俗解释: {result}) # 链可以轻松扩展例如添加一个日志步骤 from langchain.schema.runnable import RunnableLambda def log_step(input_dict): print(f[LOG] 接收到输入: {input_dict[input]}) return input_dict enhanced_chain RunnableLambda(log_step) | prompt | model | output_parser print(\n--- 带日志的链 ---) result2 enhanced_chain.invoke({input: 机器学习中的过拟合}) print(f解释: {result2})LCEL的优势在于链的每个环节都清晰可辨易于调试、测试和复用。你可以像搭积木一样组合出复杂的数据处理流程。7. 资源占用、性能观察与成本控制7.1 资源占用分析本地嵌入模型运行HuggingFaceEmbeddings时会加载all-MiniLM-L6-v2等模型到内存。该模型约80MB推理时CPU占用中等。对于大规模文档处理建议分批进行。向量数据库Chroma数据存储在本地./chroma_db目录内存占用与文档数量和向量维度相关。对于百万级以下的文本片段内存压力不大。大模型API调用这是主要的“资源”消耗形式表现为API调用成本和网络延迟。本地不消耗显存。7.2 性能优化建议文档处理批量化加载和分割大量文档时可使用多线程或异步IO提升速度。向量检索优化索引类型Chroma默认使用hnsw索引在速度和精度间取得平衡。对于超大库可考虑专业向量数据库如Milvus或Qdrant。检索参数search_kwargs{k: n}中的n不宜过大通常3-5即可满足需求过大增加Prompt长度和成本。API调用优化设置超时与重试网络不稳定时必备。from langchain.callbacks.manager import CallbackManager from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler llm ChatOpenAI(..., request_timeout60, max_retries2)流式输出对于长文本生成使用流式输出 (streamingTrue) 可以提升用户体验。缓存对相同或相似的查询结果进行缓存避免重复调用API。LangChain支持多种缓存后端如InMemoryCache,RedisCache。7.3 成本控制选择性价比API对于学习和测试优先使用DeepSeek、智谱GLM等提供免费额度的国内服务。监控Token使用使用tiktoken库或模型的get_num_tokens方法估算Prompt和Completion的Token数了解每次调用的成本。精简Prompt去除Prompt中不必要的描述和示例使用更精确的指令。异步调用当需要处理大量独立问题时使用异步接口 (agenerate) 可以显著减少总耗时但注意API的并发限制。8. 常见问题与排查方法在学习和实践过程中你可能会遇到以下问题。这里提供系统的排查思路。问题现象可能原因排查方式解决方案导入LangChain库失败(ModuleNotFoundError)1. 虚拟环境未激活。2. 依赖未安装或版本冲突。1. 检查命令行前缀是否有(venv)。2. 运行pip list | grep langchain。1. 激活虚拟环境。2. 使用pip install -r requirements.txt或重新安装指定版本。API调用失败(AuthenticationError,RateLimitError)1. API Key错误或过期。2. 网络不通。3. 达到速率或额度限制。1. 检查.env文件格式和变量名。2. 用curl或浏览器测试API端点。3. 查看服务商控制台用量。1. 重新生成并正确配置API Key。2. 检查代理或防火墙设置。3. 等待限制重置或升级套餐。向量数据库检索不到内容1. 文档未成功加载或分割。2. 检索查询与文档语义不匹配。3. 向量数据库路径错误。1. 打印texts变量检查内容。2. 尝试用文档中的原句进行检索。3. 检查persist_directory路径。1. 确保文档编码正确分割参数合理。2. 尝试调整嵌入模型或使用混合检索。3. 确认使用的是同一个持久化目录。模型回答与文档无关幻觉1. 检索到的上下文不相关。2. Prompt未强制模型基于上下文回答。3. 上下文太长被截断。1. 检查source_documents内容。2. 审查Prompt模板是否包含“基于上下文”的指令。3. 计算Prompt总Token数。1. 优化检索器调整k值、相似度阈值。2. 强化Prompt中的指令使用更严格的模板。3. 减少检索片段数量k或压缩上下文。处理长文档时程序崩溃或极慢1. 内存不足。2. 同步处理大量数据阻塞主线程。1. 监控任务管理器内存占用。2. 检查代码中是否有大型循环或未分批次。1. 对文档进行分批处理 (batch_size)。2. 对于CPU密集的嵌入计算考虑使用多进程。prompt is too long错误输入的Prompt问题上下文超过了模型的最大上下文长度。计算输入文本的Token数。1. 减少检索的上下文片段数量 (k)。2. 对检索到的上下文进行摘要或提取关键句。3. 使用支持更长上下文的模型。LangChain Agent频繁出错或逻辑混乱1. 工具描述不清晰。2. 模型温度 (temperature) 设置过高。3. 智能体类型 (agent) 选择不当。1. 查看verboseTrue的Thought日志。2. 测试不同的temperature(如设为0)。1. 为工具编写精确、示例化的description。2. 对于确定性任务降低temperature。3. 尝试AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION等更结构化的智能体。9. 最佳实践与项目进阶建议掌握了基础模块后你可以通过以下方式深化技能并构建更实用的项目。9.1 项目结构规范化一个良好的项目结构有助于协作和维护。llm-project/ ├── .env # 环境变量列入.gitignore ├── requirements.txt # 项目依赖 ├── app.py # 主应用入口如FastAPI服务 ├── core/ # 核心逻辑 │ ├── prompts.py # 存放所有Prompt模板 │ ├── chains.py # 自定义的LangChain链 │ └── retriever.py # 向量检索相关配置 ├── knowledge_base/ # 原始知识库文档 ├── data/ # 处理后的数据、向量数据库 │ └── chroma_db/ ├── routers/ # Web路由如果做Web服务 │ └── chat.py ├── utils/ # 工具函数 │ └── file_loader.py └── tests/ # 单元测试 └── test_rag.py9.2 构建一个Web服务FastAPI将你的RAG或对话机器人封装成API供前端或其他服务调用。# app.py (简化示例) from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List # ... 导入之前定义好的 qa_chain 或 conversation ... app FastAPI(title智能知识库问答API) class QuestionRequest(BaseModel): question: str chat_history: List[str] [] # 可选支持多轮 class AnswerResponse(BaseModel): answer: str sources: List[str] # 引用的来源 app.post(/ask, response_modelAnswerResponse) async def ask_question(req: QuestionRequest): try: result qa_chain.invoke({query: req.question}) return AnswerResponse( answerresult[result], sources[doc.page_content[:500] for doc in result[source_documents]] ) except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)运行python app.py即可通过http://localhost:8000/docs访问交互式API文档并进行测试。9.3 探索更高级的主题Agentic RAG让智能体主动决定何时检索、如何检索甚至进行多步推理后再回答。LangGraph用于构建有状态、多环节的复杂智能体工作流比简单的Chain更强大。模型微调Fine-tuning使用LLaMA-Factory等工具用自己的数据微调开源小模型如Qwen、ChatGLM打造专属模型。多模态RAG除了文本还可以对图片、音频、视频进行检索和问答。这套从Prompt到RAG再到LangChain的路径为你构建AI应用提供了坚实的脚手架。真正的精通来自于将这些模块组合起来去解决一个真实世界的问题比如为你的团队搭建一个内部技术文档问答系统或者创建一个能自动处理邮件的智能助手。