Skip to content

Latest commit

 

History

History
186 lines (123 loc) · 6.87 KB

README_zh.md

File metadata and controls

186 lines (123 loc) · 6.87 KB

BMTools

Read this in English.

bmtools

BMTools 是一能让语言模型使用扩展工具的开源仓库,其也是开源社区构建和共享工具的一个平台。在这个仓库中,您可以 (1) 通过编写 Python 函数轻松构建插件,(2) 使用外部的 ChatGPT-Plugins。

本项目受到开源项目LangChain的启发,针对开源工具的使用(例如ChatGPT-Plugins)进行了优化,力图实现 ChatGPT-Plugins 的开源学术版本。

最新支持

星标日志

Star History Chart

1. 安装

git clone git@github.com:OpenBMB/BMTools.git
python setup.py develop

2. 使用现有工具

2.1 配置工具

2.1.1 本地工具

在 secret_keys.sh 中添加 API 密钥,然后启动本地工具:

source secret_keys.sh
python host_local_tools.py

然后将插件的URL设置为 http://127.0.0.1:8079/tools/{tool_name}/(记得加上 /)。

2.1.2 使用在线的 ChatGPT-Plugins

只需将其加载到指向 .well-known/ai-plugin.json 的 URL 中即可。例如, 如果 URL 设置为 https://www.klarna.com/,那么https://www.klarna.com/.well-known/ai-plugin.json是一个有效的配置。

2.2 使用单个工具

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}")

2.3 使用多个工具

我们可以同时使用多个工具。基本上,语言模型会递归地处理它。它会将整个工具视为一个 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? ")

2.4 使用 Web Demo

  1. 将您的插件添加到 web_demo.py 文件开头的映射中
  2. 启动 webdemo
python web_demo.py

3. 使用定制工具

3.1 本地开发工具

如果要在本地开发工具,您需要编写一个 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”。

3.2 贡献到 BMTools

当您开发完一个工具后,您可以按照以下步骤将其贡献给 BMTools 仓库:

  1. Fork 此存储库
  2. bmtools/tools/{tool_name} 中创建一个文件夹
  3. 在该文件夹下添加 api.py 文件:bmtools/tools/{tool_name}/api.py 和一个 __init__.py 文件:bmtools/tools/{tool_name}/__init__.py
  4. 使用 3.1 节中的代码在第 3 步创建的 __init__.py 文件中注册该工具
  5. bmtools/tools__init__.py 文件中导入您的工具
  6. 添加一个 test.py 文件以自动测试您的工具
  7. 在您的文件夹中添加一个 readme.md,包含一个简短的工具介绍、贡献者信息或您想让其他人知道的任何信息。

4. 优化工具的提示信息

您编写的函数将被转换为与 OpenAI 插件兼容的接口。AI 模型将读取工具的名称、描述以及该工具所有的 API 的名称和描述。您可以在以下方面进行调整,以使您的 API 能够被 AI 模型更好地理解。

  1. name_for_model(告诉模型这个工具是什么)

  2. description_for_model(在调用工具之前将输入给模型,您可以在其中包含有关如何使用 API 的信息)

  3. 每个 API 函数的函数名,以及 @tool.get() 中的名称。这两个名称最好能够匹配,因为工具名称在模型 API 选择中起着重要作用。

  4. 函数的文档字符串(可以向模型建议是否使用此 API)

  5. 函数的返回值,可在模型调用出错时为其提供报错信息,以指导其下一步操作,例如重试或指示应首选的下一步操作。

  6. 减少 API 函数中的错误。

一个简单的例子是 Wolfram Alpha API,其可作为工具提示优化的参考。

引用

如果您在您的工作中使用了BMTools,请参考下面引用:

@misc{qin2023tool,
      title={Tool Learning with Foundation Models}, 
      author={Yujia Qin and Shengding Hu and Yankai Lin and Weize Chen and Ning Ding and Ganqu Cui and Zheni Zeng and Yufei Huang and Chaojun Xiao and Chi Han and Yi Ren Fung and Yusheng Su and Huadong Wang and Cheng Qian and Runchu Tian and Kunlun Zhu and Shihao Liang and Xingyu Shen and Bokai Xu and Zhen Zhang and Yining Ye and Bowen Li and Ziwei Tang and Jing Yi and Yuzhang Zhu and Zhenning Dai and Lan Yan and Xin Cong and Yaxi Lu and Weilin Zhao and Yuxiang Huang and Junxi Yan and Xu Han and Xian Sun and Dahai Li and Jason Phang and Cheng Yang and Tongshuang Wu and Heng Ji and Zhiyuan Liu and Maosong Sun},
      year={2023},
      eprint={2304.08354},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}