这里写目录标题
- 示例
- 定义处理输入的函数
- 链式思考提示
- 示例:结构化系统和用户提示
- 获取并展示模型的回答
- 实现内心独白
- 结论与最佳实践
示例
设置环境
在深入实施之前,设置必要的环境至关重要。这包括加载 OpenAI API 密钥并导入相关的 Python 库。以下代码块展示了如何完成这一设置,确保你的环境准备好执行后续的推理任务。
# 导入必要的库
import os
import openai
from dotenv import load_dotenv, find_dotenv
# 加载环境变量,特别是 OpenAI API 密钥
load_dotenv(find_dotenv())
openai.api_key = os.environ['OPENAI_API_KEY']
定义处理输入的函数
核心函数 get_response_for_queries
根据一系列结构化的提示检索模型的回答。此函数封装了向 OpenAI API 发送查询并解析回答的逻辑。
def get_response_for_queries(query_prompts,
model_name="gpt-3.5-turbo",
response_temperature=0, max_response_tokens=500):
"""
根据查询提示获取模型的回答。
参数:
- query_prompts: 包含系统和用户提示的列表。
- model_name: 指定要使用的模型版本。
- response_temperature: 控制模型回答的随机性。
- max_response_tokens: 限制模型回答的长度。
返回:
模型对用户查询的回答。
"""
model_response = openai.ChatCompletion.create(
model=model_name,
messages=query_prompts,
temperature=response_temperature,
max_tokens=max_response_tokens,
)
return model_response.choices[0].message["content"]
链式思考提示
链式思考提示是一种引导模型经过结构化的推理过程,最后得出最终答案的技术。此方法特别适用于那些无法直接给出答案的复杂查询。
示例:结构化系统和用户提示
为了说明链式思考提示的应用,考虑提供详细的产品信息以响应客户的询问的任务。以下示例概述了如何结构化系统和用户提示以促进这一过程。
# 定义分隔符以分离推理步骤
step_delimiter = "####"
# 系统提示引导模型完成推理过程
system_prompt = f"""
按照以下步骤回答客户查询,使用 '{step_delimiter}' 来划分每个步骤。
步骤 1:{step_delimiter} 确定查询是否与特定产品相关而非一般类别。
步骤 2:{step_delimiter} 识别产品是否在列出的项目中,包括品牌、特性、价格等细节。
[在此处提供产品列表]
步骤 3:{step_delimiter} 评估客户对产品比较或规格的假设。
步骤 4:{step_delimiter} 根据提供的产品信息验证这些假设的准确性。
步骤 5:{step_delimiter} 纠正任何误解,只参考列出的产品,并以礼貌的方式回答。
"""
# 示例用户查询
example_query_1 = "BlueWave Chromebook 与 TechPro Desktop 在成本方面如何比较?"
example_query_2 = "是否有电视销售?"
# 为模型构造查询提示
query_prompts_1 = [
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': f"{step_delimiter}{example_query_1}{step_delimiter}"},
]
query_prompts_2 = [
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': f"{step_delimiter}{example_query_2}{step_delimiter}"},
]
获取并展示模型的回答
构造提示后,下一步涉及查询模型并提取其回答的相关部分。这对于以简洁明了的方式向用户提供最终答案至关重要。
# 获取模型对第一个示例查询的回答
response_to_query_1 = get_response_for_queries(query_prompts_1)
print(response_to_query_1)
# 获取模型对第二个示例查询的回答
response_to_query_2 = get_response_for_queries(query_prompts_2)
print(response_to_query_2)
实现内心独白
内心独白技术选择性地呈现最终答案,同时排除推理过程中的中间步骤。这确保用户得到直接的答案而不必处理模型思维过程的复杂性。
以下代码片段展示了如何从模型输出中提取并处理最终的回答,在模型输出使用特定分隔符来分隔推理步骤的情况下尤其有用。此技术在实现内心独白技术时特别有用,确保用户仅看到模型处理过程的必要结论。让我们详细分解代码及其功能。
# 从模型输出中仅提取最终的回答
try:
# 假设模型的回答存储在名为 'response_to_query_2' 的变量中
# 使用 'split' 方法根据 'step_delimiter' 将输出分割成多个段落
# 通过 '[-1]' 选择最后一个项,即所有推理步骤之后的最终回答
final_response = response_to_query_2.split(step_delimiter)[-1].strip()
except Exception as error:
# 如果在过程中发生任何错误(例如 'response_to_query_2' 未定义),
# 则向 'final_response' 分配默认的错误消息
final_response = "抱歉,我现在遇到了一些问题,请尝试提出另一个问题。"
try
块尝试执行提取最终回答的代码。模型的回答存储在 response_to_query_2
中,使用 step_delimiter
作为分隔点将输出分割成多个段落。通过访问最后一个段落 [-1]
,我们确保只捕获模型推理过程的结论。strip()
方法应用于移除任何前导或尾随空格,确保最终回答整洁地格式化。
except
块是一个安全网,捕捉在提取过程中可能发生的任何异常。异常可能会因各种原因发生,例如 response_to_query_2
未定义或字符串不包含分隔符,导致索引错误。在这种情况下,为了避免程序崩溃或向用户暴露原始错误消息,返回预先定义的友好回答,保持流畅的用户体验。
最后,print(final_response)
用于向用户展示最终的回答。这种方法确保用户收到清晰简洁的回答,符合内心独白技术的原则,省略不必要的模型内部思维过程的细节。
这种方法通过确保系统的回答既用户友好又专注于直接提供相关信息,增强了用户界面,避免用背景处理的复杂性压倒用户。
结论与最佳实践
使用 OpenAI 的 API 实现链式思考推理和内心独白增强了模型处理复杂查询的能力,提供了清晰准确的回答。在整合这些技术时:
- 确保提示结构清晰,有效引导模型。
- 根据模型的表现定期优化提示以提升回答质量。
- 考虑用户体验,以直观的方式呈现回答,使用像内心独白这样的技术来简化信息传递。
对于高级模型交互技术和提示工程的进一步探索,请参考 OpenAI 的文档及相关自然语言处理和机器学习领域的学术文献。