从零搭建企业级智能体(Agent):LangChain + 大模型落地实战指南

前言:为什么需要智能体?

2026年的今天,大语言模型早已不是新鲜事物。但你是否遇到过这样的困境:调用GPT-4 API写文案效果不错,可一旦让它“帮我查一下明天的天气,如果下雨就提醒我带伞”,它就束手无策了?

原因很简单——基础大模型是一个“有知识但没有手脚”的专家。它能理解你的意图,却无法主动调用外部工具、获取实时数据、执行多步骤任务。

这正是**AI智能体(Agent)**登场的理由。

智能体 ≠ 聊天机器人。它具备自主决策、任务规划、工具调用和记忆能力,能将一个复杂目标拆解为可执行步骤,并调用外部工具完成每一步。

本文将从零开始,带你完成一个实用的企业级智能体开发全流程,包含完整可运行的代码。文章篇幅约3000字,预计阅读时间15分钟。


一、核心概念:智能体到底是什么?

1.1 大模型 vs 智能体

维度 基础大模型 AI智能体
交互方式 被动响应输入 主动规划执行
知识边界 训练数据截止日期 可扩展外部知识源
任务复杂度 适合单轮简单问答 处理多步骤复杂任务
系统架构 单一模型实例 模型+记忆+工具+规划的复合系统

1.2 智能体的核心能力

一个完整的智能体系统包含四大模块:

  1. 大脑(LLM):负责理解语言、推理和决策
  2. 记忆系统:短期记忆(对话上下文)+ 长期记忆(向量数据库)
  3. 规划能力:将大任务分解为可执行的小步骤(ReAct模式)
  4. 工具调用:调用外部API、数据库、搜索引擎等

ReAct模式是当前最主流的智能体架构,全称是“Reason + Act”(推理+行动)。智能体会循环执行:思考→行动→观察→再思考,直到完成任务。


二、实战:从零搭建智能体

2.1 项目场景

我们构建一个智能助理,它能:

  • 查询任意城市的实时天气
  • 根据天气给出穿衣建议
  • 记录用户偏好(长期记忆)
  • 支持多轮对话

2.2 环境准备

# 创建虚拟环境(推荐)
python -m venv agent_env
source agent_env/bin/activate  # Linux/Mac
# 或 agent_env\Scripts\activate  # Windows

# 安装依赖
pip install langchain langchain-community langchain-core
pip install openai python-dotenv
pip install requests  # 用于调用天气API
pip install chromadb  # 向量数据库,用于长期记忆

2.3 完整代码实现

以下是完整的智能体代码,建议逐行阅读理解:

import os
import json
import requests
from dotenv import load_dotenv

from langchain.agents import initialize_agent, Tool, AgentType
from langchain.memory import ConversationBufferMemory
from langchain_community.llms import OpenAI
from langchain.tools import BaseTool
from pydantic import BaseModel, Field

# ---------- 1. 加载环境变量 ----------
load_dotenv()  # 需要在.env文件中设置 OPENAI_API_KEY
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# ---------- 2. 定义工具(智能体的"手脚")----------

# 2.1 天气查询工具
class WeatherInput(BaseModel):
    city: str = Field(description="城市名称,如'北京'")

class WeatherTool(BaseTool):
    name = "weather_query"
    description = "查询指定城市的实时天气。输入城市名称,返回温度和天气状况。"
    args_schema = WeatherInput

    def _run(self, city: str) -> str:
        """实际开发中替换为真实的天气API"""
        try:
            # 模拟API调用(真实场景可替换为 OpenWeatherMap 等)
            # 这里用模拟数据演示
            weather_data = {
                "北京": {"temp": 28, "condition": "晴"},
                "上海": {"temp": 32, "condition": "多云"},
                "广州": {"temp": 35, "condition": "雷阵雨"},
                "深圳": {"temp": 33, "condition": "晴"},
            }
            data = weather_data.get(city, {"temp": 22, "condition": "未知"})
            return json.dumps({
                "city": city,
                "temperature": data["temp"],
                "condition": data["condition"],
                "unit": "摄氏度"
            })
        except Exception as e:
            return f"查询天气失败:{str(e)}"

    async def _arun(self, city: str) -> str:
        """异步版本"""
        return self._run(city)

# 2.2 穿衣建议工具(基于天气数据推理)
class ClothingInput(BaseModel):
    temperature: int = Field(description="温度数值(摄氏度)")
    condition: str = Field(description="天气状况,如'晴'、'雨'")

class ClothingAdviceTool(BaseTool):
    name = "clothing_advice"
    description = "根据温度和天气状况给出穿衣建议。输入温度和天气状况,返回建议文本。"
    args_schema = ClothingInput

    def _run(self, temperature: int, condition: str) -> str:
        advice = []
        if temperature > 30:
            advice.append("建议穿短袖、短裤,注意防晒")
        elif temperature > 20:
            advice.append("建议穿薄T恤或衬衫,早晚可加薄外套")
        elif temperature > 10:
            advice.append("建议穿长袖+薄外套,注意保暖")
        else:
            advice.append("建议穿厚外套、毛衣,注意防寒")

        if "雨" in condition:
            advice.append("出门记得带伞")
        elif "晴" in condition:
            advice.append("紫外线较强,建议涂防晒霜")

        return ";".join(advice)

    async def _arun(self, temperature: int, condition: str) -> str:
        return self._run(temperature, condition)

