开启左侧

LangChain中Skills是什么

[复制链接]
AA小狮仔 发表于 2026-5-13 15:45:42 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
作者:CSDN博客
LangChain 生态外的大模型应用领域,Skills 是一个明确的官方术语(常见于 Azure AI、Anthropic Claude、Google Gemini 等平台),而 LangChain 自身并未将其作为原生概念,而是通过 Tools、Functions、Runnables 等组件实现“技能”的核心能力。
下面从概念对齐、技术映射、融合实践三个层面,专业分析 Skills(通用大模型术语)与 LangChain 组件的关联与结合方式。
一、 先明确:Skills(通用术语)的官方定义

在主流大模型平台(如 Azure AI Skills、Claude Skills)中,Skills 是指大模型可调用的、封装了特定业务逻辑或工具能力的模块化单元,具备三大核心特征:
    目标专一性:一个 Skill 只解决一类问题(如“文本摘要 Skill”“医疗数据结构化 Skill”“SQL 查询 Skill”)。可组合性:多个 Skill 可以串联/并联执行,完成复杂任务(如“先调用 PDF 解析 Skill → 再调用医疗术语提取 Skill → 最后调用报告生成 Skill”)。声明式调用:大模型通过自然语言理解用户需求,自主决策是否调用、调用顺序,无需开发者编写硬编码的条件分支。
这与 LangChain 设计的核心目标(让大模型“能做事”而非“只说话”)完全一致,只是二者的命名体系和封装粒度不同
二、 LangChain 组件与 Skills 的技术映射关系

我们可以把 LangChain 的核心模块看作是实现 Skills 能力的技术载体,二者的对应关系和差异如下表所示:
维度通用术语 SkillsLangChain 对应组件核心映射逻辑
基础单元单个 Skill 封装一个独立功能(如数据查询、格式转换)Tool / BaseTool 类LangChain 的 Tool 是 Skill 的最小实现载体,@tool 装饰器本质是 Skill 的封装语法
能力组合多 Skill 编排(串行/并行/条件分支)Agent + Toolkit + RunnableSequenceToolkit 是同类 Skill 的集合(如 SQLToolkit = 多个 SQL 操作 Skill);Agent 负责 Skill 调度
状态管理Skill 执行过程中可维护上下文(如中间结果、参数)RunnableConfig + Memory 组件通过 Memory 存储 Skill 调用的历史结果,RunnableConfig 传递上下文参数
权限与安全Skill 调用的鉴权、配额限制(如付费 Skill 的密钥管理)ToolConfig + langchain_core.utils.auth 工具LangChain 通过配置项注入 API 密钥、权限参数,实现 Skill 的安全调用
核心结论
LangChain 没有直接定义 Skill 类,但它的 Tool 是 Skill 的“原子实现”,Toolkit 是 Skill 的“集合封装”,Agent 是 Skill 的“智能调度器” —— 三者结合,完全覆盖通用术语中 Skills 的全部能力。
三、 融合实践:如何在 LangChain 中实现“Skills 范式”的开发

既然 Skills 的核心是“模块化、可组合、声明式调用”,我们可以基于 LangChain 组件,按照 Skills 的设计理念进行开发,步骤如下:
1.  第一步:按 Skill 标准封装 Tool(原子 Skill 开发)

区别于普通 LangChain Tool,Skill 级别的 Tool 需要更严格的标准化
    必须包含输入输出 Schema 定义(让大模型明确参数要求);必须添加业务级描述(而非技术描述);必须处理异常和边界情况(保证 Skill 稳定性)。
示例:医疗数据结构化 Skill(适配医疗信息化场景)
  1. from langchain.tools import BaseTool
  2. from pydantic import BaseModel, Field
  3. from typing import Type, Optional
  4. # 1. 定义 Skill 的输入输出 Schema(声明式约束)classMedicalRecordInput(BaseModel):
  5.     record_text:str= Field(description="原始医疗门诊记录文本,包含症状、诊断、用药信息")
  6.     output_format:str= Field(default="json", description="输出格式,支持 json/markdown")classMedicalRecordOutput(BaseModel):
  7.     patient_symptom:str
  8.     diagnosis_result:str
  9.     medication_list:list[str]
  10.     doctor_advice:str# 2. 封装 Skill 级 ToolclassMedicalRecordStructuringSkill(BaseTool):
  11.     name ="medical_record_structuring_skill"
  12.     description ="专门用于将非结构化医疗门诊记录转换为结构化数据的技能,适用于电子病历处理场景"
  13.     args_schema: Type[BaseModel]= MedicalRecordInput  # 绑定输入Schema
  14.     return_direct:bool=True# 直接返回结构化结果,无需大模型二次加工def_run(self, record_text:str, output_format:str="json")->str:# 核心业务逻辑:医疗文本结构化(实际场景可调用 NLP 模型或医疗知识库 API)import re
  15.         # 模拟提取逻辑(真实场景替换为医疗 NER 模型)
  16.         symptom = re.search(r"症状:(.*?);", record_text).group(1)
  17.         diagnosis = re.search(r"诊断:(.*?);", record_text).group(1)
  18.         medication = re.findall(r"用药:(.*?);", record_text)
  19.         advice = re.search(r"医嘱:(.*)", record_text).group(1)
  20.         result = MedicalRecordOutput(
  21.             patient_symptom=symptom,
  22.             diagnosis_result=diagnosis,
  23.             medication_list=medication,
  24.             doctor_advice=advice
  25.         )# 按指定格式输出if output_format =="json":return result.model_dump_json(indent=2)else:returnf"# 结构化医疗记录\n- 症状:{symptom}\n- 诊断:{diagnosis}\n- 用药:{medication}\n- 医嘱:{advice}"def_arun(self, record_text:str, output_format:str="json"):# 异步实现(可选)raise NotImplementedError("异步模式暂未支持")
