首页 > 其他分享 >对 LLM 工具使用进行统一

对 LLM 工具使用进行统一

时间:2024-09-26 10:16:26浏览次数:8  
标签:调用 temperature get 模型 聊天 LLM 工具 统一

我们为 LLM 确立了一个跨模型的 统一工具调用 API。有了它,你就可以在不同的模型上使用相同的代码,在 MistralCohereNousResearchLlama 等模型间自由切换,而无需或很少需要根据模型更改工具调用相关的代码。此外,我们还在 transformers 中新增了一些实用接口以使工具调用更丝滑,我们还为此配备了 完整的文档 以及端到端工具使用的 示例。我们会持续添加更多的模型支持。

引言

LLM 工具使用这个功能很有意思 —— 每个人都认为它很棒,但大多数人从未亲测过。它的概念很简单: 你给 LLM 提供一些工具 (即: 可调用的函数),LLM 在响应用户的查询的过程中可自主判断、自行调用它们。比方说,你给它一个计算器,这样它就不必依赖其自身不靠谱的算术能力; 你还可以让它上网搜索或查看你的日历,或者授予它访问公司数据库的权限 (只读!),以便它可以提取相应信息或搜索技术文档。

工具调用使得 LLM 可以突破许多自身的核心限制。很多 LLM 口齿伶俐、健谈,但涉及到计算和事实时往往不够精确,并且对小众话题的具体细节不甚了解。它们还不知道训练数据截止日期之后发生的任何事情。它们是通才,但除了你在系统消息中提供的信息之外,它们在开始聊天时对你或聊天背景一无所知。工具使它们能够获取结构化的、专门的、相关的、最新的信息,这些信息可以帮助其成为真正有帮助的合作伙伴,而不仅仅是令人着迷的新奇玩意儿。

然而,当你开始真正尝试工具使用时,问题出现了!文档很少且互相之间不一致,甚至矛盾 —— 对于闭源 API 和开放模型无不如此!尽管工具使用在理论上很简单,但在实践中却常常成为一场噩梦: 如何将工具传递给模型?如何确保工具提示与其训练时使用的格式相匹配?当模型调用工具时,如何将其合并到聊天提示中?如果你曾尝试过动手实现工具使用,你可能会发现这些问题出奇棘手,而且很多时候文档并不完善,有时甚至会帮倒忙。

更糟糕的是,不同模型的工具使用的实现可能迥异。即使在定义可用工具集这件最基本的事情上,一些模型厂商用的是 JSON 模式,而另一些模型厂商则希望用 Python 函数头。即使那些希望使用 JSON 模式的人,细节上也常常会有所不同,因此造成了巨大的 API 不兼容性。看!用户被摁在地板上疯狂摩擦,同时内心困惑不已。

为此,我们能做些什么呢?

聊天模板

Hugging Face Cinematic Universe 的忠​​粉会记得,开源社区过去在 聊天模型 方面也面临过类似的挑战。聊天模型使用 <|start_of_user_turn|><|end_of_message|> 等控制词元来让模型知道聊天中发生了什么,但不同的模型训练时使用的控制词元完全不同,这意味着用户需要为他们用的模型分别编写特定的格式化代码。这在当时是一个非常头疼的问题。

最终的解决方案是 聊天模板 - 即,模型会自带一个小小的 Jinja 模板,它能用正确的格式来规范每个模型的聊天格式和控制词元。聊天模板意味着用户能用通用的、与模型无关的方式编写聊天,并信任 Jinja 模板来处理模型格式相关的事宜。

基于此,支持工具使用的一个显而易见的方法就是扩展聊天模板的功能以支持工具。这正是我们所做的,但工具给模板方案带来了许多新的挑战。我们来看看这些挑战以及我们是如何解决它们的吧。希望在此过程中,你能够更深入地了解该方案的工作原理以及如何更好利用它。

将工具传给聊天模板

在设计工具使用 API 时,首要需求是定义工具并将其传递给聊天模板的方式应该直观。我们发现大多数用户的流程是: 首先编写工具函数,然后弄清楚如何据其生成工具定义并将其传递给模型。一个自然而然的想法是: 如果用户可以简单地将函数直接传给聊天模板并让它为他们生成工具定义那就好了。

但问题来了,“传函数”的方式与使用的编程语言极度相关,很多人是通过 JavaScriptRust 而不是 Python 与聊天模型交互的。因此,我们找到了一个折衷方案,我们认为它可以两全其美: 聊天模板将工具定义为 JSON 格式,但如果你传 Python 函数给模板,我们会将其自动转换为 JSON 格式 这就产生了一个漂亮、干净的 API:

def get_current_temperature(location: str):
    """
    Gets the temperature at a given location.

    Args:
        location: The location to get the temperature for
    """
    return 22.0 # bug: Sometimes the temperature is not 22. low priority

tools = [get_current_temperature]

chat = [
    {"role": "user", "content": "Hey, what's the weather like in Paris right now?"}
]

tool_prompt = tokenizer.apply_chat_template(
    chat,
    tools=tools,
    add_generation_prompt=True,
    return_tensors="pt"
)

