趋近智
设计理想的提示词 (prompt)往往更像是一门艺术而非科学,但如同许多艺术创作一样,它从结构化、迭代式的过程中获益良多。正如我们所见,理解有效提示词的原则,使用少量示例,并精心组织提示词是重要的起步。然而,初次尝试很少能在所有可能的输入上都产生最佳结果。这就是迭代式提示词优化变得非常必要的地方。它是一个系统化的过程,用于根据大型语言模型的实际响应来测试、分析和改进你的提示词。
可以将你的初始提示词看作是关于如何最好地向大型语言模型传达请求的一种假设。迭代式优化是用来测试和完善该假设的实验过程。
有几个因素促使提示词需要优化:
迭代式提示词 (prompt)优化遵循一个循环,该循环会重复进行,直到提示词在你的应用需求下表现令人满意。
提示词优化的迭代循环包括设计、测试、分析和优化提示词,直到达到预期的表现。
我们来详细说明每个步骤:
设计初始提示词: 根据前面介绍的原则(清晰度、上下文 (context)、结构,如果适用,还包括少量示例),创建你的第一个提示词版本。将此提示词存储在你的Python代码中,可以是一个格式化字符串或使用模板系统。
输入测试: 执行你的Python代码,将提示词和各种输入发送到LLM API。重要的是不仅要测试“顺利路径”(预期输入),还要测试边界情况、复杂示例,以及与你的应用相关的潜在对抗性输入。
分析输出: 这是非常重要的一步。检查LLM对每个输入的响应。着重查看:
优化提示词: 根据分析中发现的问题,修改提示词。常见的优化方法包括:
temperature(用于创意性与确定性)或max_tokens,可以影响输出,并可能与提示词文本一同调整。重复: 使用优化后的提示词回到第2步(测试),并重复这个循环。
虽然手动检查通常是必要的,特别是对于语调等主观特性,但Python可以协助分析过程。
日志记录: 系统地记录你的提示词 (prompt)、输入、LLM输出以及任何相关参数 (parameter)(如温度)。这会创建一个用于比较和调试的记录。一个简单的方法是使用Python内置的logging模块,或者最初只使用结构化的print语句。
import logging
import datetime
import json
from your_llm_client import call_llm # 假设你有一个调用LLM的函数
logging.basicConfig(filename='prompt_testing.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
def test_prompt(prompt_version, prompt_template, input_data):
prompt = prompt_template.format(input=input_data)
try:
response = call_llm(prompt) # 你与LLM API交互的函数
log_entry = {
"timestamp": datetime.datetime.now().isoformat(),
"prompt_version": prompt_version,
"input": input_data,
"prompt_sent": prompt,
"response": response
}
logging.info(json.dumps(log_entry))
return response
except Exception as e:
logging.error(f"Error testing prompt {prompt_version} with input '{input_data}': {e}")
return None
# 示例用法:
# text_input = "一些输入文本..."
# prompt_v1 = "总结这段文本:{input}"
# test_prompt("v1.0", prompt_v1, text_input)
程序化检查: 对于具有预期结构(如JSON或特定格式)的输出,编写Python代码来验证响应。你可以检查是否存在必要的键、正确的数据类型或是否符合正则表达式模式。
import json
def validate_json_output(response_text):
try:
data = json.loads(response_text)
if "name" in data and "email" in data:
return True, "格式有效"
else:
return False, "缺少必要的键 ('name', 'email')"
except json.JSONDecodeError:
return False, "JSON无效"
except Exception as e:
return False, f"意外错误: {e}"
# llm_response = '{"name": "Alice", "email": "[email protected]"}'
# is_valid, message = validate_json_output(llm_response)
# print(f"验证结果: {is_valid}, 消息: {message}")
基本指标: 对于分类或提取等特定任务,你可以根据预定义的一组正确答案(测试集)计算简单的指标,如准确率、精确率、召回率或F1分数。第9章更详细地讨论了评估。
我们来优化一个旨在从非正式文本中提取会议日期和主要主题的提示词。
目标: 提取日期(YYYY-MM-DD)和主题。
输入文本: text_input = "嘿团队,下周四我们同步一下,大概下午3点?我们需要讨论第三季度路线图演示。" (假设今天是2024-07-15,星期一)。
初始提示词 (v1):
prompt_template_v1 = """
从以下文本中提取日期和主要主题。
将日期格式化为 YYYY-MM-DD。
文本:
{input}
输出:
日期:
主题:
"""
prompt_v1 = prompt_template_v1.format(input=text_input)
# 假设 call_llm(prompt_v1) 返回:
# "日期: 2024-07-25\n主题: 第三季度路线图演示"
分析 (v1): 对这个简单情况有效。我们来尝试一个更复杂(或更有挑战性)的输入。
新输入: text_input_tricky = "提醒:Alpha项目启动会是明天上午。另外,下周某个时候提醒我一下预算评审。" (假设今天是2024-07-15)。
用复杂输入测试 (v1):
prompt_v1_tricky = prompt_template_v1.format(input=text_input_tricky)
# 假设 call_llm(prompt_v1_tricky) 可能返回:
# "日期: 2024-07-16\n主题: Alpha项目启动和预算评审"
# 或者可能:
# "日期: \n主题: Alpha项目启动"
分析 (v1) - 问题:
优化提示词 (v2): 让我们优先处理第一个提到的事件,并要求JSON输出。
prompt_template_v2 = """
分析以下文本,找出其中提到的主要事件的日期和主要主题。
- 根据当前日期 2024-07-15 确定日期。将日期格式化为 YYYY-MM-DD。
- 找出与该日期相关联的主要主题。
- 如果提到了多个事件,请侧重于第一个带有特定日期或相对日期(如“明天”)的事件。
- 只需以包含键 "date" 和 "topic" 的JSON对象形式响应。
文本:
{input}
JSON 输出:
"""
prompt_v2_tricky = prompt_template_v2.format(input=text_input_tricky)
# 假设 call_llm(prompt_v2_tricky) 现在返回:
# '{\n "date": "2024-07-16",\n "topic": "project Alpha kickoff"\n}'
分析 (v2): 输出现在结构化(JSON)并且正确地侧重于第一个事件(“明天”)。明确的指令和日期上下文 (context)帮助很大。还需要使用更多输入进行进一步测试,如果发现新的问题,可能会导致v3版本。
提示词 (prompt)优化可能是一个没有终点的过程。了解何时停止非常重要:
迭代式优化是实际LLM应用开发中的一项基本能力。通过在你的Python代码中系统地测试、分析失败并对提示词进行有针对性的改进,你可以大幅提升LLM支持功能的可靠性和准确性。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造