调用AI模型的API,本质上就是在和机器对话,但不是随便聊聊。你需要通过代码,给模型发送一段精心构造的文本,也就是“提示词”(Prompt),来告诉它你想让它干什么。这和你直接在网页上跟AI聊天有点不一样,通过API调用,你可以把AI的能力集成到你自己的程序里。
写提示词有点像写代码,得讲究逻辑和结构,不然AI很难理解你的确切意图。一个好的提示词能让AI的输出更准确、更稳定。
核心理念:明确、具体、给示例
和AI打交道,最忌讳的就是模糊不清。如果你自己都不知道想要什么,AI就更不可能给你满意的结果。所以,写提示词的第一原则就是:具体、具体、再具体。
举个例子,如果你想让AI帮你写个函数,下面两种说法效果完全不同:
- 模糊的说法:“写一个函数。”
- 具体的说法:“写一个Python函数,用递归的方式计算一个数的阶乘。要能处理0和负数这两种特殊情况。”
第二种说法提供了语言、方法、以及需要处理的边界情况,AI就能准确地生成你想要的代码。
除了具体,提供示例(也就是“Few-shot prompting”)也是个非常有效的办法。 你先给AI看几个输入和输出的例子,它就能更好地理解你想要的格式和风格。
API调用的代码结构
通过API调用AI,通常会发送一个结构化的数据,比如JSON格式。这里以调用OpenAI的API为例,一个典型的请求结构大概是这样的:
“`python
import openai
替换成你自己的API密钥
openai.api_key = ‘YOUR_API_KEY’
response = openai.chat.completions.create(
model=”gpt-4″, # 指定使用的模型
messages=[
{“role”: “system”, “content”: “你是一个专业的代码审查助手,擅长发现代码中的潜在bug和性能问题。”},
{“role”: “user”, “content”: “请审查以下Python代码,并以JSON格式返回问题列表,每个问题包含’line’、’issue’和’suggestion’三个字段。代码:nndef calculate_average(numbers):n total = sum(numbers)n count = len(numbers)n return total / count”}
],
temperature=0.2, # 控制输出的随机性
max_tokens=1024 # 控制输出的最大长度
)
print(response.choices[0].message.content)
“`
我们来拆解一下这段代码里的关键部分:
1. model (模型选择)
不同的模型擅长处理的任务不一样,性能和价格也不同。 比如 gpt-4 通常更强大,但成本也更高。选择合适的模型是第一步。
2. messages (消息列表)
这是提示词的核心。它是一个列表,里面可以包含多个字典,每个字典代表一条消息。消息有不同的“角色”(role):
system(系统角色): 这部分是给AI设定的“人设”或者全局指令。 它会持久地影响整个对话的风格和行为。比如,你可以告诉它:“你是一位资深的技术文档作者,写作风格简洁明了。” 这样一来,它后续的回答都会尽量符合这个角色设定。user(用户角色): 这就是你具体提出的问题或任务。assistant(助手角色): 这个角色用来提供对话示例,也就是前面说的“Few-shot prompting”。 你可以构造一段包含用户提问和助手标准回答的对话,来引导AI学习你想要的输出格式。
把指令、上下文和用户输入清晰地分开,能让模型更好地理解任务。 可以使用分隔符,比如 ### 或 """,来区分不同的文本部分。
3. temperature (温度参数)
这个参数控制输出的随机性,取值范围通常在0到1之间。
- 低
temperature(比如 0.2): 输出会更具确定性、更保守。适合需要事实准确、逻辑严谨的场景,比如代码生成、数据提取或作为知识库问答。 - 高
temperature(比如 0.8): 输出会更有创意、更多样化。适合需要激发灵感的场景,比如写营销文案、构思故事。
4. max_tokens (最大令牌数)
这个参数用来限制生成内容的最大长度,防止AI输出过长的、不相关的内容,同时也能帮你控制API调用的成本。
任务场景样例
下面我们看几个不同任务场景下的提示词代码样例。
样例一:文本分类
假设你想让AI判断用户评论的情感是积极、消极还是中性,并且希望得到一个结构化的JSON输出。
python
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个情感分析引擎。你的任务是分析用户评论,并以JSON格式输出情感分类。情感只能是 'positive', 'negative', 或 'neutral'。"},
{"role": "user", "content": "分析以下文本的情感:'这款手机的电池续航能力真的很一般。'"},
{"role": "assistant", "content": '{"sentiment": "negative"}'}, # 提供一个输出格式的例子
{"role": "user", "content": "分析以下文本的情感:'屏幕显示效果不错,但相机有点失望。'"}
],
temperature=0
)
在这个例子里:
* system 消息明确了AI的角色和任务,并严格规定了输出的格式和可选值。
* 我们提供了一对 user 和 assistant 的消息作为“Few-shot”示例,这能极大地帮助AI理解你想要的JSON结构。
* temperature 设置为0,因为这是一个分类任务,我们需要最确定、最稳定的结果。
样例二:代码生成
假如你需要AI帮你写一段符合特定规范的API调用代码。
python
response = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一名精通Go语言的后端开发专家。你写的代码总是遵循最佳实践,包含详细的注释和错误处理。"},
{"role": "user", "content": """
请为Go语言生成一个函数,该函数通过HTTP GET请求调用 'https://api.example.com/data' 这个URL。
具体要求如下:
1. 函数名为 `fetchData`。
2. 需要处理网络请求可能发生的错误。
3. 需要处理HTTP响应状态码不是200的情况。
4. 成功后,需要将返回的JSON body解析到一个名为 `Data` 的struct中。
5. 在关键逻辑处添加注释。
"""}
],
temperature=0.3,
max_tokens=2000
)
在这个例子里:
* 我们通过 system 消息赋予AI一个专家的角色。
* 在 user 消息中,我们把复杂的任务拆分成了几个明确的、按步骤排列的指令。 这种方式能让AI更容易地遵循你的要求。
* 因为是代码生成,我们把 temperature 设得比较低,保证代码的逻辑性和稳定性。
样例三:信息提取
从一段非结构化的文本中提取出结构化信息,是AI很擅长的一个任务。
“`python
text_to_extract = “会议定于2025年12月25日上午10点在三号会议室举行,主题是关于第四季度财务报告的讨论。请张三和李四务必参加。”
response = openai.chat.completions.create(
model=”gpt-4″,
messages=[
{“role”: “system”, “content”: “你是一个信息提取助手。你的任务是从给定的文本中提取关键信息,并以JSON格式返回。如果某项信息不存在,请将其值设为 null。”},
{“role”: “user”, “content”: f”””
从以下文本中提取会议信息:
文本:
"""
{text_to_extract}
"""
请提取以下字段:
- event_date (YYYY-MM-DD格式)
- event_time (HH:MM格式)
- location
- topic
- attendees (一个包含姓名的列表)
"""}
],
temperature=0
)
``“””
在这个例子里:
* 指令非常清晰,明确告知AI需要提取哪些字段,以及它们的数据格式。
* 使用作为分隔符,清楚地将指令和待处理的文本分离开来。 这有助于模型避免混淆。temperature` 设置为0,因为信息提取任务追求的是准确性,而非创造性。
* 同样,
迭代和优化
写提示词不是一次就能搞定的事,它是一个不断尝试和优化的过程。 如果第一次得到的结果不理想,不要灰心。尝试调整你的指令,让它们更具体;或者增加更多的示例,来更好地引导模型。 就像和人沟通一样,你需要不断调整你的表达方式,直到对方完全明白你的意思。






评论前必须登录!
注册