apply_chat_template 内部, get_current_temperature 函数会被转换成完整的 JSON 格式。想查看生成的格式,可以调用 get_json_schema 接口:

>>> from transformers.utils import get_json_schema

>>> get_json_schema(get_current_weather)
{
    "type": "function",
    "function": {
        "name": "get_current_temperature",
        "description": "Gets the temperature at a given location.",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The location to get the temperature for"
                }
            },
            "required": [
                "location"
            ]
        }
    }
}

如果你更喜欢手动控制或者使用 Python 以外的语言进行编码,则可以将工具组织成 JSON 格式直接传给模板。但是,当你使用 Python 时,你可以无需直接处理 JSON 格式。你仅需使用清晰的 函数名、 准确的 类型提示 以及完整的含 参数文档字符串文档字符串 来定义你的工具函数,所有这些都将用于生成模板所需的 JSON 格式。其实,这些要求本来就已是 Python 最佳实践,你本应遵守,如果你之前已经遵守了,那么无需更多额外的工作,你的函数已经可以用作工具了!

请记住: 无论是从文档字符串和类型提示生成还是手动生成,JSON 格式的准确性,对于模型了解如何使用工具都至关重要。模型永远不会看到该函数的实现代码,只会看到 JSON 格式,因此它们越清晰、越准确越好!

在聊天中调用工具

用户 (以及模型文档

标签:调用,temperature,get,模型,聊天,LLM,工具,统一
From: https://www.cnblogs.com/huggingface/p/18432899

相关文章

  • JVM工具-基础
    Jvm内存1.堆内存(Heap):堆内存是Java中用于存放对象实例的内存区域,几乎所有的对象实例(包括数组)都在这里分配内存。堆内存由垃圾回收器(GarbageCollector,GC)自动管理,程序员不需要手动释放。堆内存可以细分为年轻代(YoungGeneration)、老年代(OldGeneration)和永久代(PermGen,在Java8及......
  • 如何修复user32.dll缺失问题:利用免费DLL修复工具解决电脑报错(全面)
    如何修复user32.dll缺失问题?小编在玩梦幻西游时空手游桌面版时,遇到如上图的系统提示“user32.dll文件丢失或损坏”的错误。这一错误可能导致应用程序无法正常运行,甚至影响系统的稳定性。我立马查询了相关资料,也询问了懂电脑的同时,他们都说有多种方法可以帮助我解决这一问题,包......
  • AI论文写作工具这么选?我试用了3款AI助手,真相令人惊叹
    随着AI技术的迅猛进步,AI论文生成器在辅助学术研究写作方面已日益普及,其神奇效果在圈内传得沸沸扬扬。我很好奇是否真如传闻中的那么神奇,我亲自试用了多款这样的工具,收获了诸多出人意料的发现。希望能为同样对AI论文生成器感兴趣的读者带来全新的启发与认识。面对市面上琳琅满......
  • 便携小工具
    防锁屏.vbs1'先定义一个Shell对象2SetWshShell=WScript.CreateObject("WScript.Shell")34WScript.Sleep50005wshShell.SendKeys"{NUMLOCK}"6WScript.Sleep5007wshShell.SendKeys"{NUMLOCK}"89'设置成正需要接续的......
  • ab压测工具进行流量测试
    可以使用httpd服务携带的httpd-tools工具中的ab小的压测工具进行流量测试,服务端IP为192.168.6.1,并安装httpd服务,测试端安装httpd-tools工具。1、服务端上安装httpd服务[root@localhost~]# yuminstallhttpd-y[root@localhost~]# systemctlstarthttpd[root@localhos......
  • 大型语言模型(LLM)将彻底改变软件工程师编写代码的方式
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • AgentLite 一个轻量级LLM Agent框架
    一些初步的想法AI代理的核心架构开始趋于稳定,开发人员似乎更关注实践上。AI代理将扩展其功能,特别是在视觉探索、网页浏览和移动操作系统集成等领域。Salesforce似乎正在大力推动其在AI代理研究方面的进步,特别是关注大型动作模型及其开发框架。比较开发框架本质上是具有......
  • 影刀自动化工具分享---亿企查自动化
    亿企查自动化附上影刀教学和下载链接影刀学院(yingdao.com)亿企查自动化是亿企查平台提供的一项服务,它旨在通过自动化技术帮助用户高效地管理和查询企业信息。以下是亿企查自动化的主要功能及其优点:主要功能1.批量企业信息查询:亿企查自动化允许用户同时查询多个企业的......
  • Centos下安装Docker集群管理工具Shipyard
     一、DockerShipyard是什么?shipyard是一个开源的docker管理平台,其特性主要包括:1支持镜像管理、容器管理。2支持控制台命令3容器资源消耗监控4支持集群swarm,可以随意增加节点5支持控制用户管理权限,可以设置某个容器对某个用户只读、管理权限。6有汉化版缺点:1不支持i......
  • 安装memcache集群管理工具
    安装memcache集群管理工具magent一、安装libeventtarxflibevent-2.0.20-stable.tar.gzcdlibevent-2.0.20./configure--prefix=/usr/local/libeventmake&&makeinstallecho"/usr/local/libevent/lib">/etc/ld.so.conf.d/libevent.confldco......