落地大模型应知必会 (3): 如何构建多任务的 LLM 应用
编者按:今年以来,大语言模型(LLM)已被广泛应用于各种自然语言处理任务,也越来越多地被用于构建复杂的语言应用。但是构建多任务的 LLM 应用仍面临一定的挑战,需要解决任务组合和调控等问题。
本文内容介绍了构建多任务 LLM 应用可能涉及的方方面面,包括如何设计并使用控制流程,如何测试代理等,对于那些希望设计出好用、功能强大的 LLM 应用的读者而言,本文将是非常有价值的学习资料,读者可以通过本文对该领域有一个初步的了解。
以下是译文,Enjoy!
作者 | Chip Huyen
编译 | 岳扬
本文重点讨论如何使用控制流程(例如 if 语句、for 循环)来组合多个任务,并结合工具(例如 SQL 执行器、bash、Web 浏览器、第三方 API)来创建更复杂和强大的 LLM 应用程序。
01 多任务组成的应用程序
大多数 LLM 应用程序都比较复杂,例如在“与数据对话”的应用场景下,我们会需要通过自然语言连接并查询数据库。如果需要操作一张信用卡交易表,您可以会问:“凤凰城 (Phoenix) 有多少家不同的商户,他们的名字是什么?” 数据库就会返回:“凤凰城 (Phoenix) 有 9 家不同的商户,它们是......”。
实现这个“与数据对话”场景的应用程序一般通过执行以下任务序列进行:
Task 1:将来自用户输入的自然语言转换为 SQL 查询语句 [LLM]
Task 2:在数据库中执行 SQL 查询语句 [SQL 执行器]
Task 3:将 SQL 语句查询结果转换为自然语言展示给用户 [LLM]
02 Agents, tools, and control flows 代理、工具和控制流程
我在网上进行了一项小调查,目前似乎对这几个专业术语的定义还没有达成共识。
Agent 这个词已经被广泛使用,指的是可以根据给定的控制流程执行多个任务(参见 2.2 控制流程部分)的应用程序。每一个任务可以利用一种或多种工具。在上述例子中,SQL 执行器就是一种工具。
注:有人抵制在本文所描述的内容中使用代理(agent)这个术语,因为它在其他领域内已经被过度使用(例如,用代理(agent)来指代强化学习[1]中的策略(policy))。
2.1 工具与插件
除了 SQL 执行器(SQL executor)之外,还有很多用于完成任务的工具,比如:
搜索工具(例如使用 Google Search API 或 Bing API 进行搜索)
互联网浏览器(例如,给定一个 URL,能够获取其内容)
bash executor(译者注:用于执行 Bash 命令或脚本的工具,可以执行各种任务,例如文件操作、进程管理、系统配置等。)
计算器
工具和插件基本上是相同东西的两种说法。我们可以将插件视为贡献到 OpenAI 插件商店中的工具。截至目前(译者注:文章发表时间为 2023 年 4 月 11 日),OpenAI 插件尚未向公众开放,但任何人都可以创建和使用工具。
2.2 控制流程:顺序、并行、条件语句、循环(sequential, parallel, if, for loop)
在上述示例中,使用的控制流程是顺序(sequential),在该流程之中,一个任务接着另一个任务之后执行。还有其他类型的控制流程,例如并行、条件语句、循环。
顺序:在任务 A 完成后执行任务 B,可能是因为任务 B 依赖于任务 A。例如,只有在从用户输入翻译成 SQL 查询语句之后,才能执行该 SQL 查询语句。
并行:同时执行任务 A 和任务 B。
条件语句:根据用户的输入选择执行任务 A 或任务 B。
循环:重复执行任务 A,直到满足特定条件。例如,使用浏览器获取某一个网页内容,并继续使用浏览器获取该网页中其他链接的内容,直到代理认为已经获得足够的信息来回答用户的问题为止。
注意:虽然并行确实用处很大,但我还没有看到很多使用这种控制流程的应用程序。
2.3 使用 LLM agents 的控制流程
在传统的软件工程中,控制流程(control flows)的条件是精确的。而在 LLM 应用程序(也称为 agent)中,条件也可能可以通过 prompt 来确定。(译者注:该句的“条件”原文是 conditions,此处指确定在执行控制流程中的哪个分支或操作时所需满足的特定情况或规则。)
例如,如果你想要 LLM agents 在搜索工具(search)、SQL 执行器(SQL executor)和聊天工具(Chat) 三个操作之间进行选择,可以像如下的输入内容那样进行解释,告诉它如何选择其中一个操作,如下所示(非常粗略)。换句话说,您可以使用 LLM 来决定控制流程的条件!
You have access to three tools: Search, SQL executor, and Chat.
Search is useful when users want information about current events or products.
SQL executor is useful when users want information that can be queried from a database.
Chat is useful when users want general information.
Provide your response in the following format:
Input: { input }
Thought: { thought }
Action: { action }
Action Input: { action_input }
Observation: { action_output }
Thought: { thought }
您可以使用三个工具:搜索工具(search)、SQL 执行器(SQL executor)和聊天工具(Chat)。
当用户想要获取有关当前事件或产品的信息时,搜索工具在这个场景下非常有用。
当用户想要从数据库中查询信息时,应当使用 SQL 执行器。
当用户想要获取基本信息时,建议使用聊天工具。
请用以下格式进行回答:
Input: { input }
Thought: { thought }
Action: { action }
Action Input: { action_input }
Observation: { action_output }
Thought: { thought }
2.4 Testing an agent 测试代理
要使代理(agent)可靠,我们就需要在组合所有任务之前分别单独构建和测试它们。存在两种主要的故障模式:
1) 一个或多个任务测试失败。 可能的原因包括:
控制流程错误:选择了非可选的操作
一个或多个任务产生了错误的结果
2) 所有任务产生了正确的结果,但整体解决方案是不正确的。 Press 等人(2022 年)将这种情况称为“composability gap[2]”:在模型正确回答所有子问题的前提下,从中错误回答了组合性问题的比例。
与软件工程一样,我们可以并且应该对每个组件以及控制流程进行单元测试。可以为每个组件定义成对的评估示例(pairs of as evaluation examples),每次更新 prompt 或控制流程时都可以用它们来评估应用程序。还可以对整个应用程序进行集成测试。成对的评估示例格式如下:(input, expected output)。
END
参考资料
1.https://en.wikipedia.org/wiki/Reinforcement_learning
2.https://ofir.io/self-ask.pdf
本文经原作者授权,由 Baihai IDP 编译。如需转载译文,请联系获取授权。
原文链接:
https://huyenchip.com/2023/04/11/llm-engineering.html
推荐阅读:
版权声明: 本文为 InfoQ 作者【Baihai IDP】的原创文章。
原文链接:【http://xie.infoq.cn/article/ac343a4885206010f84ca4164】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论