首先还是一张图给出 GoT(思维图)的大致原理,后面在管中窥豹的讲一下其复杂实现:
GoT 摘要
论文 PDF:https://arxiv.org/pdf/2308.09687v2.pdf[1] 网站和代码:https://github.com/spcl/graph-of-thoughts[2]
思维图(GoT)框架,可以提高大型语言模型(LLM)中的提示能力, 使其超越思维链或思维树(ToT)等范式所提供的能力。GoT 的关键思维和主要优点是能够将 LLM 生成的信息建模为任意图, 其中信息单位(「LLM 思维」)是顶点,边对应于这些顶点之间的依赖关系。
这种方法可以将任意的 LLM 思维组合成协同结果,提炼整个思维网络的本质,或使用反馈循环增强思维。
GoT 在不同任务上比现有技术具有优势,例如,与 ToT 相比,排序质量提高了 62%,同时降低了 31% 的成本。
GoT 可通过新的思维转变进行扩展,从而可用于引领新的提示方案,使 LLM 的推理更接近人类思维或递归等大脑机制,两者都形成了复杂的网络。
思维图和思维树的对比
我们先看一下下面的对比图,ToT 和 GoT 的区别主要如下:
• 思维图的思维可以回溯
• 图的思维链条可以交叉,而树不会
背景
大型语言模型 (LLM) 正在接管人工智能世界。近年来,主要基于仅解码器的 Transformer 变体的模型得到了快速发展,例如GPT、 PaLM 或LLaMA。
提示工程是解决不同 LLM 任务的一种资源高效的方法。简而言之,在发送给 LLM 的输入中包含任务描述。如果这个描述被适当地表述,LLM 将使用其基于自回归标记的机制来生成文本来解决该任务。
原理
通过使 LLM 思维形成任意图形结构,可以从根本上实现更强大的提示。这是由人类推理、大脑结构或算法执行等多种现象推动的。当研究一个新想法时,人类不仅会遵循一系列思维(如 CoT)或尝试不同的独立思维(如 ToT),而且实际上会形成一个更复杂的思维网络。
模仿大脑的思考过程
人们可以探索某个推理链,回溯并开始一个新的推理链, 然后意识到前一个推理链中的某个想法可以与当前探索的想法相结合,并将它们合并成一个新的解决方案,利用他们的优点并消除他们的缺点。同样,大脑形成复杂的网络,具有类似图形的模式,例如循环。
上面这个类似人类的思维模式不能够由 CoT、ToT 来完成。
GoT 的想法
在GoT中,LLM思维被建模为顶点,而边是这些思维之间的依赖关系。使用 GoT,人们可以通过构造具有多个传入边的顶点来聚合任意想法。总体而言,GoT 利用的图形抽象无缝地将 CoT 和 ToT 概括为更复杂的思维模式, 而无需诉诸任何模型更新。
设计挑战
将 GoT 付诸实践需要解决一些设计挑战,比如:
• 针对不同任务的最佳图结构是什么?
• 如何最好地聚合想法以最大限度地提高准确性并最大限度地降低成本?
实现
作者如何设计了一个用于实现 GoT 的模块化架构?
首先,对个人想法进行细粒度的控制。这使我们能够完全控制与 LLM 正在进行的对话,并应用先进的思维转变,例如将正在进行的推理中最有前途的想法结合到新的想法中。
例如,在写作中,人们可以将几篇输入文章合并成一个连贯的摘要。在排序时,可以将多个已排序的数字子数组合并为最终的已排序数组。
其次,确保我们的架构可以通过新颖的思维转换、推理模式(即思维图)和 LLM 模型无缝扩展。这使得能够使用 GoT 快速构建新颖的提示想法原型,同时尝试不同的模型,例如 GPT-3.5、GPT-4 或 Llama-2 。
架构
用户可以直接将设计扩展到新的提示方案,尝试新颖的思维转变,并插入不同的 LLM 。图中的蓝色部分包含架构概述,绿色部分列出了 API 。
GoT架构由一组交互的模块组成,上图(蓝色部分)。这些模块是提示器(为 LLM 准备消息)、解析器(从 LLM 回复中提取信息)、 评分模块(验证 LLM 回复并对其进行评分)和控制器(协调整个推理过程,并决定如何进展)。
控制器包含两个更重要的元素:操作图(GoO)和图推理状态(GRS)。
GoO 是一个静态结构,指定给定任务的图分解,即它规定了应用于 LLM 思维的转换,以及它们的顺序和依赖性。 GRS 是一个动态结构,可维持正在进行的 LLM 推理过程的状态(其思维及其状态的历史)。
示例
下图展示了一个示例提示以及 GRS(Graph Reasoning State) 和所涉及的操作。
性能
GoT 与 ToT 在所有考虑的问题实例中,GoT 比 ToT 和 ToT2 有了很大的改进。ToT 通常比 ToT2 具有更高的质量,但同时成本也更高。GoT 的成本始终低于 ToT,并且与 ToT2 相当(在某些情况下较低,在其他情况下较高)。
安装运行
我们可以在 Github 上下载 GoT 的代码安装:
git clone https://github.com/spcl/graph-of-thoughts.git
cd graph-of-thoughts
pip install -e .
也可以直接使用 pip 安装:
pip install graph_of_thoughts
然后拷贝 config_template.json 重命名为 config.json,进行配置,比如 ChatGPT:
{
"chatgpt" : {
"model_id": "gpt-3.5-turbo",
"prompt_token_cost": 0.0015,
"response_token_cost": 0.002,
"temperature": 1.0,
"max_tokens": 1536,
"stop": null,
"organization": "",
"api_key": ""
},
或者 Llama 本地模型:
"llama7b-hf" : {
"model_id": "Llama-2-7b-chat-hf",
"cache_dir": "/llama",
"prompt_token_cost": 0.0,
"response_token_cost": 0.0,
"temperature": 0.6,
"top_k": 10,
"max_tokens": 4096
},
指定使用对应的模型:
lm = controller.ChatGPT("config.json", model_name="chatgpt")
完整的代码示例:
from examples.sorting.sorting_032 import SortingPrompter, SortingParser, got, utils
from graph_of_thoughts import controller, operations
# Problem input
to_be_sorted = "[0, 2, 6, 3, 8, 7, 1, 1, 6, 7, 7, 7, 7, 9, 3, 0, 1, 7, 9, 1, 3, 5, 1, 3, 6, 4, 5, 4, 7, 3, 5, 7]"
# Retrieve the Graph of Operations
gop = got()
# Configure the Language Model (Assumes config.json is in the current directory with OpenAI API key)
lm = controller.ChatGPT("config.json", model_name="chatgpt")
# Create the Controller
ctrl = controller.Controller(
lm,
gop,
SortingPrompter(),
SortingParser(),
# The following dictionary is used to configure the initial thought state
{
"original": to_be_sorted,
"current": "",
"phase": 0,
"method": "got"
}
)
# Run the Controller and generate the output graph
ctrl.run()
ctrl.output_graph("output_got.json")
结语
图抽象是过去几十年来计算和人工智能领域一些成功设计的基础, 在提示工程里使用「图」也必然是一个趋势。
引用链接
[1]: https://arxiv.org/pdf/2308.09687v2.pdf[2]: https://github.com/spcl/graph-of-thoughts
--- END ---

