当前位置:   article > 正文

思维链(CoT)&思维树(ToT)_cot tot 思维链

cot tot 思维链

一.思维链

示例来自于线上课程所学

  1. from openai import OpenAI
  2. from dotenv import load_dotenv, find_dotenv
  3. _ = load_dotenv(find_dotenv())
  4. client = OpenAI(
  5. api_key=os.getenv("OPENAI_API_KEY"),
  6. base_url=os.getenv("OPENAI_BASE_URL")
  7. )
  8. def get_completion(prompt, model="gpt-4"):
  9. messages = [{"role": "user", "content": prompt}]
  10. response = client.chat.completions.create(
  11. model=model,
  12. messages=messages,
  13. temperature=0,
  14. )
  15. return response.choices[0].message.content
  16. instruction = """
  17. 给定一段用户与手机流量套餐客服的对话,
  18. 你的任务是判断客服介绍产品信息的准确性:
  19. 当向用户介绍流量套餐产品时,客服人员必须准确提及产品名称、月费价格和月流量总量 上述信息缺失一项或多项,或信息与实时不符,都算信息不准确
  20. 已知产品包括:
  21. 经济套餐:月费50元,月流量10G
  22. 畅游套餐:月费180元,月流量100G
  23. 无限套餐:月费300元,月流量1000G
  24. 校园套餐:月费150元,月流量200G,限在校学生办理
  25. """
  26. # 输出描述
  27. output_format = """
  28. 以JSON格式输出。
  29. 如果信息准确,输出:{"accurate":true}
  30. 如果信息不准确,输出:{"accurate":false}
  31. """
  32. context = """
  33. 用户:你们有什么流量大的套餐
  34. 客服:您好,我们现在正在推广无限套餐,每月300元就可以享受1000G流量,您感兴趣吗
  35. """
  36. context2 = """
  37. 用户:有什么便宜的流量套餐
  38. 客服:您好,我们有个经济型套餐,50元每月
  39. """
  40. context3 = """
  41. 用户:流量大的套餐有什么
  42. 客服:我们推荐畅游套餐,180元每月,100G流量,大多数人都够用的
  43. 用户:学生有什么优惠吗
  44. 客服:如果是在校生的话,可以办校园套餐,150元每月,含200G流量,比非学生的畅游套餐便宜流量还多
  45. """
  46. prompt = f"""
  47. {instruction}
  48. {output_format}
  49. 请一步一步分析以下对话
  50. 对话记录:
  51. {context3}
  52. """
  53. response = get_completion(prompt)
  54. print(response)

添加“请一步一步分析”:

不添加“请一步一步分析”:

(1)exp1

(2)exp2

实践体会:

