思维树 (ToT) 示例
思维树 (ToT) 是一种使用大型语言模型 (LLM) 进行查询的链式结构,使用了思维树技术。这是基于论文 "Large Language Model Guided Tree-of-Thought"。
from langchain.llms import OpenAI
llm = OpenAI(temperature=1, max_tokens=512, model="text-davinci-003")
/Users/harrisonchase/.pyenv/versions/3.9.1/envs/langchain/lib/python3.9/site-packages/deeplake/util/check_latest_version.py:32: UserWarning: A newer version of deeplake (3.6.13) is available. It's recommended that you update to the latest version using `pip install -U deeplake`.
warnings.warn(
sudoku_puzzle = "3,*,*,2|1,*,3,*|*,1,*,3|4,*,*,1"
sudoku_solution = "3,4,1,2|1,2,3,4|2,1,4,3|4,3,2,1"
problem_description = f"""
{sudoku_puzzle}
- 这是一个4x4数独谜题。
- * 代表待填充的单元格。
- | 字符分隔行。
- 在每一步中,用数字1-4替换一个或多个 *。
- 任何行、列或2x2子网格中都不能有重复的数字。
- 保留先前有效思维中已知的数字。
- 每个思维可以是部分或最终解决方案。
""".strip()
print(problem_description)
3,*,*,2|1,*,3,*|*,1,*,3|4,*,*,1
- 这是一个4x4数独谜题。
- * 代表待填充的单元格。
- | 字符分隔行。
- 在每一步中,用数字1-4替换一个或多个 *。
- 任何行、列或2x2子网格中都不能有重复的数字。
- 保留先前有效思维中已知的数字。
- 每个思维可以是部分或最终解决方案。
基于规则的检查器
每个思维都由思维检查器评估,并被赋予有效性类型:有效、无效或部分。一个简单的检查器可以基于规则。例如,在数独谜题的情况下,检查器可以检查谜题是否有效、无效或部分。
在下面的代码中,我们为一个特定的4x4数独谜题实现了一个简单的基于规则的检查器。
from typing import Tuple
from langchain_experimental.tot.checker import ToTChecker
from langchain_experimental.tot.thought import ThoughtValidity
import re
class MyChecker(ToTChecker):
def evaluate(self, problem_description: str, thoughts: Tuple[str, ...] = ()) -> ThoughtValidity:
last_thought = thoughts[-1]
clean_solution = last_thought.replace(" ", "").replace('"', "")
regex_solution = clean_solution.replace("*", ".").replace("|", "\\|")
if sudoku_solution in clean_solution:
return ThoughtValidity.VALID_FINAL
elif re.search(regex_solution, sudoku_solution):
return ThoughtValidity.VALID_INTERMEDIATE
else:
return ThoughtValidity.INVALID
只是测试上面的 MyChecker 类:
checker = MyChecker()
assert checker.evaluate("", ("3,*,*,2|1,*,3,*|*,1,*,3|4,*,*,1",)) == ThoughtValidity.VALID_INTERMEDIATE
assert checker.evaluate("", ("3,4,1,2|1,2,3,4|2,1,4,3|4,3,2,1",)) == ThoughtValidity.VALID_FINAL
assert checker.evaluate("", ("3,4,1,2|1,2,3,4|2,1,4,3|4,3,*,1",)) == ThoughtValidity.VALID_INTERMEDIATE
assert checker.evaluate("", ("3,4,1,2|1,2,3,4|2,1,4,3|4,*,3,1",)) == ThoughtValidity.INVALID
思维树链
初始化并运行思维树链,将最大交互次数 k
设置为 30
,最大子思维数 c
设置为 8
。
from langchain_experimental.tot.base import ToTChain
tot_chain = ToTChain(llm=llm, checker=MyChecker(), k=30, c=5, verbose=True, verbose_llm=False)
tot_chain.run(problem_description=problem_description)
> 进入新的思维树链...
开始 ToT 解决过程。
/Users/harrisonchase/workplace/langchain/libs/langchain/langchain/chains/llm.py:275: UserWarning: The predict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.
warnings.warn(
思维:3*,*,2|1*,3,*|*,1,*,3|4,*,*,1
思维:3*,1,2|1*,3,*|*,1,*,3|4,*,*,1
思维:3*,1,2|1*,3,4|*,1,*,3|4,*,*,1
思维:3*,1,2|1*,3,4|*,1,2,3|4,*,*,1
思维:3*,1,2|1*,3,4|2,1,*,3|4,*,*,1
类型 <enum 'ThoughtValidity'> 不可序列化
思维:3,*,*,2|1,*,3,*|*,1,*,3|4,1,*,*
思维:3,*,*,2|*,3,2,*|*,1,*,3|4,1,*,*
思维:3,2,*,2|1,*,3,*|*,1,*,3|4,1,*,*
思维:3,2,*,2|1,*,3,*|1,1,*,3|4,1,*,*
思维:3,2,*,2|1,1,3,*|1,1,*,3|4,1,*,*
思维:3,*,*,2|1,2,3,*|*,1,*,3|4,*,*,1
思维:3,1,4,2|1,2,3,4|2,1,4,3|4,3,2,1
思维:3,4,1,2|1,2,3,4|2,1,4,3|4,3,2,1
> 完成链。
'3,4,1,2|1,2,3,4|2,1,4,3|4,3,2,1'