TOT(思维树)实战案例

TOT

ToT是一种解决复杂问题的框架,它在需要多步骤推理的任务中,引导语言模型搜索一棵由连贯的语言序列(解决问题的中间步骤)组成的思维树,而不是简单地生成一个答案。ToT框架的核心思想是:让模型生成和评估其思维的能力,并将其与搜索算法(如广度优先搜索和深度优先搜索)结合起来,进行系统性地探索和验证。

ToT 框架为每个任务定义具体的思维步骤和每个步骤的候选项数量。例如,要解决一个数学推理任务,先把它分解为3个思维步骤,并为每个步骤提出多个方案,并保留最优的5个候选方案。然后在多条思维路径中搜寻最优的解决方案。

这种方法的优势在于,模型可以通过观察和评估其自身的思维过程,更好地解决问题,而不仅仅是基于输入生成输出。这对于需要深度推理的复杂任务非常有用。此外,通过引入强化学习、集束搜索等技术,可以进一步提高搜索策略的性能,并让模型在解决新问题或面临未知情况时有更好的表现。

执行流程

请添加图片描述

代码

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate

load_dotenv()

llm = ChatOpenAI(
    temperature=0,
    model=os.environ.get("OPEN_API_MODEL"),
    api_key=os.environ.get("OPEN_API_KEY"),
    base_url=os.environ.get("OPEN_API_BASE"),
)

example = """
    例子:对于一个复杂的函数,添加详细描述其功能、参数和返回值的注释。
    ```javascript
    /**
     * 处理用户数据并返回结果
     * @param {Object} userData - 用户数据对象
     * @returns 处理后的用户数据
     */
    function processUserData(userData) {
      // ...代码实现...
    }
    ```
"""

system_tot_template = """
    模拟三位才华横溢、逻辑严谨的前端专家共同为代码添加注释,三位专家分别是 资深React开发专家、资深TypeScript开发专家、资深JSDoc注释专家。
    每位专家都实时详细地解释自己添加注释的思考过程,同时考虑他人之前的解释,并公开承认错误。
    在每一步,只要有可能,每位专家都会完善并基于他人的想法进行拓展,认可他们的贡献。
    他们会持续进行,直到得出问题的明确答案。
"""

system_template = """
    你是码注释专家, 你的目标是帮助用户为前端代码添加详细注释,以辅助初学者理解代码逻辑,同时保持代码的可读性和专业性。
    要求:必须使用JSDoc标准格式进行注释,不添加类型说明,优化现有注释,避免重复注释,注释位置需在代码上方,使用中文作为注释语言,注释后的代码需放入代码块中。
    输出:
        1. 注释后的代码块,不包含其他文本或Markdown语法。
        2. 输出三位专家的思考以及注释添加的过程。
    工作流:
        1. 阅读并理解提供的代码段。
        2. 根据JSDoc标准,为代码添加适当的注释。
        3. 优化现有注释,去除不必要的类型说明和重复内容。
        4. 确保注释位于代码上方,并使用中文。
        5. 将注释后的代码放入代码块中,以便复制使用。
    {data}
"""

human_tempalte = "需要添加注释的代码是:{code}"

system_tot_prompt = SystemMessagePromptTemplate.from_template(system_tot_template)
system_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_prompt = HumanMessagePromptTemplate.from_template(human_tempalte)

chat_prompt = ChatPromptTemplate(messages=[system_tot_prompt, system_prompt, human_prompt])

human_input="""
    export const useUserhBaseInfo = () => {
        const [userhBaseInfo, setIUserhBaseInfo] = useState<IUserhBaseInfo>();
        
        useEffect(() => {
            fetUserhPrivilege();
        }, []);
        
        const fetUserhPrivilege = async () => {
            const { flag, data } = await getUserhBaseInfo();
            if (flag === 1) {
                setIUserhBaseInfo(data);
            }
        };
        
        return [userhBaseInfo];
    };
"""

chain = chat_prompt | llm

result = chain.invoke({"data": example, "code": human_input})

print(result.content)

输出结果

/**
 * 自定义Hook,用于获取并管理用户的基本信息
 * @returns 包含用户基本信息的数组
 */
export const useUserhBaseInfo = () => {
    /**
     * 用户基本信息的状态
     */
    const [userhBaseInfo, setIUserhBaseInfo] = useState<IUserhBaseInfo>();

    /**
     * 在组件挂载时,调用获取用户权限的函数
     */
    useEffect(() => {
        fetUserhPrivilege();
    }, []);

    /**
     * 异步函数,用于获取用户的基本信息并更新状态
     */
    const fetUserhPrivilege = async () => {
        const { flag, data } = await getUserhBaseInfo();
        if (flag === 1) {
            setIUserhBaseInfo(data);
        }
    };

    return [userhBaseInfo];
};
### 三位专家的思考以及注释添加的过程:

1. **资深React开发专家**:
   - 首先,我注意到这是一个自定义Hook,用于获取并管理用户的基本信息。因此,我在函数上方添加了一个注释,描述了这个Hook的主要功能。
   - 接着,我解释了`useState`的作用,即用于管理用户基本信息的状态。
   - 然后,我解释了`useEffect`的作用,即在组件挂载时调用获取用户权限的函数。
   - 最后,我解释了`fetUserhPrivilege`函数的作用,即异步获取用户的基本信息并更新状态。

2. **资深TypeScript开发专家**:
   - 我注意到代码中使用了`IUserhBaseInfo`作为`useState`的泛型参数,这表明`userhBaseInfo`是一个特定类型的对象。虽然JSDoc不要求类型说明,但我在注释中提到了状态的类型,以便更好地理解代码。
   - 我还注意到`fetUserhPrivilege`函数返回的是一个Promise,因此在注释中强调了这是一个异步函数。

3. **资深JSDoc注释专家**:
   - 我检查了所有注释,确保它们符合JSDoc标准,并且没有重复的内容。
   - 我优化了注释的位置,确保它们位于代码上方,并且使用了中文。
   - 我还确保注释简洁明了,避免不必要的类型说明,同时保持了代码的可读性和专业性。

通过三位专家的共同努力,我们为这段代码添加了详细且专业的注释,帮助初学者更好地理解代码逻辑。

总结

结合上述TOT示例,希望能够加深大家对思维树的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值