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),我也可以帮你改成从文件加载!只需告诉我即可 😊

相关推荐
老刘干货15 小时前
Prompt工程全解·第四篇:精雕细琢——迭代优化与防御性提示词设计
人工智能·技术人
輕華15 小时前
OpenCV答题卡识别:从图像预处理到自动评分
人工智能·opencv·计算机视觉
JQLvopkk15 小时前
机器视觉为何不用普通相机
人工智能·数码相机
AI航向标15 小时前
OpenClaw 完整本地部署安装(接入飞书)
人工智能·飞书·openclaw
接着奏乐接着舞。15 小时前
机器学习经验总结整理
人工智能·机器学习
Sim148015 小时前
iPhone将内置本地大模型,手机端AI实现0 token成本时代来临?
人工智能·ios·智能手机·iphone
AI航向标15 小时前
Openclaw一键本地部署接入豆包
人工智能·openclaw
就是这么拽呢15 小时前
论文查重低但AIGC率高,如何补救?
论文阅读·人工智能·ai·aigc
supericeice15 小时前
创邻科技 AI智算一体机:支持 DeepSeek 671B 与 Qwen3 单机部署,覆盖纯CPU到多GPU多机扩展
大数据·人工智能·科技
لا معنى له15 小时前
Var-JEPA:联合嵌入预测架构的变分形式 —— 连接预测式与生成式自监督学习 ----论文翻译
人工智能·笔记·学习·语言模型