# 引言
在人工智能和自动化的世界中,有时候我们需要确保某些工具的调用经过人为审核,以避免潜在的错误或滥用。这篇文章旨在介绍如何在Jupyter Notebook或命令行中实现“人类在回路中” (human-in-the-loop) 的流程,以增强系统的安全性和可靠性。
# 主要内容
## 环境设置
首先,我们需要安装`langchain`这个Python包,以便能够创建连贯的工具调用链。
```bash
%pip install --upgrade --quiet langchain
设置环境变量以开启LangSmith特性(如果需要):
import getpass
import os
# 如果你希望使用LangSmith,取消下列注释:
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
创建工具和链
我们将创建几个简单的工具,并通过一个调用链来管理这些工具。
from langchain_core.messages import AIMessage
from langchain_core.tools import tool
@tool
def count_emails(last_n_days: int) -> int:
"""对最近N天的电子邮件计数。"""
return last_n_days * 5 # 数据为示例
@tool
def send_email(message: str, recipient: str) -> str:
"""发送电子邮件。"""
return f"已成功发送邮件给 {recipient}。"
tools = [count_emails, send_email]
接下来,创建一个工具调用链:
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
添加人类审批
在工具调用链中引入一个审核步骤,要求用户进行审批。
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"您是否批准以下工具调用\n\n{tool_strs}\n\n"
"除 'Y'/'Yes' 外(不区分大小写)将被视为不。 >>>"
)
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()
print(e)
try:
chain.invoke("Send sally@gmail.com an email saying 'What's up homie'")
except NotApproved as e:
print()
print(e)
在这里,通过模拟用户输入,我们可以控制工具的执行流,以防止未经批准的调用。
常见问题和解决方案
- 工具调用链过于复杂? 可以通过分步骤调试的方式来确保各个组成部分的稳定性。
- 如何处理网络请求超时? 在涉及API调用时,可以选择使用API代理服务以提高访问的稳定性,特别在某些地区。
总结和进一步学习资源
这种“人类在回路中”的方法是增强自动化工具链安全性的一种有效方式。在生产环境中,您可能需要进一步优化以处理更多的状态管理和故障处理。
参考资料
- LangChain 官方文档
- Jupyter Notebook 官方指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---