(1)个人觉得思维链这种技巧,在高级的模型上体现不明显,不使用"请一步一步分析",使用gpt-4模型在绝大多数情况下一样会返回true,使用gpt3.5少数情况下不使用思维链也会返回true(在较初级的模型上可能结合思维链效果体现的明显

(2)实践结果确实体现出思维链的作用,即可以使AI把问题分解成多个步骤,然后逐步解决,输出的结果更加准确。因为如图所示使用“请一步一步分析”之后,模型会更加详细的解释true/false的原因,如果不使用CoT,绝大多数情况下只有true/false,不会说明判定的具体原因

(3)推测是大概模型随着更新迭代,已经自动适应了思维链这种模式,因为在使用gpt-3.5-turbo时,我没有添加“一步一步分析”,模型主动采用了这种方式

二.自洽性(CoT self-consistency)

很多情况下,模型的输出会变化,可以通过同样的prompt跑多次,以投票的方式取结果

  1. from openai import OpenAI
  2. from dotenv import load_dotenv, find_dotenv
  3. _ = load_dotenv(find_dotenv())
  4. client = OpenAI(
  5. api_key=os.getenv("OPENAI_API_KEY"),
  6. base_url=os.getenv("OPENAI_BASE_URL")
  7. )
  8. def get_completion(prompt, model="gpt-3.5-turbo"):
  9. messages = [{"role": "user", "content": prompt}]
  10. response = client.chat.completions.create(
  11. model=model,
  12. messages=messages,
  13. temperature=0.8 # 必须加大随机性
  14. )
  15. return response.choices[0].message.content
  16. instruction = """
  17. 给定一段用户与手机流量套餐客服的对话,
  18. 你的任务是判断客服介绍产品信息的准确性:
  19. 当向用户介绍流量套餐产品时,客服人员必须准确提及产品名称、月费价格和月流量总量 上述信息缺失一项或多项,或信息与实时不符,都算信息不准确
  20. 已知产品包括:
  21. 经济套餐:月费50元,月流量10G
  22. 畅游套餐:月费180元,月流量100G
  23. 无限套餐:月费300元,月流量1000G
  24. 校园套餐:月费150元,月流量200G,限在校学生办理
  25. """
  26. # 输出描述
  27. output_format = """
  28. 以JSON格式输出。
  29. 如果信息准确,输出:{"accurate":true}
  30. 如果信息不准确,输出:{"accurate":false}
  31. """
  32. context = """
  33. 用户:流量大的套餐有什么
  34. 客服:我们推荐畅游套餐,180元每月,100G流量,大多数人都够用的
  35. 用户:学生有什么优惠吗
  36. 客服:如果是在校生的话,可以办校园套餐,150元每月,含200G流量
  37. """
  38. # 连续调用 5 次
  39. for _ in range(5):
  40. prompt = f"{instruction}\n\n{output_format}\n\n请一步一步分析:\n{context}"
  41. print(f"------第{_+1}次------")
  42. response = get_completion(prompt)
  43. print(response)

三.思维树(gpt3.5性能不足以支持)

案例:指标解读,项目推荐并说明依据

小明 100 米跑成绩:10.5 秒,1500 米跑成绩:3 分 20 秒,铅球成绩:12 米。他适合参加哪些搏击运动训练。

  1. import json
  2. from openai import OpenAI
  3. from dotenv import load_dotenv, find_dotenv
  4. _ = load_dotenv(find_dotenv())
  5. client = OpenAI(
  6. api_key=os.getenv("OPENAI_API_KEY"),
  7. base_url=os.getenv("OPENAI_BASE_URL")
  8. )
  9. def get_completion(prompt, model="gpt-4", temperature=0):
  10. messages = [{"role": "user", "content": prompt}]
  11. response = client.chat.completions.create(
  12. model=model,
  13. messages=messages,
  14. temperature=temperature # 模型输出的随机性,0 表示随机性最小
  15. )
  16. return response.choices[0].message.content
  17. def performance_analyser(text):
  18. prompt = f"{text}\n请根据以上成绩,分析候选人在速度、耐力、力量三方面素质的分档。分档包括:强(3),中(2),弱(1)三档。\
  19. \n以JSON格式输出,其中key为素质名,value为以数值表示的分档。"
  20. response = get_completion(prompt)
  21. return json.loads(response)
  22. def possible_sports(talent, category):
  23. prompt = f"需要{talent}强的{category}运动有哪些。给出10个例子,以array形式输出。确保输出能由json.loads解析。"
  24. response = get_completion(prompt, temperature=0.8)
  25. return json.loads(response)
  26. def evaluate(sports, talent, value):
  27. prompt = f"分析{sports}运动对{talent}方面素质的要求: 强(3),中(2),弱(1)。\
  28. \n直接输出挡位数字。输出只包含数字。"
  29. response = get_completion(prompt)
  30. val = int(response)
  31. print(f"{sports}: {talent} {val} {value>=val}")
  32. return value >= val
  33. def report_generator(name, performance, talents, sports):
  34. level = ['弱', '中', '强']
  35. _talents = {k: level[v-1] for k, v in talents.items()}
  36. prompt = f"已知{name}{performance}\n身体素质:{_talents}。\n生成一篇{name}适合{sports}训练的分析报告。"
  37. response = get_completion(prompt, model="gpt-3.5-turbo")
  38. return response
  39. name = "小明"
  40. performance = "100米跑成绩:10.5秒,1500米跑成绩:3分20秒,铅球成绩:12米。"
  41. category = "搏击"
  42. talents = performance_analyser(name+performance)
  43. print("===talents===")
  44. print(talents)
  45. cache = set()
  46. # 深度优先
  47. # 第一层节点
  48. for k, v in talents.items():
  49. if v < 3: # 剪枝
  50. continue
  51. leafs = possible_sports(k, category)
  52. print(f"==={k} leafs===")
  53. print(leafs)
  54. # 第二层节点
  55. for sports in leafs:
  56. if sports in cache:
  57. continue
  58. cache.add(sports)
  59. suitable = True
  60. for t, p in talents.items():
  61. if t == k:
  62. continue
  63. # 第三层节点
  64. if not evaluate(sports, t, p): # 剪枝
  65. suitable = False
  66. break
  67. if suitable:
  68. report = report_generator(name, performance, talents, sports)
  69. print("****")
  70. print(report)
  71. print("****")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/732355
推荐阅读
相关标签
  

闽ICP备14008679号