资讯动态

基于LangChain与本地大模型构建智能体:从环境搭建到工具调用的实战指南

发布时间:2026/8/22 10:21:44 来源:尧图企业网站定制
在实际的大模型开发项目中很多开发者会遇到一个典型困境教程资料要么过于理论只讲概念要么过于零散只给片段代码。当你真正想从零开始构建一个能理解、能调用、能集成业务逻辑的AI应用时会发现从环境搭建、模型选择、提示词设计到应用框架集成每一步都有大量细节需要串联。本文旨在解决这个问题提供一个从零到一、可运行、可调试的大模型应用开发实战指南。无论你是希望将大模型能力集成到现有系统的后端工程师还是想探索AI应用的前端开发者都能通过本文理解核心流程并亲手搭建一个具备对话、工具调用和记忆能力的智能体原型。本文不会停留在概念介绍而是会带你完成一个具体的开发任务使用 LangChain 框架集成一个开源大模型构建一个能进行多轮对话、能查询实时信息如天气的智能体。我们将覆盖从 Python 环境准备、模型服务部署、LangChain 核心概念理解、提示词工程实践到最终代码实现和问题排查的完整闭环。学完后你将掌握大模型应用开发的基础骨架并能在此基础上扩展更复杂的功能。1. 理解大模型应用开发的核心组件与工作流在开始写代码之前必须理清几个核心概念以及它们是如何协作的。大模型应用开发不仅仅是调用一个API它涉及模型、框架、工程化等多个层面。1.1 大模型本身能力提供者大模型Large Language Model, LLM是核心引擎它接收文本输入提示词经过内部计算生成文本输出。根据部署方式主要分为两类云端API模型如 OpenAI GPT、百度文心、阿里通义等。开发者通过HTTP API调用无需关心硬件和部署但会产生费用且数据需传输至厂商服务器。本地部署模型如 Llama、Qwen、ChatGLM 等开源模型。使用 Ollama、vLLM 等工具在本地或私有服务器上部署。完全掌控数据和网络但对硬件GPU内存有要求且性能取决于模型大小和优化程度。对于学习和初期开发使用本地轻量级模型如 Llama 3.1 8B或云服务的免费额度是成本最低的方式。本文后续将采用Ollama 部署本地模型的方案以确保流程的完整性和可控性。1.2 LangChain应用开发框架直接与大模型API对话是简单的但构建复杂应用需要处理大量胶水代码管理对话历史、连接外部工具、解析模型输出等。LangChain 是一个开源框架它通过提供一系列“链”Chains、“代理”Agents和“记忆”Memory等高级抽象将这些通用模式模块化。链Chain将大模型调用与其他步骤如API调用、数据查询顺序组合的工作流。例如“检索-问答链”先搜索文档再将结果送给大模型生成答案。代理Agent让大模型自主决定调用哪些工具如计算器、搜索引擎、数据库来完成用户请求的组件。这是构建“智能体”的关键。记忆Memory用于在多次交互中保持对话上下文如ConversationBufferMemory。提示词模板PromptTemplate将用户输入、上下文、指令等变量动态填充到预设的提示词中避免硬编码。使用 LangChain开发者可以更专注于业务逻辑而非底层通信和状态管理。1.3 提示词工程与模型沟通的艺术模型的能力再强也需要清晰的指令才能发挥。提示词工程就是设计这些指令的实践。一个结构良好的提示词通常包含角色Role定义模型的角色如“你是一个专业的Python助手”。任务Task清晰、具体地描述你要模型做什么。上下文Context提供完成任务所需的相关信息。输出格式Format明确指定输出的格式如JSON、列表、代码块等。示例Few-shot提供一两个输入输出示例让模型更好地理解任务。在 LangChain 中我们通过PromptTemplate来管理这些模板。1.4 智能体Agent与工具Tools扩展模型能力大模型的知识可能过时且无法直接操作外部系统如查询数据库、发送邮件。智能体模式解决了这个问题。其核心思想是将大模型作为一个“大脑”它可以根据用户问题决定是否需要调用以及调用哪个“工具”一个执行特定功能的函数然后将工具执行结果整合进上下文最终生成给用户的回答。一个典型的工作流是用户问“北京今天天气怎么样” - 模型识别出需要调用“天气查询工具” - LangChain 代理执行该工具函数调用天气API - 将API返回的天气数据给模型 - 模型组织成自然语言回答用户。2. 环境准备与核心工具安装我们将搭建一个独立的 Python 虚拟环境并安装运行本地大模型和 LangChain 所需的所有工具。2.1 基础环境Python 与包管理确保你的系统已安装 Python推荐 3.9 或 3.10。使用conda或venv创建虚拟环境是最佳实践可以避免包版本冲突。# 使用 conda如果已安装 Miniconda/Anaconda conda create -n llm-dev python3.10 conda activate llm-dev # 或者使用 venv python -m venv llm-dev-env # Windows 激活 llm-dev-env\Scripts\activate # Linux/Mac 激活 source llm-dev-env/bin/activate激活虚拟环境后命令行提示符前通常会显示环境名(llm-dev)。2.2 安装 LangChain 及相关库LangChain 是一个元框架我们需要安装核心库以及对应大模型集成的子包。由于我们使用本地 Ollama 服务需要安装langchain-community包含社区集成的模型和langchain-core等基础包。pip install langchain langchain-community langchain-core同时安装一些常用的工具库和开发辅助库pip install requests python-dotenv jupyter ipykernelrequests: 用于后续自定义工具中调用外部 HTTP API。python-dotenv: 管理环境变量如果未来使用云端API密钥。jupyter: 可选用于在 Notebook 中交互式开发调试。2.3 部署本地大模型OllamaOllama 是一个强大的工具可以一键在本地下载和运行开源大模型。它提供了类似 Docker 的简单命令并内置了模型优化。安装 Ollama访问 Ollama 官网根据你的操作系统Windows, macOS, Linux下载并安装。或者在 Linux/macOS 上使用命令行安装curl -fsSL https://ollama.com/install.sh | sh拉取并运行模型 Ollama 安装完成后在终端拉取一个适合你硬件条件的模型。对于入门和8GB以上GPU内存的机器llama3.2或qwen2.5:7b是不错的选择。# 拉取模型首次运行会自动下载 ollama pull llama3.2 # 运行模型服务默认监听 11434 端口 ollama run llama3.2运行ollama run会进入一个交互式聊天界面这证明模型已成功加载。为了后续 LangChain 调用我们需要让模型在后台作为服务运行。# 停止刚才的交互式会话CtrlC然后以后台服务模式启动 # Ollama 服务默认在安装后已作为后台服务运行。可以通过以下命令检查状态 # Linux/macOS systemctl status ollama # 或直接调用API测试 curl http://localhost:11434/api/generate -d {model: llama3.2, prompt:Hello}如果看到返回一串 JSON 数据其中包含response字段说明 Ollama 服务运行正常。2.4 验证环境连通性创建一个简单的 Python 脚本test_env.py测试 LangChain 能否成功调用 Ollama 服务。# test_env.py from langchain_community.llms import Ollama # 初始化 Ollama 模型对象指定模型名称和服务的地址 llm Ollama(modelllama3.2, base_urlhttp://localhost:11434) # 发起一次简单调用 response llm.invoke(请用中文自我介绍。) print(模型回复, response)运行此脚本python test_env.py如果看到模型返回了一段中文的自我介绍恭喜你核心环境已全部就绪。如果遇到连接错误请检查Ollama 服务是否正在运行 (ollama serve或检查服务状态)。base_url中的端口号 (11434) 是否正确。防火墙是否阻止了本地回环地址127.0.0.1的通信。3. 构建第一个 LangChain 智能体对话与工具调用现在我们将利用准备好的环境构建一个具备记忆和工具调用能力的智能体。这个智能体将能进行多轮对话并在用户询问天气时调用一个模拟的天气查询工具。3.1 项目结构与初始化创建一个新的项目目录例如llm_agent_demo并初始化文件。llm_agent_demo/ ├── tools/ # 存放自定义工具 │ └── weather_tool.py ├── agents/ # 存放智能体定义 │ └── weather_agent.py ├── .env # 环境变量文件可选 └── main.py # 主程序入口3.2 创建自定义工具模拟天气查询在tools/weather_tool.py中我们定义一个简单的天气查询工具。在生产环境中这里应该调用真实的天气 API如和风天气、OpenWeatherMap。# tools/weather_tool.py from langchain.tools import tool import requests from typing import Optional tool def get_weather(city: str) - str: 根据城市名称查询该城市的当前天气情况。 这是一个模拟工具实际应接入真实天气API。 Args: city: 城市名称例如“北京”、“Shanghai”。 Returns: 返回该城市的模拟天气信息字符串。 # 模拟一些静态数据。真实场景下这里应发起HTTP请求。 weather_data { 北京: 北京晴气温 25°C东南风2级。, 上海: 上海多云气温 28°C湿度 65%。, 广州: 广州阵雨气温 30°C南风3级。, 纽约: 纽约阴气温 18°C西风4级。, 伦敦: 伦敦小雨气温 15°C东北风1级。 } # 简单查找未找到则返回默认信息 return weather_data.get(city, f未找到{city}的天气信息目前仅支持查询北京、上海、广州、纽约、伦敦。) # 注意我们使用了 tool 装饰器这会将普通Python函数转换为LangChain能识别的Tool对象。3.3 构建智能体整合模型、工具与记忆在agents/weather_agent.py中我们将模型、工具和记忆组装起来创建一个AgentExecutor。# agents/weather_agent.py from langchain_community.llms import Ollama from langchain.agents import AgentExecutor, create_react_agent from langchain.agents import Tool from langchain.memory import ConversationBufferMemory from langchain import hub # 用于拉取预定义的提示词 # 1. 导入我们自定义的工具 from tools.weather_tool import get_weather def create_weather_agent(): 创建并返回一个配置了天气工具和对话记忆的智能体执行器。 # 2. 初始化大模型连接本地Ollama llm Ollama(modelllama3.2, base_urlhttp://localhost:11434, temperature0.1) # temperature 控制随机性0.1 较低输出更确定。 # 3. 定义工具列表 tools [ Tool( nameWeatherQuery, funcget_weather, description当用户询问某个城市的天气时使用此工具。输入应为一个城市名称。 ), # 未来可以在此添加更多工具如 Calculator, Search 等 ] # 4. 初始化对话记忆 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 5. 拉取一个适合 ReAct 代理的预定义提示词模板 # ReAct (Reason Act) 是一种让模型思考并决定行动的经典模式。 prompt hub.pull(hwchase17/react-chat) # 6. 创建智能体 agent create_react_agent(llm, tools, prompt) # 7. 创建智能体执行器它将处理与用户的交互循环 agent_executor AgentExecutor( agentagent, toolstools, memorymemory, verboseTrue, # 设为 True 可以看到代理的思考过程调试时非常有用 handle_parsing_errorsTrue, # 优雅处理模型输出解析错误 max_iterations5, # 限制最大迭代次数防止死循环 ) return agent_executor if __name__ __main__: # 本地测试 agent create_weather_agent() print(智能体已启动输入 quit 退出。) while True: user_input input(\n你: ) if user_input.lower() quit: break try: response agent.invoke({input: user_input, chat_history: []}) print(f助手: {response[output]}) except Exception as e: print(f执行出错: {e})3.4 运行与测试智能体现在运行agents/weather_agent.py来测试我们的智能体。cd llm_agent_demo python agents/weather_agent.py程序启动后会提示你输入。由于设置了verboseTrue你会在控制台看到类似以下的详细思考过程这是理解智能体如何工作的关键 进入新的 AgentExecutor 链... 思考用户问的是北京的天气我需要使用 WeatherQuery 工具。 行动WeatherQuery 行动输入北京 观察北京晴气温 25°C东南风2级。 思考我已经通过工具获得了北京的天气信息现在可以回答用户了。 最终答案北京今天的天气是晴天气温大约25摄氏度东南风2级。 链结束。 助手北京今天的天气是晴天气温大约25摄氏度东南风2级。你可以尝试以下对话序列测试其多轮对话记忆和工具调用能力“你好” - 模型应礼貌回应。“北京天气怎么样” - 应调用工具并返回模拟天气。“那上海呢” - 模型应能理解“上海”指代天气并再次调用工具。“我们刚才聊了哪几个城市” - 模型应能根据记忆chat_history回答。4. 核心代码与配置详解4.1 Ollama 模型初始化参数在Ollama类初始化时有几个关键参数影响模型行为llm Ollama( modelllama3.2, # 必须与 ollama pull 的模型名一致 base_urlhttp://localhost:11434, # Ollama 服务地址 temperature0.1, # 创造性/随机性 (0-1)值越高输出越多样 top_p0.9, # 核采样参数影响词的选择范围 num_predict512, # 生成的最大token数 timeout30, # 请求超时时间秒 )temperature这是最重要的参数之一。在需要确定性答案如代码生成、数据提取时设为较低值0.1-0.3在需要创造性如写作、头脑风暴时设为较高值0.7-0.9。num_predict控制生成文本的长度。需根据模型上下文窗口和任务需求调整。4.2 工具Tool的定义与使用LangChain 中的Tool对象是连接模型与外部功能的关键。定义工具时需注意清晰的description模型的“大脑”根据工具描述来决定是否以及何时调用它。描述应准确说明工具的功能和输入格式。准确的输入参数工具函数的参数应简单明了。如果工具需要复杂输入可以考虑让模型先输出一个结构化的中间结果如 JSON再由你的代码解析后调用工具。错误处理工具函数内部应有try...except块并返回明确的错误信息以便模型能理解并告知用户。4.3 记忆Memory的管理ConversationBufferMemory简单地将所有对话历史存储在内存中。对于长对话这可能导致提示词过长超出模型上下文限制。生产环境中需要考虑ConversationSummaryMemory定期总结历史对话只保留摘要和最近几条记录。ConversationBufferWindowMemory只保留最近 K 轮对话。向量存储记忆将历史对话存入向量数据库根据当前问题检索相关历史片段。这是构建知识库问答系统的核心。4.4 代理Agent类型与提示词我们使用了create_react_agent和hwchase17/react-chat提示词。LangChain 支持多种代理类型适用于不同场景代理类型核心思想适用场景特点ReAct让模型输出“思考Thought”、“行动Action”、“观察Observation”的循环。需要复杂推理和工具调用的任务。逻辑清晰易于调试但提示词较长。OpenAI Functions模型直接输出符合特定 JSON Schema 的函数调用请求。与 OpenAI 模型配合最佳工具调用格式规范。高效但需要模型原生支持函数调用。Self-ask with search模型通过提出并回答子问题来分解复杂问题。需要多步信息检索的问答。适合搜索引擎结合的场景。选择提示词 (hub.pull(...)) 是代理工作的关键。你可以从 LangChain Hub 探索更多预定义提示词或根据项目需求自定义。5. 运行验证与结果分析成功运行智能体后我们需要系统地验证其功能是否符合预期而不仅仅是看它能否响应。5.1 功能验证清单创建一个简单的测试脚本test_agent.py或直接在交互式循环中验证以下场景# test_agent.py from agents.weather_agent import create_weather_agent agent create_weather_agent() test_cases [ (你好你是谁, 检查基础对话能力), (北京今天天气如何, 检查工具调用能力已知城市), (火星的天气呢, 检查工具调用能力未知城市及处理方式), (我们刚才聊了天气吗, 检查对话记忆能力), (请写一首关于春天的诗。, 检查模型的创造性生成能力不应触发工具), ] for query, description in test_cases: print(f\n 测试{description} ) print(f用户: {query}) try: response agent.invoke({input: query}) print(f助手: {response[output][:200]}...) # 截断长输出 except Exception as e: print(f错误: {e})运行此脚本观察输出。理想情况下自我介绍问题不应触发工具调用。北京天气问题应触发WeatherQuery工具并返回模拟数据。火星天气问题工具应返回“未找到”信息模型应能据此给出合理回复如“我无法查询火星天气”。记忆问题应能正确引用之前的对话。写诗请求不应触发工具应直接由模型生成诗歌。5.2 性能与稳定性观察在verboseTrue模式下观察以下指标响应时间从输入到输出完整结果的时间。本地模型首次调用可能较慢加载后续应稳定。Token 消耗观察模型输出的长度。过长的输出可能意味着模型在“胡言乱语”需要调整max_tokens或temperature。工具调用准确性模型是否在正确的时候调用了正确的工具输入参数格式是否正确迭代次数复杂问题是否会导致代理在max_iterations内无法完成可能需要优化提示词或工具描述。6. 常见问题排查与调试在开发过程中你几乎一定会遇到以下问题。这里提供排查路径。6.1 模型服务连接失败现象运行脚本时报连接错误 (ConnectionError,TimeoutError)。检查1服务状态运行ollama list查看模型是否存在运行ollama serve确保服务进程在运行。检查2端口与地址确认代码中base_url的端口与 Ollama 服务端口一致默认11434。如果服务运行在 Docker 或远程机器需对应修改地址。检查3网络策略本地防火墙或安全组是否阻止了localhost:11434的访问可以尝试curl http://localhost:11434/api/tags测试 API 连通性。6.2 模型输出乱码或无意义现象模型回复是乱码、重复词语或完全偏离主题。检查1提示词模板确认使用的提示词模板 (hub.pull) 是否与模型和任务匹配。不匹配的模板会导致模型行为异常。可以尝试更简单的模板如hub.pull(“hwchase17/react”)。检查2模型能力确认你拉的模型是否支持中文或你的任务领域。例如某些小参数模型可能指令遵循能力较弱。尝试更换模型如qwen2.5:7b。检查3温度参数temperature值是否过高尝试将其设为0.1以获得更确定的输出。检查4上下文长度对话历史是否太长超过了模型的上下文窗口这会导致模型“遗忘”早期的指令。考虑使用ConversationSummaryMemory或清空历史。6.3 代理不调用工具或错误调用现象用户问“北京天气”模型却自己编造了一个答案而没有调用工具。检查1工具描述工具的description是否清晰、准确地描述了功能和输入例如“查询天气”可能不够具体“根据城市名称查询该城市的当前天气情况。输入应为一个城市名称。”则更好。检查2代理类型与提示词确保代理类型如 ReAct和提示词支持工具调用。hwchase17/react-chat是支持工具调用的。检查3verbose模式开启verboseTrue查看模型的“思考”过程。它可能因为认为信息已足够从历史中而不调用工具或者不理解如何调用。检查4输入格式模型输出的“行动输入”是否与工具函数定义的参数匹配例如工具需要city: str模型是否输出了“北京”而不是{“city”: “北京”}ReAct 代理通常能处理好这一点。6.4 依赖版本冲突现象导入 LangChain 模块时出现ImportError或AttributeError。原因LangChain 生态更新较快langchain,langchain-community,langchain-core等包版本不兼容。解决查看错误信息确认是哪个模块缺失或属性错误。使用pip list | grep langchain查看已安装版本。尝试安装兼容版本组合。一个相对稳定的组合是以当前时间为例未来可能变化pip install langchain0.1.0 langchain-community0.0.10 langchain-core0.1.0始终参考官方文档或 GitHub 仓库的requirements.txt获取推荐版本。7. 从原型到生产最佳实践与扩展方向将上述原型发展为可生产部署的应用还需要考虑以下方面。7.1 配置管理外部化永远不要将 API 密钥、模型路径、服务器地址等硬编码在代码中。使用环境变量或配置文件。创建.env文件确保已添加到.gitignoreOLLAMA_BASE_URLhttp://localhost:11434 OLLAMA_MODELllama3.2 # 如果未来用OpenAI # OPENAI_API_KEYsk-...在代码中读取配置# config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的变量 OLLAMA_BASE_URL os.getenv(OLLAMA_BASE_URL, http://localhost:11434) OLLAMA_MODEL os.getenv(OLLAMA_MODEL, llama3.2)初始化模型时使用配置from config import OLLAMA_BASE_URL, OLLAMA_MODEL llm Ollama(modelOLLAMA_MODEL, base_urlOLLAMA_BASE_URL)7.2 增强工具能力一个真正的智能体需要连接更多真实系统。网络搜索工具集成SerpAPI或DuckDuckGoSearch让模型获取实时信息。数据库工具创建工具函数执行 SQL 查询或调用 ORM让模型操作业务数据。代码执行工具在沙箱中安全地执行 Python 代码需极其谨慎避免任意代码执行漏洞。自定义 API 工具封装内部系统的 RESTful API让模型成为业务流程的协调者。添加新工具后务必更新工具描述并测试代理是否能正确选择和使用它们。7.3 引入检索增强生成RAG当模型需要基于特定领域知识如公司文档、产品手册回答问题时需要 RAG 技术。将文档切块、向量化存入向量数据库如 Chroma, Pinecone, Weaviate。当用户提问时先从向量库中检索相关文档片段。将这些片段作为上下文连同问题一起发送给模型生成答案。LangChain 提供了完整的RetrievalQA链来简化这一过程。这是当前构建企业级知识库问答系统的标准方案。7.4 部署与监控Web 服务化使用 FastAPI 或 Flask 将你的智能体封装成 HTTP API供前端或其他服务调用。异步处理对于耗时的模型调用使用asyncio或消息队列如 Celery避免阻塞 Web 请求。日志记录详细记录用户的输入、模型的输出、调用的工具及结果。这对于调试和优化至关重要。性能监控监控 API 的响应时间、Token 消耗、错误率等指标。成本控制如果使用按 Token 计费的云模型必须对输入输出长度进行监控和限制。7.5 安全与合规输入过滤与清理对用户输入进行严格的检查和过滤防止提示词注入攻击Prompt Injection即用户输入恶意指令操纵模型行为。输出审查对模型的输出进行内容安全审查过滤不当、偏见或有害内容。数据隐私如果处理用户敏感数据确保本地化部署或使用符合合规要求的云服务并在传输和存储时加密。工具调用权限为不同的工具设置权限级别确保模型不能调用危险或高权限的操作如删除数据库、发送邮件。大模型应用开发是一个快速迭代的工程领域。本文提供的流程和代码是一个坚实的起点。接下来你可以尝试更换更强的模型如qwen2.5:14b、集成真实的第三方 API、构建带界面的 Web 应用或者深入探索 LangChain 更高级的功能如LangGraph用于构建有状态的复杂工作流。记住持续实验、仔细观察日志、并根据实际反馈迭代你的提示词和工具设计是构建成功 AI 应用的关键。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价