作者:WangQiaomei

标签:Python、Pydantic、元编程、LangChain、AI Agent、运维开发

🔥 前言自研 Agent 工具想无缝接入 LangChain?StructuredTool 强制要 Pydantic args_schema?手写 N 个模型太蠢?这篇 动态生成 Pydantic 模型 实战,让你一行代码自动造类,生产级优雅!


一、场景:自研 Tool → LangChain 无痛迁移(适配器模式)

痛点

  • 自研 BaseTool 使用 PARAM_SCHEMA = [] 列表定义参数
  • LangChain StructuredTool 必须要 Pydantic Model
  • 不可能为每个工具手写模型类

解决方案(DeepAgentFactory 核心巧思)

python

运行

# 旧工具(自研)
class AlertHealthTool(BaseTool):
    PARAM_SCHEMA = [ToolParam(name="limit", type="integer", ...)]
    def execute(self, limit=3): ...

# 自动转 LangChain StructuredTool
def _base_tool_to_langchain(base_tool_instance):
    # ✅ 动态生成 Pydantic 模型(核心魔法)
    ArgsModel = type("ArgsSchema", (BaseModel,), fields)
    return StructuredTool(
        name=...,
        args_schema=ArgsModel,
        func=_execute
    )

二、🔥 核心魔法:动态生成 Pydantic 模型

python

运行

ArgsModel = type("ArgsSchema", (BaseModel,), fields)

代码拆解(元编程本质)

表格

参数 含义
"ArgsSchema" 新类名
(BaseModel,) 继承 Pydantic BaseModel
fields 属性字典:{name: (type, default)}

等价手写类

python

运行

class ArgsSchema(BaseModel):
    limit: int = 3
    project: str  # 必填 ...

三、✅ 完整可复制流程(生产级)

1. 原工具定义

python

运行

class AlertHealthTool(BaseTool):
    PARAM_SCHEMA = [
        ToolParam(name="limit", type="integer", default=3),
    ]

2. 构造 fields

python

运行

fields = {}
for p in param_schema:
    tp = int if p.type == "integer" else str
    default = p.default if p.default is not None else ...
    fields[p.name] = (tp, default)

# 结果:{"limit": (int, 3)}

3. 动态创建 Pydantic 模型

python

运行

from pydantic import BaseModel

ArgsModel = type("ArgsSchema", (BaseModel,), fields)

4. 生成 LangChain Tool

python

运行

tool = StructuredTool(
    name="alert_health",
    description="查询TopN告警健康度",
    args_schema=ArgsModel,
    func=lambda **kw: base_tool.execute(**kw)
)


四、💡 为什么必须这样做?(架构价值)

表格

原因 说明
LangChain 强制要求 StructuredTool 必须 args_schema
自研体系不兼容 旧工具是列表格式,非 Pydantic
无侵入迁移 不改旧代码,自动适配
元编程威力 运行时造类,1 行顶 100 行

一句话总结:type() 动态造类 = 自研工具 ↔ LangChain 桥梁


五、🎯 总结(面试必背)

  • type(类名, 基类元组, 属性字典) → Python 动态创建类
  • 适配 LangChain StructuredTool 必备技巧
  • 企业级 Agent 工厂标准设计模式
  • 元编程 = 优雅、可扩展、零冗余

🎁 福利

需要 完整可运行工具适配器源码 的同学,评论区扣 「Agent」!关注 @WangQiaomei,持续更新 AI Agent 架构实战干货!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