# ---------- 3. 组装智能体 ----------

# 3.1 初始化大模型(大脑)
llm = OpenAI(
    temperature=0.3,  # 0=确定性,1=创造性
    openai_api_key=OPENAI_API_KEY,
    model_name="gpt-3.5-turbo"  # 可替换为其他模型
)

# 3.2 创建记忆模块
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# 3.3 注册所有工具
tools = [
    Tool(
        name=WeatherTool().name,
        func=WeatherTool()._run,
        description=WeatherTool().description
    ),
    Tool(
        name=ClothingAdviceTool().name,
        func=ClothingAdviceTool()._run,
        description=ClothingAdviceTool().description
    )
]

# 3.4 初始化智能体
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # ReAct模式
    memory=memory,
    verbose=True,  # 打印推理过程,便于调试
    handle_parsing_errors=True,
    max_iterations=5  # 防止死循环
)

# ---------- 4. 运行与测试 ----------

if __name__ == "__main__":
    print("=" * 50)
    print("智能助理已启动!输入 'exit' 退出")
    print("示例问题:'北京今天天气怎么样?适合穿什么?'")
    print("=" * 50)

    while True:
        user_input = input("\n你: ")
        if user_input.lower() in ['exit', 'quit', '退出']:
            print("再见!")
            break

        try:
            response = agent.run(user_input)
            print(f"\n智能助理: {response}")
        except Exception as e:
            print(f"\n错误: {e}")

三、代码详解:每一行都在做什么?

3.1 工具定义(最重要!)

工具是智能体的“手脚”,每一个工具都需要:

  • name:唯一标识,模型通过名称选择工具
  • description:模型理解工具用途的关键,要清晰描述
  • args_schema:使用Pydantic定义输入参数,帮助模型正确传参
class WeatherInput(BaseModel):
    city: str = Field(description="城市名称,如'北京'")

最佳实践:工具描述越清晰,模型调用越准确。描述应包括“何时使用”、“输入格式”、“返回什么”。

3.2 ReAct工作流程

设置verbose=True后,你可以看到智能体的推理过程:

> Entering new AgentExecutor chain...
思考: 用户询问北京天气,我需要先调用weather_query工具
行动: weather_query
行动输入: "北京"
观察: {"city":"北京","temperature":28,"condition":"晴"}
思考: 已获取天气信息,现在需要给出穿衣建议
行动: clothing_advice
行动输入: {"temperature": 28, "condition": "晴"}
观察: 建议穿薄T恤或衬衫;紫外线较强,建议涂防晒霜
思考: 我已获得完整信息,可以回答用户了
最终答案: 北京今天晴,气温28摄氏度...

这就是ReAct的核心:思考→行动→观察→再思考的循环。

3.3 记忆模块

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

记忆让智能体“记住”之前的对话。例如:

  • 用户:“我叫小明”
  • 智能体:“记住了,小明”
  • 用户:“我叫什么名字?”
  • 智能体:“你叫小明” ✅(如果没有记忆,它会答不上来)

四、进阶:企业级部署要点

4.1 长期记忆(向量数据库)

上面的代码只能记住当前会话。如果要跨会话记忆,需要用向量数据库(如ChromaDB、Milvus):

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 存储用户偏好
embeddings = OpenAIEmbeddings()
vector_store = Chroma(
    collection_name="user_memory",
    embedding_function=embeddings,
    persist_directory="./chroma_db"
)

4.2 生产环境注意事项

关注点 建议
安全性 工具调用需做权限校验,防止SSRF攻击
稳定性 设置max_iterations防止死循环,添加try-except
可观测性 记录所有工具调用日志,便于审计和调试
成本控制 限制每次对话的LLM调用次数,使用缓存

4.3 多智能体协作

对于复杂场景(如同时处理订单查询、物流追踪、退款申请),可考虑多智能体架构:主Agent负责任务分发,子Agent各司其职。


五、常见问题与解决方案

问题 原因 解决方案
Agent循环调用同一工具 工具描述不清晰 优化description,增加终止条件
工具参数错误 模型传参格式不对 使用Pydantic严格定义args_schema
响应过慢 LLM推理+多次工具调用 启用异步工具调用,减少工具数量
超出上下文长度 对话太长 使用BufferWindowMemory只保留最近N轮

六、总结与展望

本文从零构建了一个完整的智能体系统,覆盖了:

  • ✅ 核心概念(大模型 vs 智能体,ReAct模式)
  • ✅ 完整可运行代码(天气查询+穿衣建议)
  • ✅ 生产级部署要点(记忆、安全、监控)

智能体的未来:从单智能体走向多智能体协作,从数字世界走向具身智能(控制机器人、望远镜等物理设备)。正如国家天文台部署的JW-ASTClaw系统,大模型驱动的智能体已开始接管科学级望远镜的自主控制。

现在,打开你的编辑器,从第一个工具开始尝试吧!如果遇到问题,欢迎在评论区交流讨论。🚀


参考代码仓库结构

agent_project/
├── .env                 # API密钥
├── agent.py             # 主程序
├── tools/
│   ├── weather.py       # 天气工具
│   └── clothing.py      # 穿衣建议工具
└── memory/
    └── vector_store.py  # 向量数据库配置
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