随着大型语言模型(LLMs)如Claude、GPT-3和GPT-4的日益成熟,与它们的互动已经演变成一门精确的科学。创建有效的提示已经成为发挥这些强大工具全部潜力的关键。本文将讨论自洽性这一概念,它正在革新提示工程,并探索其众多好处。
自洽性在提示工程中通过生成多个响应并将它们结合起来,以减少错误,增强LLMs的准确性。提示工程涉及创建精确、清晰的提示,以与GPT-4等AI模型有效沟通。自洽性方法依赖于多个响应有助于识别其中最准确答案的原则。实施自洽性包括创建清晰的提示、生成多个响应、分析它们,并聚合结果。自洽性的益处包括提高准确性、减少异常值的影响,以及更好地处理模糊任务。
以下是将自洽性集成到提示工程工作流程中的步骤:
让通过一些Python和OpenAI API代码示例来查看这些步骤。
安装依赖项:
!pip install openai --upgrade
导入库:
import os from openai import OpenAI
设置API密钥配置:
os.environ["OPENAI_API_KEY"]="Your open-API-Key"
第一步是制作一个定义良好的提示,清楚地传达意图任务或问题。例如:
prompt = """
逐步解决以下数学问题:
一列火车以60公里/小时的速度行驶2小时,然后以80公里/小时的速度行驶1小时。
整个旅程中火车的平均速度是多少?
请将答案四舍五入到小数点后两位,单位为公里/小时。
"""
接下来,将使用OpenAI API基于提示生成多个响应。将创建一个函数来实现这一点:
# 创建客户端
client = OpenAI()
def generate_responses(prompt, n=5):
responses = []
for _ in range(n):
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": prompt,
}
],
model="gpt-3.5-turbo",
)
responses.append(response.choices[0].message.content.strip())
return responses
# 生成5个响应
results = generate_responses(prompt, n=5)
for i, result in enumerate(results):
print(f"响应 {i+1}:\n{result}\n")
现在有了多个响应,需要分析和比较它们。这一步可以根据任务的类型而有所不同。对于数学问题,将从每个响应中提取最终答案并进行比较:
import re
def extract_answer(response):
match = re.search(r'(\d+\.\d+)\s*km/h', response)
if match:
return float(match.group(1))
return None
answers = [extract_answer(response) for response in results]
valid_answers = [answer for answer in answers if answer is not None]
valid_answers
最终,将结合结果以生成最终输出。对于数值响应,可以使用平均值或中位数。在这种情况下,将使用中位数以减少异常值的影响:
import statistics
if valid_answers:
final_answer = statistics.median(valid_answers)
print(f"最一致的答案是:{final_answer:.2f} km/h")
else:
print("无法确定一致的答案。")
以下是自洽性的益处:
尽管简单地应用自洽性是一种强大的策略,但还有一些更复杂的方法可以进一步提高其有效性:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def weighted_aggregation(responses):
# 将响应转换为TF-IDF向量
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(responses)
# 计算成对相似性
similarities = cosine_similarity(tfidf_matrix)
# 根据与其他响应的平均相似性计算权重
weights = similarities.mean(axis=1)
# 提取答案并应用权重
answers = [extract_answer(response) for response in responses]
weighted_answers = [a * w for a, w in zip(answers, weights) if a is not None]
# 计算加权平均值
if weighted_answers:
return sum(weighted_answers) / sum(weights)
return None
final_answer = weighted_aggregation(results)
if final_answer:
print(f"加权平均答案是:{final_answer:.2f} km/h")
else:
print("无法确定一致的答案。")