LangChain Skill 实现(渐进披露 On-Demand Skill,LangChain 官方 Deep Agent Skill 模式)
先分清:
- Tool:原子执行函数(查数据库、爬虫、计算)
- Skill:领域SOP/专家提示包,按需加载,不用一次性把所有规则塞进上下文,省token,适合你做小说Agent、量化Agent
- Skill 本质是一个 load_skill Tool,调用后返回整套领域prompt、约束、few-shot、输出模板,注入对话上下文
架构
-
技能库: SKILLS = dict(name, desc, content)
-
唯一入口工具: load_skill(skill_name)
-
Agent 一开始只看到技能简介,不会加载全文;需要时才调用加载完整SOP
-
搭配 LangGraph 做状态持久化(你之前研究Harness/Agent很适配)
完整可直接运行代码(Qwen / DeepSeek 本地模型兼容)
python
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
========== 1. 定义你的技能库(每个skill = 一套SOP) ==========
SKILLS = [
{
"name": "write_novel_chapter",
"description": "写网文章节,适合番茄/塔读爽文,保人设、制造冲突、结尾留钩子",
"content": """
你是资深网文写手。规则:
- 严格遵守人设卡,不能OOC;
- 每300字安排一个小冲突;
- 章节末尾必须留悬念钩子;
- 节奏:铺垫→冲突→爽点→悬念;
- 禁止大段景物堆砌,优先动作、对话。
输出格式:【章节正文】
"""
},
{
"name": "quant_analysis",
"description": "股票基本面+短期行情分析,输出风险和观测指标",
"content": """
你是量化研究员。分析步骤: - 宏观:美联储、地缘、板块政策;
- 基本面:估值、营收、毛利率;
- 资金:北向、板块资金流向;
- 输出:看涨/看平/看跌 + 关键跟踪指标 + 风险提示;
禁止保证收益,必须标注:不构成投资建议。
"""
}
]
========== 2. 实现Skill加载工具(核心) ==========
@tool
def load_skill(skill_name: str) -> str:
"""
按需加载专业技能SOP
Args:
skill_name: 技能名称,可选:write_novel_chapter, quant_analysis
"""
for skill in SKILLS:
if skill"name" == skill_name:
return f"【加载技能 {skill_name}】\n{skill'content'}"
names = ",".join(s"name" for s in SKILLS)
return f"技能不存在,可用技能:{names}"
========== 3. 初始化模型 + Agent ==========
llm = ChatOpenAI(
base_url="http://localhost:11434/v1", # Ollama本地千问
api_key="xxx",
model="qwen2.5:14b",
temperature=0.7
)
prompt = ChatPromptTemplate.from_messages([
("system", """
你是智能体,拥有多个技能。
初始只知道技能简介,需要执行对应任务时,调用 load_skill 加载完整技能规则 。
不要把所有技能全部提前读入。
可用技能简介:
- write_novel_chapter:写网文章节,爽文节奏,结尾留钩子
- quant_analysis:股票量化行情分析
"""),
("user", "{input}"),
("agent_scratchpad", "{agent_scratchpad}")
])
agent = create_react_agent(llm, load_skill, prompt)
agent_executor = AgentExecutor(agent=agent, tools=load_skill, verbose=True)
========== 4. 测试调用 ==========
if name == "main ":
会自动调用load_skill加载小说技能
res = agent_executor.invoke({"input": "帮我写一章玄幻爽文,主角被宗门长老刁难"})
print(res"output")
进阶3种Skill实现方案(按需选)
方案A:上面这种【按需加载Prompt Skill】(官方推荐,token友好)
✅ 适合:大量领域SOP、写作助手、多业务角色
✅ 优点:上下文不会爆炸,Agent自己决定什么时候加载技能
❌ 适合:纯提示约束,没有复杂多步骤编排
方案B:Skill = 子Agent(子智能体)
一个Skill封装独立Agent(自带tools+prompt),主Agent路由分发。
适合:复杂业务,比如"爬虫技能""PDF解析技能",每个子Agent有自己的工具集。
python
伪代码:路由式skill
novel_agent = create_react_agent(llm, search_mem, lorebook_tool, novel_prompt)
quant_agent = create_react_agent(llm, stock_query_tool, quant_prompt)
ROUTER_SKILL = {"write_novel": novel_agent, "quant": quant_agent}
方案C:Skill = LangGraph 子图(最适合生产,对标Harness)
把一套流程封装成一个可调用子图,作为Skill注册到主图。
✅ 适合:有固定分支、重试、状态流转的复杂工作流(你之前看的WorkBuddy/Harness就是这个思路)
Tool=单步函数;Skill=封装好的子Graph工作流
目录化SKILL.md 标准格式(DeepAgent规范,可直接迁移)
每个技能一个文件夹, SKILL.md
md
name: write_novel_chapter
description: 网文章节撰写,爽文节奏,结尾钩子
技能说明
这里写SOP、约束、few-shot、输出模板、引用文件路径
代码里写一个文件加载器,遍历目录读取SKILL.md,动态注册技能,方便团队维护、新增技能不用改代码
关键避坑点
-
不要把所有技能content一次性塞进system prompt,失去渐进披露意义
-
load_skill 返回的内容是ToolMessage,会合并进对话历史,后续轮次自动生效
-
技能之间隔离:加载A技能后,不要污染B技能的规则;可以加状态标记 loaded_skills: list
-
和你之前的Dify、Agent体系打通:Dify的应用本身就是Skill,LangChain Agent可以做路由层
扩展方向(贴合你的Agent论文)
- 增加技能自检:加载skill后,自动校验用户输入是否符合该技能约束
- 技能热更新:不用重启程序,新增SKILL.md自动识别
- 技能优先级、互斥规则(比如量化分析和写小说不能同时激活)
如果你想要,我给你改成 LangGraph子图版本的Skill,带状态、最大迭代、重试,和Harness架构对齐。