ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

大语言模型工程化实战:从RAG到智能体开发的完整指南

大语言模型工程化实战:从RAG到智能体开发的完整指南 你好我是CSDN的一名技术博主。最近在跟进大语言模型LLM相关的项目时发现很多开发者对如何系统性地进行LLM工程化开发感到困惑。网上资料要么过于理论要么是零散的代码片段缺乏从环境搭建、核心概念到智能体Agent开发的完整闭环教程。本文将为你拆解LLM工程的核心实践涵盖从基础概念到智能体开发的关键路径并提供可直接运行的代码示例和避坑指南。无论你是想入门AI应用开发还是希望将LLM集成到现有系统中都能从本文中找到清晰的指引。1. 大语言模型工程核心概念与价值在深入代码之前我们有必要厘清几个核心概念理解LLM工程化究竟要解决什么问题。1.1 什么是大语言模型LLM大语言模型是一种基于深度学习的自然语言处理模型它通过在海量文本数据上进行训练学会了预测下一个词的概率。这使它能够生成连贯的文本、回答问题、翻译语言、编写代码等。你可以把它理解为一个对“语言”拥有超强统计理解和生成能力的“大脑”。当前主流的LLM分为两类闭源模型如 OpenAI 的 GPT 系列、Anthropic 的 Claude、Google 的 Gemini。它们通常通过 API 提供服务易用性强但成本、数据隐私和定制灵活性是主要考量。开源模型如 Meta 的 Llama 系列、Mistral AI 的 Mistral/Mixtral、国内的 Qwen、Baichuan 等。它们可以本地或私有化部署提供了更高的数据安全性和模型微调的可能性。LLM工程的核心任务就是如何高效、可靠、低成本地将这些“大脑”的能力应用到实际业务场景中。1.2 从 AI 到智能体Agent能力的演进单纯的LLM调用Completion只是起点真正的价值在于构建智能体。AI/LLM基础能力提供核心的理解与生成能力。输入一段提示词Prompt得到一个文本输出。LLM 应用开发通过提示工程、检索增强生成RAG、微调等技术让LLM更可靠地完成特定任务比如客服问答、报告生成。智能体Agent开发这是LLM工程的进阶形态。一个智能体不仅仅是响应提示它具备感知-思考-行动的循环能力。感知接收用户指令或环境信息。思考利用LLM进行推理决定下一步该做什么调用哪个工具、查询什么数据。行动执行决定例如运行一段代码、查询数据库、调用一个API。然后根据行动结果再次“思考”直到完成任务目标。例如一个“数据分析智能体”可以接收用户说“帮我分析上个月的销售数据”它自主决定先调用工具查询数据库然后利用LLM总结趋势最后生成图表。这个过程完全由智能体自主规划完成。1.3 LLM Engineering 涵盖的关键领域LLM工程是一个系统工程主要包含以下层面模型选择与接入根据场景、预算和隐私要求选择闭源API或开源模型并解决如何调用的问题。提示工程与模板化设计高效、稳定的提示词并将其模板化、模块化管理。检索增强生成RAG为LLM连接外部知识库如向量数据库解决其知识陈旧和幻觉问题是构建企业知识库应用的核心技术。模型微调使用领域数据对开源模型进行额外训练使其更擅长特定任务。智能体框架使用如 LangChain、LangGraph、LlamaIndex、Semantic Kernel 等框架来构建具备规划和工具使用能力的智能体。评估与监控如何评估LLM输出质量、监控API成本、延迟和异常。部署与运维涉及模型服务化如使用vLLM、TGI、流量管理、扩缩容等。本文将聚焦于前半部分模型接入、提示工程、RAG以及智能体开发的基础为你打下坚实的实践基础。2. 环境准备与工具链搭建工欲善其事必先利其器。我们将搭建一个兼顾开源和闭源模型开发的Python环境。2.1 基础环境配置推荐使用 Python 3.10 或 3.11它们拥有最好的兼容性。使用虚拟环境管理依赖是必须的最佳实践。# 1. 创建并激活虚拟环境 (以 conda 为例) conda create -n llm-engineering python3.11 conda activate llm-engineering # 2. 安装核心依赖 pip install -U pip pip install openai langchain langchain-community langgraph # 安装向量数据库客户端以Chroma为例和嵌入模型 pip install chromadb sentence-transformers # 安装用于本地运行开源模型的库 pip install transformers torch2.2 关键工具与框架简介LangChain当前最流行的LLM应用开发框架提供了连接LLM、工具、数据源的标准化组件和链Chain。LangGraph基于LangChain用于构建有状态、多步骤的智能体工作流特别适合描述循环和分支逻辑。OpenAI SDK调用GPT系列模型的官方库。Chroma轻量级、内存式的向量数据库非常适合原型开发和学习。Sentence-Transformers用于生成文本向量嵌入的库是RAG的关键。2.3 API密钥管理对于闭源模型如果你使用OpenAI等闭源API需要安全地管理密钥。绝对不要将密钥硬编码在代码中。# 在Linux/macOS的终端中 export OPENAI_API_KEYyour-api-key-here # 或者在代码中通过环境变量读取推荐创建一个.env文件来管理需安装python-dotenv# .env 文件内容 OPENAI_API_KEYsk-...然后在Python中加载# 文件config.py from dotenv import load_dotenv import os load_dotenv() # 加载 .env 文件中的环境变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY)3. 核心基石模型调用与提示工程一切LLM应用的起点都是调用模型并与之对话。我们先从最基础的开始。3.1 调用闭源模型OpenAI API使用LangChain可以标准化地调用各种模型。# 文件basic_openai.py from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from dotenv import load_dotenv load_dotenv() # 1. 初始化聊天模型 llm ChatOpenAI( modelgpt-3.5-turbo, # 或 gpt-4 temperature0.7, # 控制创造性0-1越高越随机 api_keyos.getenv(OPENAI_API_KEY) ) # 2. 构建消息列表OpenAI ChatCompletion 格式 messages [ SystemMessage(content你是一个专业的Python编程助手。), HumanMessage(content请用Python写一个函数计算斐波那契数列的第n项。) ] # 3. 调用并获取结果 response llm.invoke(messages) print(AI回复, response.content) # 输出示例 # AI回复当然这是一个计算斐波那契数列第n项的Python函数...关键参数解释temperature影响输出的随机性。对于需要确定答案的任务如代码生成、数据提取建议较低0.1-0.3对于创意写作可以调高0.7-0.9。max_tokens限制生成回复的最大长度。streaming设置为True可以流式接收输出提升用户体验。3.2 调用开源模型本地运行对于本地部署我们可以使用transformers库。这里以轻量级的Qwen2.5-Coder-1.5B模型为例。# 文件basic_local_llm.py from transformers import AutoTokenizer, AutoModelForCausalLM import torch # 1. 指定模型名称从Hugging Face Hub加载 model_name Qwen/Qwen2.5-Coder-1.5B-Instruct # 2. 加载分词器和模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度减少内存 device_mapauto # 自动分配到GPU/CPU ) # 3. 构建提示词 prompt 写一个Python函数来反转字符串。 messages [{role: user, content: prompt}] text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) # 4. 编码并生成 inputs tokenizer(text, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate(**inputs, max_new_tokens256) # 5. 解码输出 generated_text tokenizer.decode(outputs[0], skip_special_tokensTrue) print(generated_text)注意本地运行模型对硬件尤其是GPU显存有要求。小参数模型如1.5B、7B可以在消费级显卡上运行更大模型需要专业卡或使用量化技术。3.3 提示工程基础与模板化直接拼接字符串构建提示词难以维护。LangChain提供了PromptTemplate。# 文件prompt_template.py from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.messages import HumanMessage, AIMessage # 1. 定义一个包含变量和系统指令的提示模板 template ChatPromptTemplate.from_messages([ (system, 你是一位{role}。请用{style}的风格来回答。), MessagesPlaceholder(variable_namehistory), # 预留历史消息的位置 (user, {input}) ]) # 2. 格式化模板 formatted_prompt template.invoke({ role: 资深软件架构师, style: 简洁而专业, history: [ HumanMessage(content什么是微服务), AIMessage(content微服务是一种将应用程序构建为一套小服务的架构风格...) ], input: 那么它与单体架构相比有什么主要优势 }) print(formatted_prompt.to_string()) # 输出 # System: 你是一位资深软件架构师。请用简洁而专业的风格来回答。 # Human: 什么是微服务 # AI: 微服务是一种将应用程序构建为一套小服务的架构风格... # Human: 那么它与单体架构相比有什么主要优势 # 3. 将这个格式化后的提示词发送给LLM # llm.invoke(formatted_prompt)为什么需要模板化可维护性将提示词逻辑与业务代码分离。可复用性同一套模板可用于不同场景只需替换变量。版本控制可以像管理代码一样管理提示词的迭代。4. 实战构建一个检索增强生成RAG系统RAG是让LLM获取最新、特定领域知识的关键技术。其核心流程是提问 → 检索相关文档 → 将文档作为上下文注入提示词 → LLM生成答案。4.1 系统架构与数据准备假设我们要构建一个公司内部技术文档的问答助手。加载文档从文本文件、PDF、网页等加载原始数据。分割文本将长文档切成语义相关的小块chunks。嵌入向量使用嵌入模型将每个文本块转换为数值向量。存储向量将向量和对应的原文存储到向量数据库。检索与生成用户提问时将问题也转为向量从数据库中找出最相似的文本块连同问题一起发给LLM生成答案。4.2 完整代码实现# 文件rag_system.py import os from dotenv import load_dotenv from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_chroma import Chroma from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough load_dotenv() # --- 第1步加载并分割文档 --- loader TextLoader(./company_handbook.txt, encodingutf-8) # 假设有文档 documents loader.load() text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块约500字符 chunk_overlap50, # 块之间重叠50字符保持上下文 separators[\n\n, \n, 。, , , , ] # 分割符优先级 ) chunks text_splitter.split_documents(documents) print(f原始文档被分割成 {len(chunks)} 个文本块。) # --- 第2步创建向量存储 --- # 使用开源嵌入模型也可以使用 OpenAIEmbeddings embedding_model HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh-v1.5, # 中文小模型效果不错 model_kwargs{device: cpu}, # 无GPU可用‘cpu’ encode_kwargs{normalize_embeddings: True} ) # 将文本块向量化并存入ChromaDB vectorstore Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directory./chroma_db # 持久化到本地目录 ) print(向量数据库创建完成。) # --- 第3步构建检索链 --- # 将向量数据库转换为检索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个块 # 定义提示词模板 template 请根据以下上下文来回答问题。如果你不知道答案就说你不知道不要编造。 上下文 {context} 问题{question} 请给出有帮助的答案 prompt ChatPromptTemplate.from_template(template) # 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 构建RAG处理链 rag_chain ( {context: retriever, question: RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # --- 第4步提问并获取答案 --- question 公司的年假政策是怎样的 answer rag_chain.invoke(question) print(f\n问题{question}) print(f答案{answer})4.3 运行与验证创建一个company_handbook.txt文件里面写入一些公司制度文本。运行python rag_system.py。程序会加载文档、分割、创建向量库然后等待你提问代码中写死了问题。观察输出LLM生成的答案应基于你提供的文档内容。关键点解析文本分割chunk_size和chunk_overlap需要根据文档类型调整。太小会丢失上下文太大会降低检索精度并增加LLM处理负担。嵌入模型选择与文档语言匹配的模型。bge-small-zh是优秀的中文小模型。检索器search_kwargs{k: 3}表示每次检索返回3个最相关的文档块。k值影响答案质量和成本。提示词设计明确指令LLM“根据上下文回答”并告知它“不知道就说不知道”这是缓解LLM“幻觉”的有效手段。5. 迈向智能体使用 LangGraph 构建基础 Agent智能体的核心是“工具调用”和“循环”。我们构建一个能进行简单数学计算和网络搜索的智能体。5.1 定义工具Tools工具是智能体与外界交互的手和脚。# 文件simple_agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import tool from langchain_core.messages import HumanMessage import math load_dotenv() # 定义第一个工具计算平方根 tool def sqrt(number: float) - float: 计算一个数的平方根。 if number 0: return 错误输入不能为负数。 return math.sqrt(number) # 定义第二个工具模拟网络搜索实际项目中可替换为真实SerpAPI等 tool def search_web(query: str) - str: 执行一个网页搜索。这是一个模拟工具返回固定结果。 # 模拟搜索结果 simulated_results { 北京天气: 北京今天晴气温15-25摄氏度。, Python最新版本: 截至2023年10月Python最新稳定版本是3.12。, LangChain是什么: LangChain是一个用于开发由大语言模型驱动的应用程序的框架。 } return simulated_results.get(query, f未找到关于 {query} 的模拟信息。) # 将工具放入列表 tools [sqrt, search_web]5.2 创建智能体执行器我们将使用 LangChain 的create_react_agent它实现了 ReAct 推理框架Reason Act。# 接上段代码 from langchain import hub from langchain.agents import create_react_agent, AgentExecutor # 1. 初始化LLM并绑定工具描述LLM需要知道它有哪些工具可用 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) llm_with_tools llm.bind_tools(tools) # 2. 从LangChain Hub拉取一个预设的ReAct提示词也可以自定义 prompt hub.pull(hwchase17/react) # 3. 创建ReAct智能体 agent create_react_agent(llm_with_tools, tools, prompt) # 4. 创建智能体执行器它负责运行循环思考-选择工具-执行-再思考... agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 5. 运行智能体 question 首先计算121的平方根是多少然后搜索一下‘LangChain是什么’ result agent_executor.invoke({input: question}) print(\n最终答案, result[output])5.3 运行与过程分析设置verboseTrue后运行上述代码你会看到类似以下的详细输出 进入新的AgentExecutor链... 思考用户问了两个问题。第一个是计算121的平方根我可以使用sqrt工具。第二个是搜索‘LangChain是什么’我可以使用search_web工具。 行动使用 sqrt 工具。 行动输入{number: 121} 观察11.0 思考第一个问题的答案是11。现在回答第二个问题。 行动使用 search_web 工具。 行动输入{query: LangChain是什么} 观察LangChain是一个用于开发由大语言模型驱动的应用程序的框架。 思考我现在有了两个问题的答案可以总结回复了。 最终答案121的平方根是11。根据搜索LangChain是一个用于开发由大语言模型驱动的应用程序的框架。这就是智能体的工作流LLM思考决定调用sqrt工具行动得到结果11观察然后继续思考决定调用search_web工具最后综合所有观察结果给出最终答案。6. 常见问题与排查思路在LLM工程实践中你会遇到各种“坑”。下表汇总了常见问题及解决方法。问题现象可能原因排查思路与解决方案调用API时超时或网络错误网络不稳定API服务异常请求超时设置过短。1. 检查网络连接。2. 查看OpenAI状态页面。3. 在客户端增加超时参数ChatOpenAI(..., request_timeout30)。本地模型加载失败或显存不足模型文件损坏显存不足transformers版本不兼容。1. 使用torch.cuda.empty_cache()清理缓存。2. 尝试加载量化模型如bitsandbytes库。3. 使用CPU模式device_mapcpu速度慢。4. 确认模型名称在Hugging Face Hub上存在。RAG系统返回无关答案或“幻觉”检索到的文档块不相关chunk_size设置不当提示词指令不明确。1. 检查检索器返回的context看是否与问题相关。2. 调整文本分割策略大小、重叠。3. 优化提示词加入“严格基于上下文”的强指令。4. 尝试不同的嵌入模型或调整检索的相似度阈值。智能体陷入循环或执行错误工具工具描述不清LLM推理能力不足未正确解析工具输出。1. 为工具编写清晰、具体的文档字符串docstring。2. 使用能力更强的模型如GPT-4。3. 在AgentExecutor中设置max_iterations限制最大循环次数防止死循环。4. 启用handle_parsing_errorsTrue处理解析异常。提示词效果不稳定提示词过于模糊未提供足够示例temperature参数过高。1. 采用更结构化的提示词模板如CRISPE框架。2. 加入少样本示例Few-Shot。3. 对于确定性任务将temperature调低至0-0.3。向量数据库检索速度慢数据量过大未建立索引硬件性能瓶颈。1. 对于生产环境考虑使用性能更强的向量数据库如Pinecone, Weaviate, Qdrant。2. 确保为向量列创建了索引。3. 对文本进行预处理过滤掉无用信息减少向量数量。7. 最佳实践与工程化建议将LLM从实验原型推进到生产系统需要遵循工程化原则。7.1 提示词管理版本化与测试像管理代码一样管理提示词使用Git。为不同的任务创建独立的提示词文件如prompt_sql_generation.yaml。建立提示词的评估体系用测试用例确保其稳定性。变量隔离永远不要将敏感信息如API密钥、数据库密码硬编码在提示词中。通过环境变量或配置系统注入。结构化输出要求LLM以JSON、XML等固定格式输出便于后续代码解析。LangChain的PydanticOutputParser是很好的工具。7.2 应用架构异步处理LLM API调用和向量检索通常是I/O密集型操作使用异步asyncio可以大幅提升吞吐量。缓存层对频繁且结果不变的LLM查询或向量检索结果进行缓存如使用Redis能显著降低成本和提高响应速度。限流与降级对API调用实施限流防止意外费用激增。设计降级策略例如当主要模型API失败时自动切换到备用模型或返回缓存的通用答案。7.3 可观测性与评估全面日志记录记录每一次LLM调用的输入、输出、token使用量、延迟和成本。这对于调试和成本分析至关重要。构建评估管道生产级应用需要持续评估效果。可以结合人工评估对关键用例进行抽样检查。自动评估使用LLM本身如GPT-4作为裁判评估答案的相关性、准确性或使用传统的NLP指标如BLEU, ROUGE。监控关键指标关注平均响应时间、错误率、token消耗成本以及业务层面的满意度指标。7.4 安全与合规输入输出过滤对用户输入和模型输出进行内容安全过滤防止生成不当或有害内容。数据隐私如果使用闭源API务必了解其数据使用政策。对敏感数据进行脱敏处理或优先考虑使用可本地部署的开源模型。权限控制在智能体调用工具时如数据库查询、发送邮件实施严格的权限检查遵循最小权限原则。本文详细介绍了LLM工程化的前半部分核心内容从基础概念、环境搭建、模型调用、提示工程到实战构建RAG系统和初级智能体。你掌握了如何让LLM接入外部知识以及如何赋予其使用工具的能力。这些是构建更复杂AI应用如自动数据分析助手、智能客服、代码生成工具的基石。在下一部分我们将深入探讨更复杂的多智能体协作、工作流编排LangGraph、高级RAG优化技巧以及生产环境部署方案。建议你亲手运行文中的每一段代码理解其背后的机制这是从理解到掌握的唯一路径。如果在实践中遇到问题欢迎在评论区交流讨论。
返回列表