赞
踩
一.思维链
示例来自于线上课程所学
- from openai import OpenAI
- from dotenv import load_dotenv, find_dotenv
- _ = load_dotenv(find_dotenv())
-
- client = OpenAI(
- api_key=os.getenv("OPENAI_API_KEY"),
- base_url=os.getenv("OPENAI_BASE_URL")
- )
-
- def get_completion(prompt, model="gpt-4"):
- messages = [{"role": "user", "content": prompt}]
- response = client.chat.completions.create(
- model=model,
- messages=messages,
- temperature=0,
- )
- return response.choices[0].message.content
-
- instruction = """
- 给定一段用户与手机流量套餐客服的对话,
- 你的任务是判断客服介绍产品信息的准确性:
- 当向用户介绍流量套餐产品时,客服人员必须准确提及产品名称、月费价格和月流量总量 上述信息缺失一项或多项,或信息与实时不符,都算信息不准确
- 已知产品包括:
- 经济套餐:月费50元,月流量10G
- 畅游套餐:月费180元,月流量100G
- 无限套餐:月费300元,月流量1000G
- 校园套餐:月费150元,月流量200G,限在校学生办理
- """
-
- # 输出描述
- output_format = """
- 以JSON格式输出。
- 如果信息准确,输出:{"accurate":true}
- 如果信息不准确,输出:{"accurate":false}
- """
-
- context = """
- 用户:你们有什么流量大的套餐
- 客服:您好,我们现在正在推广无限套餐,每月300元就可以享受1000G流量,您感兴趣吗
- """
-
- context2 = """
- 用户:有什么便宜的流量套餐
- 客服:您好,我们有个经济型套餐,50元每月
- """
-
- context3 = """
- 用户:流量大的套餐有什么
- 客服:我们推荐畅游套餐,180元每月,100G流量,大多数人都够用的
- 用户:学生有什么优惠吗
- 客服:如果是在校生的话,可以办校园套餐,150元每月,含200G流量,比非学生的畅游套餐便宜流量还多
- """
-
- prompt = f"""
- {instruction}
- {output_format}
- 请一步一步分析以下对话
- 对话记录:
- {context3}
- """
- response = get_completion(prompt)
- 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跑多次,以投票的方式取结果
- from openai import OpenAI
- from dotenv import load_dotenv, find_dotenv
- _ = load_dotenv(find_dotenv())
-
- client = OpenAI(
- api_key=os.getenv("OPENAI_API_KEY"),
- base_url=os.getenv("OPENAI_BASE_URL")
- )
-
- def get_completion(prompt, model="gpt-3.5-turbo"):
- messages = [{"role": "user", "content": prompt}]
- response = client.chat.completions.create(
- model=model,
- messages=messages,
- temperature=0.8 # 必须加大随机性
- )
- return response.choices[0].message.content
-
-
- instruction = """
- 给定一段用户与手机流量套餐客服的对话,
- 你的任务是判断客服介绍产品信息的准确性:
- 当向用户介绍流量套餐产品时,客服人员必须准确提及产品名称、月费价格和月流量总量 上述信息缺失一项或多项,或信息与实时不符,都算信息不准确
- 已知产品包括:
- 经济套餐:月费50元,月流量10G
- 畅游套餐:月费180元,月流量100G
- 无限套餐:月费300元,月流量1000G
- 校园套餐:月费150元,月流量200G,限在校学生办理
- """
-
- # 输出描述
- output_format = """
- 以JSON格式输出。
- 如果信息准确,输出:{"accurate":true}
- 如果信息不准确,输出:{"accurate":false}
- """
-
- context = """
- 用户:流量大的套餐有什么
- 客服:我们推荐畅游套餐,180元每月,100G流量,大多数人都够用的
- 用户:学生有什么优惠吗
- 客服:如果是在校生的话,可以办校园套餐,150元每月,含200G流量
- """
-
- # 连续调用 5 次
- for _ in range(5):
- prompt = f"{instruction}\n\n{output_format}\n\n请一步一步分析:\n{context}"
- print(f"------第{_+1}次------")
- response = get_completion(prompt)
- print(response)
三.思维树(gpt3.5性能不足以支持)
小明 100 米跑成绩:10.5 秒,1500 米跑成绩:3 分 20 秒,铅球成绩:12 米。他适合参加哪些搏击运动训练。
- import json
- from openai import OpenAI
- from dotenv import load_dotenv, find_dotenv
- _ = load_dotenv(find_dotenv())
-
- client = OpenAI(
- api_key=os.getenv("OPENAI_API_KEY"),
- base_url=os.getenv("OPENAI_BASE_URL")
- )
-
-
- def get_completion(prompt, model="gpt-4", temperature=0):
- messages = [{"role": "user", "content": prompt}]
- response = client.chat.completions.create(
- model=model,
- messages=messages,
- temperature=temperature # 模型输出的随机性,0 表示随机性最小
- )
- return response.choices[0].message.content
-
- def performance_analyser(text):
- prompt = f"{text}\n请根据以上成绩,分析候选人在速度、耐力、力量三方面素质的分档。分档包括:强(3),中(2),弱(1)三档。\
- \n以JSON格式输出,其中key为素质名,value为以数值表示的分档。"
- response = get_completion(prompt)
- return json.loads(response)
-
-
- def possible_sports(talent, category):
- prompt = f"需要{talent}强的{category}运动有哪些。给出10个例子,以array形式输出。确保输出能由json.loads解析。"
- response = get_completion(prompt, temperature=0.8)
- return json.loads(response)
-
-
- def evaluate(sports, talent, value):
- prompt = f"分析{sports}运动对{talent}方面素质的要求: 强(3),中(2),弱(1)。\
- \n直接输出挡位数字。输出只包含数字。"
- response = get_completion(prompt)
- val = int(response)
- print(f"{sports}: {talent} {val} {value>=val}")
- return value >= val
-
-
- def report_generator(name, performance, talents, sports):
- level = ['弱', '中', '强']
- _talents = {k: level[v-1] for k, v in talents.items()}
- prompt = f"已知{name}{performance}\n身体素质:{_talents}。\n生成一篇{name}适合{sports}训练的分析报告。"
- response = get_completion(prompt, model="gpt-3.5-turbo")
- return response
-
-
- name = "小明"
- performance = "100米跑成绩:10.5秒,1500米跑成绩:3分20秒,铅球成绩:12米。"
- category = "搏击"
-
- talents = performance_analyser(name+performance)
- print("===talents===")
- print(talents)
-
- cache = set()
- # 深度优先
-
- # 第一层节点
- for k, v in talents.items():
- if v < 3: # 剪枝
- continue
- leafs = possible_sports(k, category)
- print(f"==={k} leafs===")
- print(leafs)
- # 第二层节点
- for sports in leafs:
- if sports in cache:
- continue
- cache.add(sports)
- suitable = True
- for t, p in talents.items():
- if t == k:
- continue
- # 第三层节点
- if not evaluate(sports, t, p): # 剪枝
- suitable = False
- break
- if suitable:
- report = report_generator(name, performance, talents, sports)
- print("****")
- print(report)
- print("****")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。