🔥 LangChain 实战:构建全能工具调用 Agent

🔥 LangChain 实战:构建全能工具调用 Agent

📋 文章信息

  • 分类: 后端开发 / AI 工程
  • 标签: Python、LangChain、Agent、LLM、RAG
  • 难度: 中级

🔍 引言

在 AI Agent 时代,如何让大语言模型拥有"十八般武艺"?本文将带你从零开始构建一个具备文档检索、网络搜索、数学计算、天气查询、邮件发送、数据库操作等多种能力的全能工具调用 Agent。

🎯 项目亮点

能力 实现方式 技术亮点
📚 文档检索 Chroma + Ollama Embeddings 本地部署,隐私安全
🔍 网络搜索 TavilySearch 实时信息获取
🧮 数学计算 安全 eval 沙箱 防代码注入
🌤️ 天气查询 Open-Meteo API 免费开源
📧 邮件发送 SMTP 自动邮件通知
📊 数据库查询 SQLite + Pandas 结构化数据处理
✏️ 文件写入 本地文件操作 结果持久化

🏗️ 整体架构

flowchart TD User((用户)) subgraph Agent_Layer [Agent 核心层] Agent[Agent LangGraph<br/>create_agent] Checkpointer[InMemorySaver<br/>会话记忆] LLM[ChatDeepSeek<br/>DeepSeek-V4-Pro] end subgraph Tools [工具层] Calculator[calculator<br/>数学计算] KnowledgeBase[knowledge_base_tool<br/>文档检索] Search[TavilySearch<br/>网络搜索] Weather[weather<br/>天气查询] SendEmail[send_email<br/>发送邮件] DatabaseQuery[database_query<br/>查询销售表] FileWriter[file_writer<br/>写文件] end subgraph RAG [知识库] Docs[(./docs/*.txt<br/>本地文档)] Chroma[(Chroma 向量库<br/>persist_directory)] Embeddings[OllamaEmbeddings<br/>nomic-embed-text] end subgraph DataSources [数据源与外部服务] SQLiteDB[(sales.db<br/>SQLite)] TavilyAPI[Tavily Search API] WeatherAPI[Open-Meteo API] SMTP[QQ邮箱 SMTP] end %% 用户与Agent交互 User --> Agent Agent --> Checkpointer Agent --> LLM LLM --> Agent %% Agent调用工具 Agent_Layer --> Tools %% 知识库工具的构建依赖 Chroma --> |创建 retriever| KnowledgeBase Embeddings --> |生成向量| Chroma Docs --> |加载并分割| Embeddings %% 各工具的外部依赖 Search --> TavilyAPI Weather --> WeatherAPI SendEmail --> SMTP DatabaseQuery --> SQLiteDB %% 样式 classDef tool fill:#e1f5fe,stroke:#01579b,stroke-width:2px; classDef datasource fill:#fff9c4,stroke:#fbc02d,stroke-width:2px; classDef agent fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px; class Calculator,Search,KnowledgeBase,Weather,SendEmail,DatabaseQuery,FileWriter tool; class Docs,Chroma,Embeddings,SQLiteDB,TavilyAPI,WeatherAPI,SMTP datasource; class Agent,Checkpointer,LLM agent;

🚀 核心功能实现

1. 文档检索系统(RAG)

python 复制代码
# 加载文档
loader = DirectoryLoader("./docs", glob="**/*.txt", loader_cls=TextLoader)
documents = loader.load()

# 文本分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", "!", "?", ","]
)
docs = text_splitter.split_documents(documents)

# 构建向量数据库
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(
    documents=docs,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 创建检索工具
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
knowledge_base_tool = create_retriever_tool(
    retriever,
    name="knowledge_base",
    description="查询公司内部文档,如考勤、请假、福利等。"
)

技术要点

  • 使用 Ollama 本地嵌入模型,无需 API 调用
  • 中文文本分割策略优化
  • 向量数据库持久化,避免重复构建

2. 工具定义与注册

python 复制代码
@tool
def calculator(expression: str) -> str:
    """执行数学计算。输入是一个数学表达式,例如 "2+3*4" """
    try:
        result = eval(expression, {"__builtins__": {}}, math.__dict__)
        return str(result)
    except Exception as e:
        return f"计算错误: {e}"

@tool
def weather(city: str) -> str:
    """查询城市天气"""
    geo_url = f"https://geocoding-api.open-meteo.com/v1/search?name={city}&count=1"
    geo = requests.get(geo_url).json()
    if not geo.get("results"):
        return "城市未找到"
    lat, lon = geo["results"][0]["latitude"], geo["results"][0]["longitude"]
    w = requests.get(f"https://api.open-meteo.com/v1/forecast?latitude={lat}&longitude={lon}&current_weather=true").json()
    cur = w["current_weather"]
    return f"{city}温度{cur['temperature']}°C, 风速{cur['windspeed']}km/h"

......省略部分代码

tools = [calculator, search, knowledge_base_tool, weather, send_email, file_writer, database_query]

设计亮点

  • @tool 装饰器自动生成工具描述
  • 函数签名和 docstring 即为 LLM 的工具调用指南
  • 统一的错误处理机制

3. 多模型支持与配置

python 复制代码
# 使用 DeepSeek API
llm = ChatDeepSeek(
    model="deepseek-v4-pro",
    temperature=0,
    thinking={"type": "enabled"},
    reasoning_effort="high",
)

# 或使用 Ollama 本地模型
# llm = ChatOpenAI(
#     model='llama3.2:1b',
#     base_url="http://localhost:11434/v1",
#     temperature=0,
# )

4. Agent 创建与记忆系统

python 复制代码
memory = InMemorySaver()

agent = create_agent(
    model=llm,
    tools=tools,
    checkpointer=memory,
    system_prompt="你是一个能用工具的得力助手。回答问题时请先思考,如需获取实时信息或进行计算,务必调用工具。"
)

📦 依赖与环境配置

安装依赖

bash 复制代码
pip install langchain langchain-core langchain-community langchain-deepseek langchain-ollama langchain-openai langchain-tavily langgraph pandas python-dotenv

环境变量配置(.env)

tex 复制代码
EMAIL=your_email@qq.com
MAIL_PASSWORD=your_qq_email_token

💡 使用示例

示例 1:多步骤任务

python 复制代码
agent.invoke(
    {"messages": [{"role": "user", "content": "搜索最新的GPT-4o评测文章,读一遍总结成三句话,再翻译成法语存为文件"}]},
    config
)

执行流程

  1. 调用 search 工具搜索 GPT-4o 评测
  2. 总结文章内容
  3. 翻译为法语
  4. 调用 file_writer 工具保存文件

示例 2:内部知识查询

python 复制代码
agent.invoke(
    {"messages": [{"role": "user", "content": "公司规定多少天年假,和国家法定标准比哪个多?"}]},
    config
)

执行流程

  1. 调用 knowledge_base 工具查询员工手册
  2. 对比国家法定标准
  3. 给出结论并引用来源

🔧 核心技术解析

1. RAG 检索流程

flowchart LR A[文档加载<br/>Document Loaders] --> B[文本分割<br/>Text Splitters] B --> C[嵌入生成<br/>Embedding Models] C --> D[向量存储<br/>Vector Store] D --> E[相似度检索<br/>Similarity Search] E --> F[上下文注入<br/>Context Injection]

2. 工具调用机制

LangChain 的 @tool 装饰器会自动将函数转换为 LLM 可理解的格式:

python 复制代码
{
    "name": "calculator",
    "description": "执行数学计算。输入是一个数学表达式,例如 \"2+3*4\"",
    "parameters": {
        "type": "object",
        "properties": {
            "expression": {"type": "string"}
        },
        "required": ["expression"]
    }
}

3. 记忆系统原理

LangGraph 的 InMemorySaver 实现了对话状态的持久化:

  • 存储每个对话线程的完整历史
  • 支持多线程并发
  • 可扩展为持久化存储(如 Redis)

🚀 技术洞察

1. 安全计算的实现

python 复制代码
result = eval(expression, {"__builtins__": {}}, math.__dict__)

安全措施

  • 清空 __builtins__ 防止危险函数调用
  • 仅允许数学运算相关函数
  • 异常捕获确保程序稳定

2. 文档分割策略

中文文本分割需要考虑:

  • 语义完整性
  • 上下文重叠(chunk_overlap)
  • 中文标点符号处理

3. 多模型切换策略

模型类型 优点 缺点
API 模型 性能强、更新快 成本高、有调用限制
本地模型 隐私安全、无成本 性能有限、需要硬件

📊 性能优化建议

优化方向 具体措施
向量数据库优化 使用 FAISS 替代 Chroma,提升检索速度
缓存机制 缓存搜索结果,避免重复查询
异步调用 并行执行多个工具调用
提示词优化 精简系统提示词,减少 token 消耗
文档预处理 提前构建向量数据库,避免运行时开销

🎯 总结与展望

本文要点

  1. ✅ 使用 LangChain 构建工具调用 Agent
  2. ✅ 实现文档检索(RAG)系统
  3. ✅ 注册多种实用工具(计算、搜索、天气、邮件等)
  4. ✅ 配置记忆系统支持多轮对话
  5. ✅ 支持多模型切换

未来方向

  • 🔄 工具市场:支持动态加载第三方工具
  • 🧠 反思机制:让 Agent 能够评估自己的决策
  • 📊 性能监控:追踪工具调用效率
  • 🔒 权限控制:细粒度的工具访问控制
  • 📱 API 服务化:封装为 RESTful API

📮 互动交流

如果你有任何问题或想法,欢迎在评论区留言!如果觉得本文对你有帮助,请点赞、收藏、关注三连支持一下~

相关推荐
Rubin932 分钟前
AI 工作编排全流程文档:从 PRD 到代码交付
ai编程
浩风祭月2 分钟前
前端错误监控方案对比:Sentry SaaS vs 自部署 vs 纯开源组合
前端·openai·ai编程
专注搞钱7 分钟前
AI编程实战:我用Python+LangChain搭建了一个半导体FAB智能运维Agent
python·langchain·ai编程
三木檾9 分钟前
从 5 个文件读完一个生产级 AI Chatbot——Vercel AI Chatbot 源码拆解
ai编程·源码阅读·next.js
财经资讯数据_灵砚智能15 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月30日
人工智能·python·信息可视化·自然语言处理·ai编程·灵砚智能
wangruofeng29 分钟前
15 周从零到 AI 高手:2026 年唯一需要的学习路线图
aigc·ai编程
wangruofeng30 分钟前
写 AI 应用前,先把这 10 个概念讲明白
aigc·ai编程
码农阿强1 小时前
Qwen3.7-Plus 多模态智能体技术详解:原生 API 与 startapi.top 聚合平台接入实战
ai·ai作画·aigc·ai编程·ai写作
中年程序员一枚2 小时前
Cursor安装及使用技巧
ai编程
Bigger2 小时前
mini-cc 终端 UI:用 React 写 CLI 是什么体验
前端·react.js·ai编程