共计 1803 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要更好的 Skill 执行框架
在开发 AI Agent 时,我们经常遇到这样的问题:
- 每个新 Skill 都要从头开发,复用性差
- 技能之间的上下文传递像玩传话筒游戏,信息容易丢失
- 执行流程硬编码,调整一个步骤就得改整个链路
这些问题让 Agent 开发变成了「胶水代码」工作。去年我接手一个客服机器人项目,光是处理用户地址变更就要串联 5 个微服务,调试时就像在走迷宫。
LangChain 的解法:乐高式技能组装
LangChain 用三个核心组件解决了这些问题:
- Chain:把 Skill 包装成标准化积木
- Memory:给所有 Skill 共享的记事本
- AgentExecutor:智能调度这些积木的指挥官
对比传统微服务架构:
| 维度 | 传统微服务 | LangChain 方案 |
|---|---|---|
| 技能调用 | HTTP/RPC | 直接方法调用 |
| 上下文传递 | 手动序列化 | 自动内存管理 |
| 流程调整 | 需要重新部署 | 动态组合 |

(图示:技能通过 @tool 装饰器注册到中央路由器)
手把手实现天气预报 Skill
让我们用 Python 3.10 写个真实可用的例子:
from langchain.tools import tool
from typing import Annotated
import requests
class WeatherSkill:
"""
封装天气预报能力的 Skill 组件
示例用法:>>> weather = WeatherSkill(api_key="xxx")
>>> weather.query("北京")
"北京当前气温 25℃"
"""
def __init__(self, api_key: str):
self.client = WeatherAPIClient(api_key)
@tool
def query(location: Annotated[str, "城市名称,如' 上海 '"]
) -> str:
"""查询指定城市天气"""
try:
data = self.client.get_current(location)
return f"{location}当前气温{data['temp']}℃"
except Exception as e:
return f"查询失败: {str(e)}"
关键设计点:
- 使用 Python 类型注解明确输入输出
- 通过
@tool装饰器实现自动注册 - 详细的 docstring 帮助 Agent 理解功能
组合多个 Skill 的魔法
用 LCEL 语言把天气和地图 Skill 串联起来:
from langchain.schema.runnable import RunnablePassthrough
weather = WeatherSkill(api_key="xxx")
map = MapSkill(api_key="yyy")
pipeline = ({"location": RunnablePassthrough()}
| weather.query
| map.get_coordinates
)
# 执行完整流程
result = pipeline.invoke("杭州")
这相当于让 Agent 学会了:「先查天气,再找这个地方在地图上的位置」
生产环境必须考虑的坑
性能优化
我们压测了 1000 次连续调用:
- 同步模式:78 秒
- 异步改造后:12 秒
改造方法很简单:
async def async_query(location: str) -> str:
# 使用 async/await 调用底层 API
...
安全防护
所有外部输入都建议做校验:
from pydantic import validate_arguments
@validate_arguments
@tool
def query(location: str) -> str:
assert len(location) < 20, "城市名称过长"
...
调试技巧
遇到诡异的问题时,用 LangSmith 查看执行轨迹:
- 安装观察组件
pip install langsmith - 在代码中添加:
from langsmith import trace @trace def my_skill(): ... - 访问控制台查看调用链
进阶思考题
- 当 Skill 需要访问数据库时,如何设计连接池管理?
- 怎样让 Agent 能动态学习新的 Skill?
- 在流式响应场景下如何优化 Chain 的执行顺序?
实践心得
经过三个月的真实项目验证,这套方案最让我惊喜的是:当产品经理提出「能不能加个根据天气推荐衣服的功能」时,我只需要新增一个 ClothingSkill,然后修改 LCEL 组合表达式——完全不用动原有代码。这种可扩展性,才是 AI Agent 该有的样子。
正文完
