Back to Db Gpt

SKILL 机制集成指南

skills/INTEGRATION_GUIDE.md

0.8.07.7 KB
Original Source

SKILL 机制集成指南

本文档说明如何将 SKILL 机制集成到现有的 DB-GPT agent 中。

集成步骤

1. 导入 SKILL 模块

在需要使用 SKILL 的文件中添加导入:

python
from dbgpt.agent.skill import (
    Skill,
    SkillBuilder,
    SkillLoader,
    SkillManager,
    SkillType,
    get_skill_manager,
    initialize_skill,
)

2. 修改 Agent 类以支持 Skill

在你的 Agent 类中添加 Skill 支持:

python
from dbgpt.agent.expand.tool_assistant_agent import ToolAssistantAgent
from dbgpt.agent.skill import Skill

class SkillEnabledAgent(ToolAssistantAgent):
    def __init__(self, skill: Optional[Skill] = None, **kwargs):
        super().__init__(**kwargs)
        self._skill = skill

        if self._skill:
            self._apply_skill_to_profile()

    @property
    def skill(self) -> Optional[Skill]:
        return self._skill

    def _apply_skill_to_profile(self):
        """应用 Skill 配置到 Agent profile。"""
        if self.skill.prompt_template:
            self.bind_prompt = self.skill.prompt_template

        if self.profile:
            self.profile.goal = self.skill.metadata.description

    async def load_resource(self, question: str, is_retry_chat: bool = False):
        """加载 Skill 所需的资源。"""
        if self.skill:
            await self._load_skill_resources()
        return await super().load_resource(question, is_retry_chat)

    async def _load_skill_resources(self):
        """加载 Skill 所需的工具和知识。"""
        if not self.resource:
            return

        # 检查必需的工具
        if self.skill.required_tools:
            available_tools = self.resource.get_resource_by_type("tool")
            available_tool_names = [t.name for t in available_tools]

            for required_tool in self.skill.required_tools:
                if required_tool not in available_tool_names:
                    raise ValueError(
                        f"Required tool '{required_tool}' not found. "
                        f"Available tools: {available_tool_names}"
                    )

        # 检查必需的知识库
        if self.skill.required_knowledge:
            available_knowledge = self.resource.get_resource_by_type("knowledge")
            available_knowledge_names = [k.name for k in available_knowledge]

            for required_knowledge in self.skill.required_knowledge:
                if required_knowledge not in available_knowledge_names:
                    raise ValueError(
                        f"Required knowledge '{required_knowledge}' not found. "
                        f"Available knowledge: {available_knowledge_names}"
                    )

3. 初始化 Skill Manager

在应用启动时初始化 Skill Manager:

python
from dbgpt.component import SystemApp

def initialize_app():
    system_app = SystemApp()
    initialize_skill(system_app)
    return system_app

4. 注册 Skill

python
from dbgpt.agent.skill import get_skill_manager

def register_my_skills(system_app):
    skill_manager = get_skill_manager(system_app)

    # 创建并注册 Skill
    skill = (
        SkillBuilder(name="my_skill", description="My skill description")
        .with_skill_type(SkillType.Chat)
        .with_prompt_template("You are a helpful assistant.")
        .build()
    )

    skill_manager.register_skill(
        skill_instance=skill,
        name="my_skill",
    )

5. 使用 Skill 创建 Agent

python
from dbgpt.agent import AgentContext, LLMConfig, AgentMemory

async def create_agent_with_skill():
    # 获取 Skill
    skill_manager = get_skill_manager()
    skill = skill_manager.get_skill(name="my_skill")

    # 创建 Agent
    agent = SkillEnabledAgent(skill=skill)

    # 绑定配置
    context = AgentContext(conv_id="test_conv")
    llm_config = LLMConfig()
    memory = AgentMemory()

    await agent.bind(context).bind(llm_config).bind(memory).build()

    return agent

