langchain框架怎么让 Skills 与 MCP(tools)协同使用

技能 - LangChain 文档

ts我看不懂我让ai转成python的了

要给注册的tool写技能详细提示的的文档,在主文件夹创建skills的文件夹,把skills放到里面,然后创建子文件夹:ue_mod制作助手,blender_mod制作助手,网页_mod制作助手,三个文件夹,每个文件夹内有一个skills.md,里面写name:技能名称,description:简短描述和,detail详细描述,详细描述里面写uemod制作流程,有几步,每一步要用什么tool,skills.py可以从每个skills文件夹里构造出所有skills的简短描述,ai可以从里面方法获取对应文档的详细描述

没问题!下面我将你提供的 TypeScript(TS)版技能加载智能体 完全转换为 Python 版本 ,并提供一个完整、可运行、带注释 的示例,使用 LangChain for Python 实现"按需加载技能"的功能。


✅ 目标

构建一个 Python 智能体(Agent),它:

  • 初始不具备专业能力;
  • 当用户提出 SQL 或法律相关问题时,自动调用 load_skill 工具;
  • 动态加载对应领域的提示词(prompt);
  • 基于该提示生成专业回答。

📦 所需依赖

bash

编辑

复制代码
pip install langchain langchain-openai python-dotenv

请确保你已设置 OPENAI_API_KEY 环境变量,或在代码中直接传入。


🐍 完整 Python 代码(可直接运行)

python

编辑

python 复制代码
# skill_agent.py
import os
from typing import Any, Dict, List
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage

# ----------------------------
# 1. 定义 load_skill 工具
# ----------------------------
@tool
def load_skill(skill_name: str) -> str:
    """
    根据技能名称加载对应的专家提示(prompt)。
    支持的技能:write_sql, review_legal_doc
    """
    skills = {
        "write_sql": """
你是一位专业的 SQL 工程师。请遵守以下规则:
- 使用 PostgreSQL 语法。
- 避免 SELECT *,明确列出字段。
- 为复杂逻辑添加注释。
- 假设有表:users(id, name, email), orders(id, user_id, amount)

现在,请根据用户需求生成高质量 SQL。
        """.strip(),
        
        "review_legal_doc": """
你是一位资深法律顾问。请审查用户提供的法律条款,重点关注:
- 责任限制是否过于宽泛
- 是否缺少终止条件
- 是否违反 GDPR/CCPA
- 条款是否模糊或不可执行

请用正式法律语言回复,并指出具体风险点。
        """.strip()
    }
    
    if skill_name not in skills:
        available = ", ".join(skills.keys())
        return f"错误:技能 '{skill_name}' 不存在。可用技能:{available}"
    
    return skills[skill_name]

# ----------------------------
# 2. 初始化 LLM
# ----------------------------
llm = ChatOpenAI(
    model="gpt-4o",
    temperature=0,
    api_key=os.getenv("OPENAI_API_KEY")  # 请确保设置了环境变量
)

# ----------------------------
# 3. 创建 Agent 的系统提示
# ----------------------------
system_prompt = (
    "你是一个乐于助人的智能助手,但你本身不直接具备专业领域知识。\n"
    "当你需要处理 SQL 编写或法律文档审查时,必须先调用 `load_skill` 工具加载对应技能。\n"
    "加载技能后,你将获得该领域的专家提示,请严格遵循该提示生成回答。\n"
    "可用技能:write_sql(SQL 专家)、review_legal_doc(法律审查专家)。\n"
    "不要猜测------如果任务需要专业知识,请务必先加载技能!"
)

prompt = ChatPromptTemplate.from_messages([
    ("system", system_prompt),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])

# ----------------------------
# 4. 绑定工具并创建 Agent
# ----------------------------
tools = [load_skill]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)

# ----------------------------
# 5. 测试函数
# ----------------------------
def run_query(user_input: str):
    response = agent_executor.invoke({
        "input": user_input,
        "chat_history": []  # 可扩展为多轮对话
    })
    print("\n最终回答:")
    print(response["output"])

# ----------------------------
# 6. 运行示例
# ----------------------------
if __name__ == "__main__":
    # 示例 1:SQL 任务
    print("=" * 50)
    print("测试 1:SQL 查询")
    run_query("帮我写一个 SQL,找出总消费超过 100 元的用户姓名和邮箱。")

    print("\n" + "=" * 50)
    print("测试 2:法律审查")
    run_query("请审查这句话:'甲方在任何情况下均不承担法律责任。'")

🔧 如何运行?

  1. 保存代码为 skill_agent.py

  2. 设置 OpenAI API Key (二选一):

    • 方法 A(推荐):创建 .env 文件env

      编辑

      复制代码
      OPENAI_API_KEY=你的实际API密钥

      并在代码开头加:python

      编辑

      复制代码
      from dotenv import load_dotenv
      load_dotenv()
    • 方法 B:直接替换代码中的 api_key=... 为字符串(不推荐,有泄露风险)

  3. 终端运行 :bash

    编辑

    复制代码
    python skill_agent.py

🧠 预期输出(简化版)

text

编辑

复制代码
测试 1:SQL 查询
Thought: 用户需要 SQL 查询,应加载 write_sql 技能。
Tool: load_skill
Tool Input: {"skill_name": "write_sql"}
Tool Output: 你是一位专业的 SQL 工程师...
Final Answer: 
-- 查询总消费超过 100 元的用户
SELECT u.name, u.email
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name, u.email
HAVING SUM(o.amount) > 100;

💡 关键说明

表格

概念 Python 实现
tool @tool 装饰器定义函数即可
createAgent 对应 create_tool_calling_agent + AgentExecutor
技能存储 用 Python 字典模拟,生产环境可改用 JSON/数据库
多轮对话 通过 chat_history 支持(当前示例未启用)

✅ 优势

  • 轻量:技能只是字符串提示,无额外服务开销
  • 安全:专业规则内置于提示中,避免模型自由发挥
  • 可维护 :非技术人员也能编辑 skills 字典中的提示内容

如果你希望将技能存到文件(如 skills/write_sql.txt),我也可以帮你改成从文件加载!只需告诉我即可 😊

相关推荐
humors2211 分钟前
AI案例:头脑风暴创作-正反论证-报告撰写-摘要总结
人工智能·ai·写作·总结·案例·论证
HIT_Weston4 分钟前
115、【Agent】【OpenCode】项目配置(SemVer)
人工智能·agent·opencode
Sam09275 分钟前
OpenClaw 和 Hermes 怎么结合:从聊天入口到隔离执行器的 Agent 工程实践
人工智能·ai
沪漂阿龙11 分钟前
LangChain 系列之 Messages:为什么大模型对话不是简单字符串?
人工智能·深度学习·langchain
jiuLives12 分钟前
从 Prompt Engineering 到 Loop Engineering:AI 工程范式的演进
人工智能·prompt
ACP广源盛1392462567312 分钟前
IX7008 PCIe 交换芯片@ACP#RTX Spark 经济型 8 口扩展芯片(对比 ASM1806)
大数据·人工智能·分布式·嵌入式硬件·gpt·spark·电脑
SEOETC21 分钟前
GEO:杭州AI优化企业实战指南
人工智能·搜索引擎
大模型任我行22 分钟前
腾讯:原生多模态建模路线图
人工智能·语言模型·自然语言处理·论文笔记
搜移IT科技23 分钟前
工业设备更新行动全面推进,通用设备板块增量空间与受益环节解析
人工智能·科技·生活
lauo28 分钟前
碳基心脏最后的堡垒——ibbot青春版:你的随身Token生产厂
大数据·人工智能·chatgpt·智能手机·ai-native