Read this in English.
BMTools 是一能让语言模型使用扩展工具的开源仓库,其也是开源社区构建和共享工具的一个平台。在这个仓库中,您可以 (1) 通过编写 Python 函数轻松构建插件,(2) 使用外部的 ChatGPT-Plugins。
本项目受到开源项目LangChain的启发,针对开源工具的使用(例如ChatGPT-Plugins)进行了优化,力图实现 ChatGPT-Plugins 的开源学术版本。
当前版本的 BMTools 还有很大的改进空间,我们将继续努力提高它的性能。
git clone [email protected]:OpenBMB/BMTools.git
python setup.py develop
在 secret_keys.sh 中添加 API 密钥,然后启动本地工具:
source secret_keys.sh
python host_local_tools.py
然后将插件的URL设置为 http://127.0.0.1:8079/tools/{tool_name}/
(记得加上 /
)。
只需将其加载到指向 .well-known/ai-plugin.json
的 URL 中即可。例如, 如果 URL 设置为 https://www.klarna.com/
,那么https://www.klarna.com/.well-known/ai-plugin.json
是一个有效的配置。
from bmtools.agent.singletool import load_single_tools, STQuestionAnswerer
tool_name, tool_url = 'klarna', 'https://www.klarna.com/'
tool_name, tool_config = load_single_tools(tool_name, tool_url)
print(tool_name, tool_config)
stqa = STQuestionAnswerer()
agent = stqa.load_tools(tool_name, tool_config)
agent("{Your Question}")
我们可以同时使用多个工具。基本上,语言模型会递归地处理它。它会将整个工具视为一个 API,向其发送问题,工具调用其子 API 来解决问题并将其发送回父工具。此功能在即将推出的 Chat 模式中将非常有用。
可以使用以下脚本尝试此功能:
from bmtools.agent.tools_controller import load_valid_tools, MTQuestionAnswerer
tools_mappings = {
"klarna": "https://www.klarna.com/",
"chemical-prop": "http://127.0.0.1:8079/tools/chemical-prop/",
"wolframalpha": "http://127.0.0.1:8079/tools/wolframalpha/",
}
tools = load_valid_tools(tools_mappings)
qa = MTQuestionAnswerer(openai_api_key='', all_tools=tools)
agent = qa.build_runner()
agent("How many benzene rings are there in 9H-Carbazole-3-carboxaldehyde? and what is sin(x)*exp(x)'s plot, what is it integrated from 0 to 1? ")
- 将您的插件添加到 web_demo.py 文件开头的映射中
- 启动 webdemo
python web_demo.py
如果要在本地开发工具,您需要编写一个 Python 函数来构建该工具并将其在注册表中进行注册。
例如,您可以编写一个工具来执行 Python 代码并返回结果。以下为示例代码:
from bmtools.tools import Tool
from pydantic import BaseModel
class ExecutionQuery(BaseModel):
code: str
class ExecutionResult(BaseModel):
result: str
def build_python_tool(config) -> Tool:
tool = Tool(
"PythonTool",
"A plugin that can execute python code",
name_for_model="python",
description_for_model="A plugin that can execute python code",
contact_email="your@email",
)
@tool.post("/execute")
def execute_python_code(query : ExecutionQuery) -> ExecutionResult:
return ExecutionResult(
result=eval(query.code)
)
return tool
然后,您需要使用以下代码将工具注册到注册表中:
from bmtools.tools import register
@register("python")
def register_python_tool():
return build_python_tool
在这里,我们将工具注册名称定为 “python”。
当您开发完一个工具后,您可以按照以下步骤将其贡献给 BMTools 仓库:
- Fork 此存储库
- 在
bmtools/tools/{tool_name}
中创建一个文件夹 - 在该文件夹下添加
api.py
文件:bmtools/tools/{tool_name}/api.py
和一个__init__.py
文件:bmtools/tools/{tool_name}/__init__.py
- 使用 3.1 节中的代码在第 3 步创建的
__init__.py
文件中注册该工具 - 在
bmtools/tools
的__init__.py
文件中导入您的工具 - 添加一个
test.py
文件以自动测试您的工具 - 在您的文件夹中添加一个
readme.md
,包含一个简短的工具介绍、贡献者信息或您想让其他人知道的任何信息。
您编写的函数将被转换为与 OpenAI 插件兼容的接口。AI 模型将读取工具的名称、描述以及该工具所有的 API 的名称和描述。您可以在以下方面进行调整,以使您的 API 能够被 AI 模型更好地理解。
-
name_for_model
(告诉模型这个工具是什么) -
description_for_model
(在调用工具之前将输入给模型,您可以在其中包含有关如何使用 API 的信息) -
每个 API 函数的函数名,以及
@tool.get()
中的名称。这两个名称最好能够匹配,因为工具名称在模型 API 选择中起着重要作用。 -
函数的文档字符串(可以向模型建议是否使用此 API)
-
函数的返回值,可在模型调用出错时为其提供报错信息,以指导其下一步操作,例如重试或指示应首选的下一步操作。
-
减少 API 函数中的错误。
一个简单的例子是 Wolfram Alpha API,其可作为工具提示优化的参考。