复制代码
2.  第二步:Skill 组合(多 Skill 编排)

通用 Skills 范式的核心优势是组合性,在 LangChain 中可以通过两种方式实现:
方式1:Toolkit 封装同类 Skill(静态组合)

把业务上相关的 Skill 打包成 Toolkit,方便复用和管理,示例:
  1. from langchain.tools import Tool
  2. from langchain.agents import create_openai_tools_agent
  3. # 假设已有另一个 Skill:MedicalCodeMappingSkill(医疗编码映射)classMedicalCodeMappingSkill(BaseTool):
  4.     name ="medical_code_mapping_skill"
  5.     description ="将诊断结果映射为 ICD-10 编码的技能"# 实现逻辑省略...# 封装为医疗 Skill 工具箱classMedicalSkillToolkit:@classmethoddefget_tools(cls):return[
  6.             MedicalRecordStructuringSkill(),
  7.             MedicalCodeMappingSkill()]# 直接调用工具箱的所有 Skill
  8. medical_tools = MedicalSkillToolkit.get_tools()
复制代码
方式2:Agent + RunnableSequence 实现动态组合(动态编排)

让大模型根据任务需求,自主选择 Skill 组合顺序,示例:
  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
  3. from langchain.agents import AgentExecutor
  4. # 1. 初始化大模型
  5. llm = ChatOpenAI(model="gpt-4", temperature=0)# 2. 定义 Prompt:明确告知大模型可以调用的 Skill 及组合逻辑
  6. prompt = ChatPromptTemplate.from_messages([("system","你是医疗信息化助手,可调用以下技能:1. 医疗记录结构化技能(处理原始门诊文本);2. 医疗编码映射技能(将诊断转为 ICD-10 编码)。请根据用户需求选择技能,复杂任务可组合调用。"),("user","{input}"),
  7.     MessagesPlaceholder(variable_name="agent_scratchpad")])# 3. 创建 Agent 并绑定 Skill 工具箱
  8. agent = create_openai_tools_agent(llm, medical_tools, prompt)
  9. agent_executor = AgentExecutor(agent=agent, tools=medical_tools, verbose=True)# 4. 测试组合 Skill 调用
  10. agent_executor.invoke({"input":"帮我处理这份门诊记录:症状:发热咳嗽;诊断:急性支气管炎;用药:阿莫西林、止咳糖浆;医嘱:多喝水休息。要求:先结构化,再映射为 ICD-10 编码"})
复制代码
执行后,Agent 会自动先调用 MedicalRecordStructuringSkill 结构化文本 → 再调用 MedicalCodeMappingSkill 生成编码,完全符合通用 Skills 的组合调用范式。
四、 两者融合的核心价值与注意事项

1.  核心价值

    统一开发范式:用 LangChain 的成熟组件实现 Skills 能力,无需重复造轮子;业务适配性强:针对医疗信息化等垂直领域,可以封装领域专属 Skill(如电子病历 Skill、医保结算规则 Skill),解决行业痛点;跨平台兼容:基于 LangChain 封装的 Skill,可无缝迁移到 Azure AI、AWS Bedrock 等平台(只需适配少量接口)。
2.  注意事项

    Schema 标准化是关键:通用 Skills 要求严格的输入输出 Schema,LangChain 中需通过 Pydantic BaseModel 定义,否则大模型无法准确传参;避免 Skill 冗余:一个功能只封装为一个 Skill,同类 Skill 归类到 Toolkit,防止 Agent 调度混乱;权限隔离:医疗数据属于敏感数据,封装 Skill 时需通过 ToolConfig 注入鉴权参数,避免数据泄露。
总结

Skills(通用官方术语)与 LangChain 组件并非对立关系,而是 “理念与实现” 的映射关系:
    Skills 是设计理念:强调模块化、可组合、声明式调用;LangChain 的 Tool/Toolkit/Agent 是技术实现:提供了一套成熟的工具链,让 Skills 理念落地。
在实际开发中,只需按照通用 Skills 的标准设计 LangChain Tool,并通过 Agent 实现 Skill 调度,就能兼顾 LangChain 的生态优势和 Skills 范式的专业性。

原文地址:https://blog.csdn.net/mofijeck/article/details/156650591
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )