1. tool
LangChain 的 Tool 设计其实很直观------工具就是一个注册方法(函数),
写清楚它能干啥, 什么时候用, 由 LLM 来决定具体的调用时机与传参。
例子
python
from pydantic import BaseModel, Field
from langchain_core.tools import tool
class WeatherInput(BaseModel):
city: str = Field(description="城市名称,如'杭州'、'北京'")
date: str = Field(description="日期,格式 YYYY-MM-DD")
@tool(args_schema=WeatherInput)
def get_weather(city: str, date: str) -> str:
"""查询指定城市指定日期的天气预报。当用户问到天气相关问题时使用。"""
# 实际调用天气 API
return f"{city} {date} 的天气:晴,25°C"
@tool 装饰器会自动提取函数的 docstring 和 签名, LLM 看到的是这样一段描述:
- 工具名: get_weather
- 描述: 查询指定城市指定日期的天气预报。当用户问到天气相关问题时使用。
- 参数: { city: string(城市名称), date: string(日期) }
LLM 根据这段描述判断"用户在问天气,我该调用这个工具",然后生成 {"city": "杭州", "date": "2026-08-19"} 作为参数。
2. skill
skill 是 知识注入 和 工具关联.
自己开发 agent时, 如何实现像 cc 那样自动加载 .claude/skills 目录 这样的效果呢?
Q :langchain 中有没有 skill 这个 预定义的 class, 来应对 这个 场景?
A:没有.
实现 Skill 加载器
在 Agent loop 里注入 Skill. 在每次构建上下文时,根据用户意图选择合适的 Skill 注入.
Deep Agents Skills
如果你要从零搭 Agent,用 Deep Agents 的 create_deep_agent + FilesystemBackend 是最省事的,基本就是 CC Skills 的开源复刻版
注入 prompt
python
# 1. 定义 Skill 字典
skills = {
"sql-expert": """
# SQL 专家规则
你是一个 SQL 专家,遵循以下规范:
- 所有查询必须加 LIMIT
- 生产环境禁止 DELETE 不带 WHERE
""",
"code-reviewer": """
# 代码审查规则
...
""",
}
# 2. 用一个 tool 做按需加载
@tool
def load_skill(name: str) -> str:
"""加载指定技能的完整指令。name 参数可选值:sql-expert, code-reviewer"""
return skills.get(name, f"未知技能,可选值:{list(skills.keys())}")
# 3. 用 middleware 注入初始摘要
from langchain.agents.middleware import AgentMiddleware
class SkillMiddleware(AgentMiddleware):
def before_model(self, state, runtime):
# 只在 system prompt 里列出可用 Skill 名称
skill_list = "\n".join(f"- {k}" for k in skills)
return {
"system_prompt": f"可用技能:\n{skill_list}\n使用 load_skill 工具加载具体技能指令。"
}