1. 从问答到决策:LangChain如何重塑大模型能力边界
大语言模型(LLM)的文本生成能力令人惊叹,但当我们需要它完成"查询北京上海天气对比后生成报告并保存"这类复合任务时,单纯的语言模型就显得力不从心。这正是LangChain的价值所在——它将大模型从"语言生成器"升级为具备工具调用、多步决策能力的智能代理(Agent)系统。
在传统架构中,开发者需要手动编写复杂的控制逻辑来串联模型和工具。而LangChain通过Agent机制实现了:
- 动态工具选择:根据问题自动判断是否需要调用工具
- 多工具协同:支持串行/并行调用多个工具
- 记忆与状态管理:维护跨步骤的上下文信息
- 异常处理:当工具调用失败时自动调整策略
这种架构突破使得开发者可以专注于业务逻辑设计,而将复杂的流程控制交给框架处理。下面我们通过一个天气查询+文件存储的完整案例,拆解LangChain Agent的核心工作机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具定义
2.1 基础环境配置
推荐使用Python 3.9+环境,通过conda创建隔离环境:
bash复制conda create -n langchain_demo python=3.9
conda activate langchain_demo
安装核心依赖包(示例使用DeepSeek模型,可替换为其他兼容模型):
bash复制pip install langchain_community langchain langchain-deepseek python-dotenv
注意:实际开发中建议通过requirements.txt管理依赖,此处为演示简化流程
2.2 工具类开发规范
LangChain中的工具本质是带有特定装饰器的Python函数,需要遵循以下设计原则:
- 明确的类型提示:所有参数和返回值需标注类型
- 完善的文档字符串:包含功能描述、参数说明和返回示例
- 错误处理机制:捕获并返回标准化的错误信息
- 幂等性设计:相同输入应产生相同输出
天气查询工具实现
由于真实天气API需要付费,我们采用模拟数据演示:
python复制from typing import Optional
import json
from datetime import datetime
from langchain.tools import tool
@tool
def get_weather(city: str, unit: str = "celsius") -> str:
"""获取指定城市的天气信息(模拟实现)
Args:
city: 城市中文名称(如'北京')
unit: 温度单位(celsius|fahrenheit)
Returns:
JSON格式的天气数据字符串
Examples:
>>> get_weather("北京")
'{"city": "北京", "temperature": 15, ...}'
"""
weather_data = {
"北京": {"temperature": 15, "condition": "晴天", "humidity": 45},
"上海": {"temperature": 20, "condition": "多云", "humidity": 60}
}
if city not in weather_data:
return json.dumps({"error": f"未找到{city}的天气数据"})
data = weather_data[city]
if unit == "fahrenheit":
data["temperature"] = int(data["temperature"] * 9/5 + 32)
return json.dumps({
"city": city,
"temperature": data["temperature"],
"unit": unit,
"condition": data["condition"],
"humidity": data["humidity"],
"timestamp": datetime.now().isoformat()
}, ensure_ascii=False)
文件存储工具实现
文件操作需特别注意路径安全和编码处理:
python复制import os
from pathlib import Path
@tool
def