修改现有 Agent 示例

示例:修改 IntentRecognitionAgent

原始文件:packages/dbgpt-serve/src/dbgpt_serve/agent/agents/expand/intent_recognition_agent.py

python
import logging
from dbgpt.agent import ConversableAgent, get_agent_manager
from dbgpt.agent.core.profile import DynConfig, ProfileConfig
from dbgpt.agent.skill import Skill
from dbgpt_serve.agent.agents.expand.actions.intent_recognition_action import (
    IntentRecognitionAction,
)

class IntentRecognitionAgent(ConversableAgent):
    profile: ProfileConfig = ProfileConfig(...)

    def __init__(self, skill: Optional[Skill] = None, **kwargs):
        super().__init__(**kwargs)
        self._skill = skill
        self._init_actions([IntentRecognitionAction])

        if self._skill:
            self._apply_skill_to_profile()

    @property
    def skill(self) -> Optional[Skill]:
        return self._skill

    def _apply_skill_to_profile(self):
        if self.skill and self.skill.prompt_template:
            self.bind_prompt = self.skill.prompt_template

agent_manage = get_agent_manager()
agent_manage.register_agent(IntentRecognitionAgent)

SKILL 文件格式

JSON 格式

json
{
  "metadata": {
    "name": "intent_recognition",
    "description": "Intent recognition skill for user queries",
    "version": "1.0.0",
    "author": "DB-GPT Team",
    "skill_type": "custom",
    "tags": ["intent", "recognition", "nlp"]
  },
  "prompt_template": "You are an intent recognition expert. Analyze user queries and identify their intents.",
  "required_tools": [],
  "required_knowledge": [],
  "config": {
    "max_intents": 10,
    "enable_slot_filling": true
  }
}

Python 格式

python
from dbgpt.agent.skill import Skill, SkillMetadata, SkillType
from dbgpt.core import PromptTemplate

class IntentRecognitionSkill(Skill):
    def __init__(self):
        metadata = SkillMetadata(
            name="intent_recognition",
            description="Intent recognition skill",
            version="1.0.0",
            skill_type=SkillType.Custom,
            tags=["intent", "recognition"],
        )
        prompt = PromptTemplate.from_template(
            "You are an intent recognition expert."
        )
        super().__init__(
            metadata=metadata,
            prompt_template=prompt,
            config={"max_intents": 10},
        )

测试 SKILL 集成

python
import pytest
from dbgpt.agent.skill import SkillBuilder, SkillType

def test_skill_integration():
    # 创建 Skill
    skill = (
        SkillBuilder(name="test_skill", description="Test skill")
        .build()
    )

    # 创建 Agent
    agent = SkillEnabledAgent(skill=skill)

    # 验证
    assert agent.skill is not None
    assert agent.skill.metadata.name == "test_skill"

最佳实践

  1. 分离关注点:Skill 应该专注于特定领域的能力
  2. 版本管理:为 Skill 使用语义化版本号
  3. 依赖声明:清晰声明 Skill 所需的工具和知识
  4. 文档完善:为 Skill 编写详细的文档和示例
  5. 测试覆盖:为每个 Skill 编写单元测试

常见问题

Q: 如何动态切换 Skill?

A: 在 Agent 中添加 switch_skill 方法:

python
def switch_skill(self, skill: Skill):
    self._skill = skill
    self._apply_skill_to_profile()

Q: Skill 可以包含多个工具吗?

A: 可以,使用 with_required_tool 多次添加:

python
skill = (
    SkillBuilder(name="multi_tool", description="Multi tool skill")
    .with_required_tool("tool1")
    .with_required_tool("tool2")
    .with_required_tool("tool3")
    .build()
)

Q: 如何从文件加载 Skill?

A: 使用 SkillLoader

python
from dbgpt.agent.skill import SkillLoader

loader = SkillLoader()
skill = loader.load_skill_from_file("path/to/skill.json")