使用人类审查机制提升工具调用的可靠性

在自动化程度日益提高的今天,确保模型在特定工具调用时进行人类审查变得尤为重要。当我们不完全信任模型自动执行某些操作时,可以通过引入人类审核机制来进行控制。这篇指南将演示如何在Jupyter Notebook或终端中实现这一机制。

1. 技术背景介绍

在许多应用场景中,模型有时候会做出错误决策,尤其是在涉及到敏感数据或关键操作时。因此,添加一个人类审查环节,要求在执行工具调用之前获得人工批准,可以显著提高操作的可靠性和安全性。

2. 核心原理解析

我们需要一个链式结构来组合模型的输出和工具的调用。在调用执行之前,插入一个人工审查步骤,捕获用户的批准或拒绝输入。如果用户拒绝,则抛出异常阻止工具的进一步执行。

3. 代码实现演示

以下是如何通过langchain库实现这一机制的示例代码:

# 安装所需的包
%pip install --upgrade --quiet langchain

# 设置环境变量
import os
import getpass

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

from langchain_openai import ChatOpenAI
from langchain_core.messages import AIMessage
from langchain_core.tools import tool

# 实例化模型
llm = ChatOpenAI(
    base_url='https://yunwu.ai/v1',  # 国内稳定访问
    api_key=os.environ["LANGCHAIN_API_KEY"]
)

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

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

tools = [count_emails, send_email]
llm_with_tools = llm.bind_tools(tools)

# 人工审查逻辑
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 = llm_with_tools | human_approval | call_tools

# 调用示例
try:
    chain.invoke("how many emails did i get in the last 5 days?")
except NotApproved as e:
    print(e)

4. 应用场景分析

这种人类审查机制适用于需要严格控制自动化的场景,如金融交易平台、医疗诊断系统或涉及敏感数据处理的应用程序。在这些场景中,人工审批可以显著减少风险。

5. 实践建议

  • 安全性: 确保在部署过程中,环境变量和API密钥的妥善管理。
  • 灵活性: 根据具体应用场景调整人工审批逻辑,以适应特定的业务需求。
  • 用户体验: 提高人工审批交互的用户体验,确保审批流程清晰明了。

如果遇到问题欢迎在评论区交流。
—END—

你可能感兴趣的:(python,人工智能,开发语言)