程序员必看!主流大模型 API 参数详解:temperature/topp/topk/penalty(含 GPT、Claude、Gemini)
程序员必看!主流大模型 API 参数详解:temperature/topp/topk/penalty(含 GPT、Claude、Gemini)
大语言模型的飞速发展为我们带来了前所未有的语言交互体验。在使用像 GPT、Claude、Gemini 等主流大语言模型的 API 时,理解并合理调整参数是发挥模型最佳性能的关键。其中,temperature、top-p、top-k 以及 penalty 等参数对模型输出的影响尤为显著,它们如同精细的调音旋钮,能让模型的输出在确定性与创造性、准确性与多样性之间找到合适的平衡。接下来,让我们深入探究这些参数在不同主流大语言模型中的奥秘。
一、主流大语言模型概述
OpenAI GPT系列
OpenAI的GPT(Generative Pre-trained Transformer)系列模型是目前最广泛使用的大语言模型之一。从GPT-3到GPT-4,这些模型在文本生成、对话、代码编写等方面展现出强大的能力。OpenAI提供了完善的API接口,允许开发者通过调整各种参数来控制模型的输出。
Anthropic Claude
Anthropic的Claude系列模型以其安全性和文案优美而闻名。Claude模型在长文本理解、复杂指令遵循和多轮对话方面表现出色。Claude的API设计注重简洁性和易用性,同时提供足够的参数来控制模型行为。
Google Gemini
Google的Gemini是一系列多模态大语言模型,能够理解和生成文本、图像等多种形式的内容。Gemini模型在推理能力、多语言支持和多模态理解方面具有优势。Google为Gemini提供了功能丰富的API,包括许多用于控制输出和集成外部工具的参数。
二、API参数分析
通过分析OpenAI GPT、Anthropic Claude和Google Gemini三个主流大语言模型的API参数,我们可以将这些参数分为共同参数和特有参数两类。共同参数是这些模型普遍支持的参数,而特有参数则是某个模型独有的功能。
共同参数
- model/模型选择参数
- OpenAI:
model
(string, 必填) - Claude:
model
(必须参数) - Gemini:
model
(string, 必需) - 共同点:所有模型都需要指定使用哪个具体的模型版本
- 输入/提示参数
- OpenAI:
prompt
(string 或 array, 可选) - Claude:
messages
(必须参数) - Gemini:
contents
(object, 必需) - 共同点:虽然名称和格式不同,但都是用于向模型提供输入内容或对话历史
- 最大输出长度参数
- OpenAI:
max_tokens
(integer, 可选, 默认值16) - Claude:
max_tokens
(必须参数) - Gemini:
maxOutputTokens
(integer, 可选) - 共同点:控制模型生成内容的最大长度
- 温度参数
- OpenAI:
temperature
(number, 可选, 默认值1) - Claude:
temperature
(可选参数) - Gemini:
temperature
(number, 可选) - 共同点:控制输出的随机性/创造性,值越高随机性越大,值越低确定性越高
- Top-p采样参数
- OpenAI:
top_p
(number, 可选, 默认值1) - Claude:
top_p
(浮点数,非必填) - Gemini:
topP
(number, 可选) - 共同点:控制核采样(nucleus sampling)的概率阈值,限制模型只从累积概率达到该阈值的token中选择
- 停止序列参数
- OpenAI:
stop
(string 或 array, 可选) - Claude:
stop_sequences
(可选参数) - Gemini:
stopSequences
(string, 可选) - 共同点:指定一系列字符串,当模型生成这些字符串时会停止生成
- 频率惩罚参数
- OpenAI:
frequency_penalty
(number, 可选, 默认值0) - Gemini:
frequencyPenalty
(number, 可选) - 共同点:根据token在生成内容中出现的频率进行惩罚,减少重复
- 存在惩罚参数
- OpenAI:
presence_penalty
(number, 可选, 默认值0) - Gemini:
presencePenalty
(number, 可选) - 共同点:根据token是否已在生成内容中出现过进行惩罚,增加多样性
- Top-k采样参数
- Claude:
top_k
(整数,非必填) - Gemini:
topK
(integer, 可选) - 共同点:限制模型在每一步只从概率最高的k个token中进行选择
特有参数
OpenAI GPT特有参数
- suffix (string, 可选, 默认值null)
- 插入文本完成后出现的后缀
- n (integer, 可选, 默认值1)
- 每个提示要生成多少个完成
- stream (boolean, 可选, 默认值false)
- 是否流回部分进度
- logprobs (integer, 可选, 默认值null)
- 按可能性概率选择token的个数
- echo (boolean, 可选, 默认值false)
- 除了完成之外,回显提示
- best_of (integer, 可选, 默认值1)
- 在服务器端生成best_of个完成,并返回"最佳"(每个token的日志概率最高)
- logit_bias (map, 可选, 默认值null)
- 修改完成时出现指定token的可能性
- user (string, 可选)
- 代表最终用户的唯一标识符
Anthropic Claude特有参数
- system (可选参数)
- 为Claude设置系统角色,比如指定语气、身份、限制回答范围等
Google Gemini特有参数
- tools (object, 可选)
- Model可能用于生成下一个响应的Tools列表
- toolConfig (object, 可选)
- 请求中指定的任何Tool的工具配置
- safetySettings (object, 可选)
- 用于屏蔽不安全内容的唯一SafetySetting实例列表
- responseMimeType (string, 可选)
- 生成的候选文本的MIME类型
- responseSchema (object, 可选)
- 生成的候选文本的输出架构
- responseModalities (enum, 可选)
- 请求的响应模式
- candidateCount (integer, 可选)
- 要返回的生成的回答数量
- seed (integer, 可选)
- 解码中使用的种子
参数对比表
下表对比了三个主流大语言模型的API参数支持情况:
参数类别 | OpenAI GPT | Anthropic Claude | Google Gemini |
---|---|---|---|
模型选择 | model | model | model |
输入/提示 | prompt | messages | contents |
最大输出长度 | max_tokens | max_tokens | maxOutputTokens |
温度控制 | temperature | temperature | temperature |
Top-p采样 | top_p | top_p | topP |
停止序列 | stop | stop_sequences | stopSequences |
频率惩罚 | frequency_penalty | - | frequencyPenalty |
存在惩罚 | presence_penalty | - | presencePenalty |
Top-k采样 | - | top_k | topK |
系统指令 | - | system | - |
工具调用 | - | - | tools, toolConfig |
安全设置 | - | - | safetySettings |
响应格式 | - | - | responseMimeType, responseSchema |
多样性控制 | logit_bias | - | - |
流式响应 | stream | - | - |
多候选生成 | n, best_of | - | candidateCount |
随机种子 | - | - | seed |
用户标识 | user | - | - |
后缀 | suffix | - | - |
概率日志 | logprobs | - | - |
回显提示 | echo | - | - |
三、参数详解与形象比喻
本节将详细解释各个API参数的作用和影响,并通过形象的比喻帮助理解这些参数。
共同参数详解
1. 模型选择参数 (model)
详细解释: 模型选择参数是API调用中最基础的参数,用于指定要使用的具体模型版本。不同的模型版本有不同的能力、性能和价格。较新的模型通常具有更强的能力和更好的性能,但价格也可能更高。
形象比喻: 模型选择就像是选择不同型号的汽车。你可以选择经济型轿车(基础模型,成本低但功能有限),SUV(中端模型,平衡性能与成本),或者豪华跑车(高端模型,性能卓越但成本高)。每种车型都有其适用场景,就像不同的语言模型适合不同的任务。
2. 输入/提示参数 (prompt/messages/contents)
详细解释: 输入参数是向模型提供指令、问题或上下文的方式。虽然不同模型的参数名称和格式不同(OpenAI使用prompt,Claude使用messages,Gemini使用contents),但它们的核心功能是相同的:向模型传递用户的输入和对话历史。
对于多轮对话,这些参数通常包含完整的对话历史,以便模型理解上下文。格式上,OpenAI接受字符串或数组,Claude和Gemini使用结构化的对象,包含角色(用户/助手)和内容。
形象比喻: 输入参数就像是给演员的剧本。你提供的内容(提示、问题、上下文)就是剧本的内容,模型就像演员,根据剧本(输入)来表演(生成回答)。如果是多轮对话,那么这个剧本就包含了之前所有的对白,让演员能够理解整个故事的脉络,而不仅仅是当前的台词。
3. 最大输出长度参数 (max_tokens/maxOutputTokens)
详细解释: 最大输出长度参数控制模型生成内容的最大长度,以token为单位。一个token大约相当于0.75个英文单词或1-1.5个中文字符。设置这个参数可以防止模型生成过长的回答,控制API调用的成本(因为大多数API按token计费),并确保回答的简洁性。
形象比喻: 最大输出长度就像是给演讲者的时间限制。如果你告诉演讲者"你有5分钟的时间",他们会相应地组织内容,确保在规定时间内完成。同样,设置max_tokens就是告诉模型"你有这么多token的空间来回答",模型会尽量在这个限制内提供完整的回答。如果限制太小,就像演讲时间太短一样,内容可能会被截断或不完整。
4. 温度参数 (temperature)
详细解释: 温度参数控制模型输出的随机性或创造性。温度值通常在0到2之间,其中:
- 低温度(接近0):输出更确定、更可预测,模型倾向于选择最可能的词
- 中等温度(约0.5-0.7):平衡确定性和创造性
- 高温度(1.0以上):输出更随机、更创造性,模型会考虑概率较低的词
温度参数在不同任务中的选择很重要:
- 对于需要准确性的任务(如回答事实问题、编写代码):使用低温度
- 对于需要创造性的任务(如讲故事、写诗):使用高温度
形象比喻: 温度参数就像是调节厨师的冒险精神。低温度就像是严格按照食谱烹饪,确保菜肴的一致性和可预测性;高温度则像是鼓励厨师即兴发挥,尝试新的配料和烹饪方法,可能创造出惊喜,但也可能不如预期。
另一个比喻是音乐即兴演奏:低温度就像是严格按照乐谱演奏,高温度则像是爵士乐手的即兴发挥,加入个人风格和创新元素。
5. Top-p采样参数 (top_p/topP)
详细解释: Top-p采样(也称为核采样,nucleus sampling)是控制模型输出多样性的另一种方法。它通过设置一个概率阈值p,模型只从累积概率达到该阈值的token中进行选择。
例如,如果top_p设为0.9,模型会按概率从高到低排序所有可能的下一个token,然后只从累积概率达到90%的那些token中选择,忽略剩余的低概率token。
与temperature不同,top_p不是直接调整概率分布,而是限制选择范围。通常建议只调整temperature或top_p中的一个,而不是同时调整两者。
形象比喻: Top-p采样就像是在餐厅点菜时的策略。假设菜单上有20道菜,但你只想考虑最受欢迎的几道。
设置top_p=0.9就像是说:“只给我看那些占总点餐量90%的菜品”。服务员可能会告诉你:“这5道菜占了我们90%的订单,其他15道都很少有人点”。这样你就只需要从这5道热门菜中选择,而不用考虑那些不太受欢迎的选项。
低top_p值会让你只考虑最热门的1-2道菜,高top_p值则会让你考虑更多的选择,包括一些不那么主流的菜品。
6. 停止序列参数 (stop/stop_sequences/stopSequences)
详细解释: 停止序列参数允许用户指定一系列字符串,当模型生成这些字符串时会立即停止生成。这对于控制输出格式、防止模型继续不必要的生成非常有用。
例如,如果你希望模型只生成一个问题的答案,而不继续生成下一个问题,你可以设置"\n问题:"作为停止序列。
大多数模型限制停止序列的数量(通常为1-5个)和长度。停止序列在生成结构化输出(如JSON、表格)或对话时特别有用。
形象比喻: 停止序列就像是交通信号灯中的红灯。当车辆(模型生成过程)遇到红灯(停止序列)时,必须立即停止,不能继续前进。这确保了生成过程在适当的地方结束,而不是无限制地继续下去。
另一个比喻是在演讲中使用的提示卡。当演讲者看到卡片上写着"结束语"时,就知道该结束演讲了,而不是继续讲下去。
7. 频率惩罚参数 (frequency_penalty/frequencyPenalty)
详细解释: 频率惩罚参数用于减少模型输出中的重复内容。它通过降低已经频繁出现的token的概率来实现这一点。参数值通常在-2.0到2.0之间:
- 正值:降低已出现token的概率,减少重复
- 零:不进行频率调整
- 负值:增加已出现token的概率,可能导致更多重复
频率惩罚对于生成长文本特别有用,可以防止模型陷入重复模式或过度使用某些词汇。
形象比喻: 频率惩罚就像是一位编辑,当作者过度使用某个词或短语时会提出警告。正的频率惩罚值就像是严格的编辑,会强烈建议作者使用同义词或改变表达方式;零值就像是不干预的编辑;负值则像是鼓励重复使用特定词汇的编辑,这在某些特定风格的写作中可能有用。
另一个比喻是调味料的使用:频率惩罚就像是控制同一种调味料在菜肴中重复使用的程度。高频率惩罚会鼓励厨师使用各种不同的调味料(词汇多样性),而低频率惩罚则允许反复使用同一种调味料(词汇重复)。
8. 存在惩罚参数 (presence_penalty/presencePenalty)
详细解释: 存在惩罚参数与频率惩罚类似,但它只关注token是否出现过,而不考虑出现的频率。参数值通常在-2.0到2.0之间:
- 正值:降低已出现过的任何token的概率,鼓励模型探索新主题
- 零:不进行存在调整
- 负值:增加已出现过的token的概率,使模型更倾向于继续讨论已提及的主题
存在惩罚有助于增加主题多样性,防止模型在同一主题上过度关注。
形象比喻: 存在惩罚就像是一场对话中的话题管理者。正的存在惩罚值就像是积极引导对话涉及新话题的主持人:“我们已经讨论过工作了,现在让我们谈谈爱好吧”;零值就像是不干预话题流向的主持人;负值则像是鼓励深入探讨已提及话题的主持人:“你提到了旅行,请详细告诉我更多关于你的旅行经历”。
另一个比喻是探险:正的存在惩罚就像是鼓励探险者不断探索新的地方,而不是重复访问同一地点;负的存在惩罚则鼓励探险者深入研究已发现的区域。
9. Top-k采样参数 (top_k/topK)
详细解释: Top-k采样是另一种控制模型输出多样性的方法。它通过限制模型在每一步只从概率最高的k个token中进行选择来实现。
例如,如果top_k设为50,模型在生成每个token时,只会考虑概率排名前50的候选token,而忽略其他所有可能性较低的token。
Top-k采样可以与temperature或top-p结合使用,进一步精细控制输出的随机性和多样性。较小的k值会使输出更确定、更可预测,而较大的k值则允许更多的创造性和多样性。
形象比喻: Top-k采样就像是参加选秀比赛时的初选过程。假设有1000名参赛者,但评委只会从评分最高的前50名(k=50)中选择最终的获胜者。这样可以确保最终选择的质量,同时仍然保留一定的多样性。
较小的k值就像是只考虑前10名选手,这会使最终选择更保守、更可预测;较大的k值就像是考虑前100名选手,这会引入更多的多样性和可能性。
特有参数详解
OpenAI GPT特有参数
1. suffix
详细解释: suffix参数允许用户指定一个字符串,该字符串将被添加到模型生成的文本之后。这对于创建特定格式的输出或引导模型继续特定的上下文很有用。
形象比喻: suffix就像是给故事添加的尾声。模型负责创作故事的主体,而suffix则是你预先设定的结局。无论模型如何发展故事,最终都会以你指定的方式结束。
2. n
详细解释: n参数指定模型为每个提示生成的完成数量。例如,如果n=3,模型将为同一个提示生成3个不同的回答。这对于获取多样化的回答或创意选项很有用。
需要注意的是,增加n值会按比例增加API调用的成本,因为你实际上是请求多个完成。
形象比喻: n参数就像是向多位专家咨询同一个问题。设置n=3就像是同时咨询三位不同的专家,获取三种不同的观点或解决方案。这样你可以比较不同的回答,选择最适合你需求的那一个。
3. stream
详细解释: stream参数控制API是否以流式方式返回部分完成结果。当设置为true时,模型会在生成过程中逐步返回token,而不是等到整个回答生成完毕后一次性返回。
流式传输对于创建更具交互性的用户体验很有用,例如实时显示模型正在"思考"或"打字"的效果。
形象比喻: stream参数就像是观看现场直播与录制节目的区别。启用stream(设为true)就像是观看现场直播,你可以实时看到事件的发展;禁用stream(设为false)则像是观看录制节目,你只能在整个节目录制完成后才能观看。
4. logprobs
详细解释: logprobs参数请求模型返回所选token及其他候选token的对数概率。如果设置logprobs=5,API将返回每个位置上概率最高的5个token及其对数概率。
这对于理解模型的决策过程、调试或开发高级应用(如不确定性估计)非常有用。
形象比喻: logprobs就像是让厨师不仅告诉你他选择了哪种配料,还告诉你他考虑过的其他配料以及为什么最终选择了这一种。它提供了一个"幕后视角",让你了解模型在每一步的"思考过程"和它认为的各种可能性。
5. echo
详细解释: echo参数控制API响应是否包含原始提示。当设置为true时,API返回的文本将包括原始提示加上模型生成的完成;当设置为false时,只返回模型生成的部分。
这对于某些需要保持完整上下文的应用场景很有用。
形象比喻: echo参数就像是在对话中选择是否重复对方的问题。启用echo(设为true)就像是回答"你问我最喜欢的颜色是什么,我的回答是蓝色";禁用echo(设为false)则只是直接回答"蓝色",不重复问题。
6. best_of
详细解释: best_of参数指示API在服务器端生成多个完成,但只返回最佳的一个(基于每个token的对数概率)。例如,如果best_of=5,模型会生成5个不同的完成,但只返回其中最"好"的一个。
这与n参数不同,n会返回所有生成的完成,而best_of只返回最佳的一个。需要注意的是,best_of会增加API调用的计算成本,因为模型实际上生成了多个完成。
形象比喻: best_of就像是一位作家草拟了多个版本的文章,但只发表他认为最好的那一个。读者只看到最终版本,而不知道背后有多少草稿和修改。这样可以提高最终输出的质量,但需要更多的时间和资源。
7. logit_bias
详细解释: logit_bias参数允许用户修改特定token出现在完成中的可能性。它接受一个映射,将token ID映射到-100到100之间的偏差值:
- 正偏差:增加该token的出现概率
- 负偏差:降低该token的出现概率
- 极端值(如100或-100):几乎强制包含或排除该token
这对于引导模型使用或避免特定词汇、控制输出风格或内容非常有用。
形象比喻: logit_bias就像是给演讲者提供的词汇偏好指南。正偏差就像是告诉演讲者"请尽量使用这些词";负偏差就像是说"请避免使用这些词";极端偏差则像是明确的指令"必须使用这个词"或"绝对不能使用这个词"。
这样可以微调演讲的风格和内容,就像调整模型的输出一样。
8. user
详细解释: user参数是一个可选的字符串,用于表示最终用户的唯一标识符。这主要用于帮助OpenAI监控和检测API滥用行为,并不直接影响模型的输出。
在多用户系统中,提供一致的用户标识符可以帮助API提供商区分不同用户的请求模式。
形象比喻: user参数就像是在图书馆借书时使用的借书证。借书证本身不会改变你借的书的内容,但它帮助图书馆跟踪谁借了什么书,识别异常模式,并确保系统的公平使用。
Anthropic Claude特有参数
1. system
详细解释: system参数允许用户为Claude设置系统角色或指令,用于指定模型的行为、语气、身份或回答范围。与OpenAI的系统消息不同,Claude的system参数是作为单独的参数传入,而不是作为messages数组的一部分。
系统指令可以用来设置模型的角色(如"你是一位友好的助手"),定义回答的格式(如"以JSON格式回答"),或限制模型的行为(如"不要提供医疗建议")。
形象比喻: system参数就像是给演员的角色设定和导演指南。在拍摄电影前,导演会告诉演员:"你扮演的是一位和蔼的老师,说话要温柔,避免使用专业术语,并且不要讨论政治话题。"这些指导方针会影响演员的整体表现,但不是剧本的一部分。同样,system参数设置了模型的"人格"和行为准则,影响它如何回应所有输入。
Google Gemini特有参数
1. tools 和 toolConfig
详细解释: tools参数允许Gemini模型使用外部工具来执行超出其知识范围的操作。tools是一个工具列表,而toolConfig提供这些工具的配置信息。
支持的工具类型包括Function(函数调用)和codeExecution(代码执行)。这使模型能够执行API调用、运行代码或与外部系统交互,大大扩展了其能力范围。
形象比喻: tools和toolConfig就像是给助手提供的一套工具箱和使用说明。想象一下,你雇佣了一位助手来帮你解决问题,但有些任务需要特殊工具。tools就是你提供给助手的工具(如计算器、电话、互联网连接),而toolConfig则是如何使用这些工具的说明。
有了这些工具,助手不仅可以基于自己的知识回答问题,还可以使用工具获取额外信息或执行特定任务,就像模型可以调用外部API或执行代码一样。
2. safetySettings
详细解释: safetySettings参数允许用户自定义Gemini模型的安全过滤级别。它是一个SafetySetting实例列表,每个实例指定一个安全类别(如仇恨言论、性内容、危险内容等)的处理方式。
用户可以为不同类别设置不同的阈值,从而在安全性和模型自由度之间取得平衡。这对于不同应用场景(如儿童内容vs成人内容)非常有用。
形象比喻: safetySettings就像是电视或流媒体平台的内容过滤器。家长可以为不同类型的内容(暴力、性、粗俗语言等)设置不同的过滤级别,以适应观众的年龄和偏好。同样,safetySettings允许开发者为不同类型的潜在有害内容设置不同的过滤级别,确保模型输出适合其目标受众。
3. responseMimeType 和 responseSchema
详细解释: responseMimeType参数指定生成内容的MIME类型,如纯文本(text/plain)、JSON(application/json)或枚举(text/x.enum)。
responseSchema参数则定义了输出的结构,特别是当responseMimeType设为application/json时。它使用OpenAPI架构的子集来描述预期的JSON结构。
这两个参数结合使用,可以控制模型输出的格式和结构,使其更容易被程序处理。
形象比喻: responseMimeType和responseSchema就像是给厨师的菜品规格说明。responseMimeType告诉厨师你想要的菜品类型(如"沙拉"、“汤"或"主菜”),而responseSchema则详细说明了这道菜应该包含哪些成分以及如何摆盘。
这样,无论厨师如何发挥创意,最终的菜品都会符合你指定的类型和结构,就像模型的输出会符合指定的格式和架构一样。
4. responseModalities
详细解释: responseModalities参数指定模型可以返回的响应模式(如文本、图像等)。一个模型可能支持多种模式组合,而这个参数允许用户指定期望的模式。
如果请求的模式与模型支持的任何组合都不匹配,API会返回错误。空列表等同于仅请求文本。
形象比喻: responseModalities就像是在多媒体演示中指定输出格式。你可以告诉演讲者:“我希望你的演讲包含口头解释和视觉图表,但不需要视频或音频”。这样,演讲者就知道应该准备哪些类型的内容,而不是猜测你的期望。
5. candidateCount
详细解释: candidateCount参数指定API应返回的生成回答数量。如果未设置,默认为1。这类似于OpenAI的n参数,允许模型为同一输入生成多个不同的回答。
多个候选回答可以提供多样化的选择,让用户或应用程序选择最适合的一个。
形象比喻: candidateCount就像是在设计比赛中要求设计师提交的方案数量。如果你设置candidateCount=3,就像是告诉每个设计师:“请为这个项目提供三种不同的设计方案”。这样你可以比较不同的方案,选择最符合你需求的那一个。
6. seed
详细解释: seed参数为模型的解码过程提供一个随机种子。如果设置了相同的seed值,在其他参数也相同的情况下,模型应该生成相同或非常相似的输出。
这对于确保结果的可重复性、测试或调试非常有用。如果未设置seed,API会使用随机生成的种子,导致每次调用可能产生不同的结果。
形象比喻: seed就像是音乐随机播放器的"随机种子"。当你设置相同的随机种子时,播放器会按照相同的"随机"顺序播放歌曲。这不是真正的随机,而是一种可预测的伪随机序列。
同样,设置seed参数就像是告诉模型:“使用这个特定的起点进行你的’随机’选择”,这样在相同条件下,它会做出相同的选择,产生相同的输出。
四、使用和注意事项
本节将为各个API参数提供具体的用法示例、适用场景和使用注意事项,帮助开发者更好地利用这些参数优化模型输出。
共同参数
1. 模型选择参数 (model)
用法示例
OpenAI GPT:
import openai
openai.api_key = "your-api-key"
response = openai.ChatCompletion.create(
model="gpt-4-turbo", # 选择GPT-4 Turbo模型
messages=[{"role": "user", "content": "解释量子计算的基本原理"}]
)
Anthropic Claude:
from anthropic import Anthropic
anthropic = Anthropic(api_key="your-api-key")
response = anthropic.messages.create(
model="claude-3-opus-20240229", # 选择Claude 3 Opus模型
messages=[{"role": "user", "content": "解释量子计算的基本原理"}]
)
Google Gemini:
from google import genai
genai.configure(api_key="your-api-key")
model = genai.GenerativeModel("gemini-2.0-flash") # 选择Gemini 2.0 Flash模型
response = model.generate_content("解释量子计算的基本原理")
使用场景
- 基础任务(文本生成、简单问答):选择较小、响应更快的模型,如GPT-3.5 Turbo、Claude Haiku或Gemini Flash
- 复杂任务(深度分析、创意写作):选择更强大的模型,如GPT-4、Claude Opus或Gemini Pro
- 特定领域任务:选择针对特定领域微调的模型,如代码生成、医疗或法律等专业领域
- 多模态任务:选择支持图像、音频等多模态输入的模型,如GPT-4 Vision、Claude 3或Gemini
注意事项
- 更强大的模型通常意味着更高的API调用成本,应根据任务复杂度和预算选择适当的模型
- 较新的模型版本通常性能更好,但也可能更不稳定或有不同的行为特征
- 不同模型的上下文窗口大小不同,影响它们处理长文本的能力
- 某些特殊功能(如函数调用、多模态输入)可能只在特定模型上可用
- 在生产环境中,应考虑模型的可用性、延迟和稳定性
2. 输入/提示参数 (prompt/messages/contents)
用法示例
OpenAI GPT:
# 单轮对话
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "什么是机器学习?"}]
)
# 多轮对话
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一位友好的AI助手,专注于解释技术概念。"},
{"role": "user", "content": "什么是机器学习?"},
{"role": "assistant", "content": "机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习和改进,而无需明确编程。"},
{"role": "user", "content": "那深度学习呢?"}
]
)
Anthropic Claude:
# 单轮对话
response = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "什么是机器学习?"}]
)
# 多轮对话
response = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[
{"role": "user", "content": "什么是机器学习?"},
{"role": "assistant", "content": "机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习和改进,而无需明确编程。"},
{"role": "user", "content": "那深度学习呢?"}
],
system="你是一位友好的AI助手,专注于解释技术概念。"
)
Google Gemini:
# 单轮对话
response = model.generate_content("什么是机器学习?")
# 多轮对话
chat = model.start_chat(history=[
{"role": "user", "parts": ["什么是机器学习?"]},
{"role": "model", "parts": ["机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习和改进,而无需明确编程。"]}
])
response = chat.send_message("那深度学习呢?")
使用场景
- 单轮问答:用户提出单个问题并获取回答
- 多轮对话:维护对话历史,使模型能够理解上下文
- 角色扮演:通过系统消息或初始提示设置模型的角色和行为
- 引导式生成:提供详细指导,引导模型生成特定格式或风格的内容
- 多模态输入:结合文本和图像等多种输入形式(适用于支持多模态的模型)
注意事项
- 提示工程(Prompt Engineering)是一门艺术,好的提示可以显著提高模型输出质量
- 在多轮对话中,完整的对话历史会占用上下文窗口,可能需要定期摘要或截断
- 对于复杂任务,将问题分解为多个步骤通常比一次性提供复杂指令更有效
- 提示中的细微变化可能导致输出的显著差异,应进行测试和迭代
- 在处理敏感信息时,注意不要在提示中包含个人身份信息或敏感数据
3. 最大输出长度参数 (max_tokens/maxOutputTokens)
用法示例
OpenAI GPT:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一篇关于气候变化的短文"}],
max_tokens=150 # 限制回答最多150个token
)
Anthropic Claude:
response = anthropic.messages.create(
model="claude-3-haiku-20240307",
messages=[{"role": "user", "content": "写一篇关于气候变化的短文"}],
max_tokens=150 # 限制回答最多150个token
)
Google Gemini:
response = model.generate_content(
"写一篇关于气候变化的短文",
generation_config=genai.GenerationConfig(max_output_tokens=150) # 限制回答最多150个token
)
使用场景
- 控制成本:限制输出长度可以控制API调用成本,特别是对于高流量应用
- 摘要生成:当需要简短摘要而非详细解释时
- 标题或短句生成:生成产品名称、标语或简短描述
- 固定长度输出:需要固定格式或长度的输出,如推文、短信等
- 分步生成:将长文本生成分解为多个步骤,每步生成一部分内容
注意事项
- 设置过小的max_tokens可能导致回答不完整或被截断
- token不等同于字符或单词,一个token大约相当于0.75个英文单词或1-1.5个中文字符
- 不同语言的token效率不同,例如英文通常比中文更token高效
- 模型可能在达到max_tokens限制前自然结束生成
- 在多轮对话中,max_tokens只限制模型的当前回答,不影响整个对话历史的长度
4. 温度参数 (temperature)
用法示例
OpenAI GPT:
# 低温度 - 更确定性的输出
response_factual = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "列出太阳系的行星"}],
temperature=0.1 # 低温度,更确定性
)
# 高温度 - 更创造性的输出
response_creative = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一个关于太空探险的短故事"}],
temperature=0.9 # 高温度,更创造性
)
Anthropic Claude:
# 低温度 - 更确定性的输出
response_factual = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "列出太阳系的行星"}],
temperature=0.1 # 低温度,更确定性
)
# 高温度 - 更创造性的输出
response_creative = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "写一个关于太空探险的短故事"}],
temperature=0.9 # 高温度,更创造性
)
Google Gemini:
# 低温度 - 更确定性的输出
response_factual = model.generate_content(
"列出太阳系的行星",
generation_config=genai.GenerationConfig(temperature=0.1) # 低温度,更确定性
)
# 高温度 - 更创造性的输出
response_creative = model.generate_content(
"写一个关于太空探险的短故事",
generation_config=genai.GenerationConfig(temperature=0.9) # 高温度,更创造性
)
使用场景
- 低温度 (0.1-0.3):
- 事实性问答和信息检索
- 代码生成
- 数据分析和报告生成
- 技术文档编写
- 逻辑推理和问题解决
- 中等温度 (0.4-0.7):
- 一般对话和助手功能
- 教育内容生成
- 商业文案和营销内容
- 邮件和信函撰写
- 内容摘要和改写
- 高温度 (0.8-1.0+):
- 创意写作和故事生成
- 诗歌和歌词创作
- 头脑风暴和创意想法生成
- 角色扮演和模拟对话
- 幽默内容生成
注意事项
- 温度设置是权衡确定性和创造性的关键参数
- 过高的温度可能导致输出不连贯、不准确或离题
- 过低的温度可能导致输出过于刻板或重复
- 温度设置应根据任务性质和用户期望进行调整
- 对于同一任务,不同模型可能需要不同的温度设置才能达到类似的效果
- 在生产环境中,建议进行A/B测试找到最佳温度设置
5. Top-p采样参数 (top_p/topP)
用法示例
OpenAI GPT:
# 低top_p - 更确定性的输出
response_focused = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "解释光合作用的过程"}],
top_p=0.1, # 只考虑累积概率前10%的token
temperature=1.0# 保持默认温度
)
# 高top_p - 更多样化的输出
response_diverse = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "提供解决创意障碍的方法"}],
top_p=0.9, # 考虑累积概率前90%的token
temperature=1.0# 保持默认温度
)
Anthropic Claude:
# 低top_p - 更确定性的输出
response_focused = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "解释光合作用的过程"}],
top_p=0.1 # 只考虑累积概率前10%的token
)
# 高top_p - 更多样化的输出
response_diverse = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "提供解决创意障碍的方法"}],
top_p=0.9 # 考虑累积概率前90%的token
)
Google Gemini:
# 低top_p - 更确定性的输出
response_focused = model.generate_content(
"解释光合作用的过程",
generation_config=genai.GenerationConfig(top_p=0.1) # 只考虑累积概率前10%的token
)
# 高top_p - 更多样化的输出
response_diverse = model.generate_content(
"提供解决创意障碍的方法",
generation_config=genai.GenerationConfig(top_p=0.9) # 考虑累积概率前90%的token
)
使用场景
- 低top_p (0.1-0.3):
- 科学或技术内容生成,需要高度准确性
- 代码生成,特别是遵循特定语法的场景
- 事实性问答,需要确定性答案
- 数据分析报告,需要一致性和准确性
- 中等top_p (0.4-0.7):
- 一般对话和问答
- 内容摘要和改写
- 商业文案和营销内容
- 教育内容生成
- 高top_p (0.8-1.0):
- 创意写作和故事生成
- 头脑风暴和创意想法生成
- 多样化回答生成,提供不同角度的见解
- 探索性对话,鼓励模型考虑不太常见的回答
注意事项
- top_p和temperature通常不建议同时调整,选择其中一个参数进行调整即可
- top_p=1.0意味着考虑所有可能的token,实际上禁用了nucleus sampling
- 低top_p值在某些情况下可能导致输出过于保守或重复
- 高top_p值可能导致输出不连贯或不相关
- top_p对不同模型的影响可能不同,需要针对特定模型和任务进行测试
6. 停止序列参数 (stop/stop_sequences/stopSequences)
用法示例
OpenAI GPT:
# 使用停止序列控制输出格式
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "生成5个创业点子,每个点子以'点子:'开头"}],
stop=["6.", "\n\n"] # 在遇到"6."或两个换行符时停止生成
)
Anthropic Claude:
# 使用停止序列控制输出格式
response = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "生成5个创业点子,每个点子以'点子:'开头"}],
stop_sequences=["6.", "\n\n"] # 在遇到"6."或两个换行符时停止生成
)
Google Gemini:
# 使用停止序列控制输出格式
response = model.generate_content(
"生成5个创业点子,每个点子以'点子:'开头",
generation_config=genai.GenerationConfig(stop_sequences=["6.", "\n\n"]) # 在遇到"6."或两个换行符时停止生成
)
使用场景
- 结构化输出控制:
- 生成列表时限制项目数量
- 在问答对生成中分隔问题和答案
- 防止模型继续生成不需要的内容
- 对话系统:
- 在多轮对话中控制每轮回复的边界
- 防止模型模拟用户输入或继续对话
- 代码生成:
- 限制生成特定函数或代码块
- 在注释和代码之间设置边界
- 内容格式化:
- 控制生成的JSON、XML或其他结构化格式
- 确保生成内容在特定标记处结束
- 创意写作:
- 控制故事、诗歌或其他创意内容的长度
- 在特定场景或章节结束时停止生成
注意事项
- 停止序列不会包含在最终输出中
- 大多数模型限制停止序列的数量(通常为1-5个)
- 停止序列区分大小写且必须完全匹配
- 过于常见的停止序列可能导致过早停止生成
- 如果多个停止序列同时匹配,模型会在最先出现的停止序列处停止
- 在某些情况下,模型可能会在达到停止序列之前自然结束生成
7. 频率惩罚参数 (frequency_penalty/frequencyPenalty)
用法示例
OpenAI GPT:
# 无频率惩罚 - 可能出现重复
response_normal = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一首关于春天的诗"}],
frequency_penalty=0.0# 默认值,不应用频率惩罚
)
# 正频率惩罚 - 减少重复
response_diverse = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一首关于春天的诗"}],
frequency_penalty=1.0# 应用较强的频率惩罚,减少重复
)
# 负频率惩罚 - 增加重复
response_repetitive = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一首关于春天的诗"}],
frequency_penalty=-1.0# 应用负频率惩罚,增加重复
)
Google Gemini:
# 无频率惩罚 - 可能出现重复
response_normal = model.generate_content(
"写一首关于春天的诗",
generation_config=genai.GenerationConfig(frequency_penalty=0.0) # 默认值,不应用频率惩罚
)
# 正频率惩罚 - 减少重复
response_diverse = model.generate_content(
"写一首关于春天的诗",
generation_config=genai.GenerationConfig(frequency_penalty=1.0) # 应用较强的频率惩罚,减少重复
)
# 负频率惩罚 - 增加重复
response_repetitive = model.generate_content(
"写一首关于春天的诗",
generation_config=genai.GenerationConfig(frequency_penalty=-1.0) # 应用负频率惩罚,增加重复
)
使用场景
- 正频率惩罚 (0.1-2.0):
- 长文本生成,避免重复短语和段落
- 创意写作,增加词汇多样性
- 内容摘要,确保覆盖不同要点
- 产品描述生成,避免重复使用相同的形容词
- 多样化建议或推荐列表
- 零频率惩罚 (0.0):
- 一般对话和问答
- 短文本生成
- 需要精确术语的技术或科学内容
- 负频率惩罚 (-0.1 to -2.0):
- 需要重复模式的内容(如诗歌中的重复段落)
- 强调特定关键词或短语
- 特定风格模仿,如某些作者的特征性重复
注意事项
- 频率惩罚主要影响长文本生成,对短回答影响较小
- 过高的正频率惩罚可能导致输出不连贯或使用不恰当的同义词
- 过高的负频率惩罚可能导致过度重复,使输出难以阅读
- 频率惩罚通常与温度参数结合使用,共同控制输出的多样性
- Claude目前不直接支持频率惩罚参数
- 在某些情况下,使用top_p或temperature可能比频率惩罚更有效地控制多样性
8. 存在惩罚参数 (presence_penalty/presencePenalty)
用法示例
OpenAI GPT:
# 无存在惩罚 - 可能继续讨论相同主题
response_focused = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "讨论人工智能的优势和挑战"}],
presence_penalty=0.0# 默认值,不应用存在惩罚
)
# 正存在惩罚 - 鼓励探索新主题
response_exploratory = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "讨论人工智能的优势和挑战"}],
presence_penalty=1.0# 应用较强的存在惩罚,鼓励探索新主题
)
# 负存在惩罚 - 鼓励继续讨论已提及的主题
response_focused = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "讨论人工智能的优势和挑战"}],
presence_penalty=-1.0# 应用负存在惩罚,鼓励继续讨论已提及的主题
)
Google Gemini:
# 无存在惩罚 - 可能继续讨论相同主题
response_focused = model.generate_content(
"讨论人工智能的优势和挑战",
generation_config=genai.GenerationConfig(presence_penalty=0.0) # 默认值,不应用存在惩罚
)
# 正存在惩罚 - 鼓励探索新主题
response_exploratory = model.generate_content(
"讨论人工智能的优势和挑战",
generation_config=genai.GenerationConfig(presence_penalty=1.0) # 应用较强的存在惩罚,鼓励探索新主题
)
# 负存在惩罚 - 鼓励继续讨论已提及的主题
response_focused = model.generate_content(
"讨论人工智能的优势和挑战",
generation_config=genai.GenerationConfig(presence_penalty=-1.0) # 应用负存在惩罚,鼓励继续讨论已提及的主题
)
使用场景
- 正存在惩罚 (0.1-2.0):
- 头脑风暴和创意生成,鼓励广泛探索不同想法
- 综合分析,确保覆盖多个角度和观点
- 内容创作,避免过度关注单一主题
- 生成多样化的建议或推荐
- 零存在惩罚 (0.0):
- 一般对话和问答
- 需要深入探讨特定主题的内容
- 技术或科学解释,需要连贯性
- 负存在惩罚 (-0.1 to -2.0):
- 深入分析特定主题
- 专注于已提及的关键概念
- 强化特定主题或论点
注意事项
- 存在惩罚与频率惩罚的区别在于,存在惩罚只关注token是否出现过,而不考虑出现频率
- 过高的正存在惩罚可能导致输出跳跃或不连贯
- 过高的负存在惩罚可能导致过度关注特定主题,忽略其他重要方面
- 存在惩罚对长文本生成和开放式问题的影响更明显
- Claude目前不直接支持存在惩罚参数
- 在某些情况下,良好的提示工程可能比调整存在惩罚更有效
9. Top-k采样参数 (top_k/topK)
用法示例
Anthropic Claude:
# 低top_k - 更确定性的输出
response_focused = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "解释相对论的基本原理"}],
top_k=10 # 只考虑概率最高的10个token
)
# 高top_k - 更多样化的输出
response_diverse = anthropic.messages.create(
model="claude-3-sonnet-20240229",
messages=[{"role": "user", "content": "提供解决环境问题的创新方法"}],
top_k=50 # 考虑概率最高的50个token
)
Google Gemini:
# 低top_k - 更确定性的输出
response_focused = model.generate_content(
"解释相对论的基本原理",
generation_config=genai.GenerationConfig(top_k=10) # 只考虑概率最高的10个token
)
# 高top_k - 更多样化的输出
response_diverse = model.generate_content(
"提供解决环境问题的创新方法",
generation_config=genai.GenerationConfig(top_k=50) # 考虑概率最高的50个token
)
使用场景
- 低top_k (5-20):
- 事实性问答,需要准确性
- 代码生成,需要语法正确性
- 技术文档生成
- 数据分析报告
- 中等top_k (20-50):
- 一般对话和问答
- 内容摘要和改写
- 商业文案和营销内容
- 高top_k (50+):
- 创意写作和故事生成
- 头脑风暴和创意想法生成
- 探索性对话
- 无限制 (None或0):
- 完全依赖其他参数(如temperature或top_p)控制输出多样性
注意事项
- top_k通常与temperature或top_p结合使用
- 过低的top_k值可能导致输出过于保守或重复
- 过高的top_k值实际上会使该参数失去效果,相当于不使用top_k采样
- OpenAI GPT目前不直接支持top_k参数
- 在Claude中,top_k=None表示不限制;在Gemini中,空的topK属性表示模型不会应用top_k采样
- 对于需要平衡创造性和连贯性的任务,top_k和temperature的组合通常比单独使用任一参数更有效
特有参数
OpenAI GPT特有参数
1. suffix
用法示例
response = openai.Completion.create(
model="text-davinci-003", # 注意:suffix参数主要用于Completion API,不是ChatCompletion
prompt="编写一个关于人工智能的介绍",
suffix="这就是AI的未来发展方向。", # 这段文本将被添加到生成内容的末尾
max_tokens=100
)
使用场景
- 固定结尾:需要生成内容以特定方式结束
- 格式控制:确保生成内容符合特定格式要求
- 引导继续:为后续内容提供过渡或引导
注意事项
- suffix参数主要用于传统的Completion API,在ChatCompletion API中不常用
- suffix不会计入max_tokens限制,但会影响模型的生成过程
- 不适合用于需要模型自由发挥结尾的创意任务
- 如果suffix与生成内容不自然衔接,可能导致最终文本不连贯
2. n
用法示例
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "提供三种不同风格的公司口号创意"}],
n=3, # 生成3个不同的回答
temperature=1.0 # 使用较高温度增加多样性
)
# 访问多个回答
for i, choice in enumerate(response.choices):
print(f"回答 {i+1}:")
print(choice.message.content)
print()
使用场景
- 创意生成:获取多个创意想法、标题或设计方案
- 多样化回答:提供不同角度或风格的回答
- A/B测试内容:生成多个版本进行测试
- 增强用户选择:让用户从多个选项中选择最喜欢的回答
注意事项
- 增加n值会按比例增加API调用的token消耗和成本
- 为确保生成的多个回答足够不同,通常应同时设置较高的temperature值
- 在流式响应(stream=true)模式下,n参数的行为可能不同
- 如果只需要最佳回答,考虑使用best_of参数而非n参数
3. stream
用法示例
# 使用Python的异步功能实现流式响应
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "讲一个关于太空探险的故事"}],
stream=True # 启用流式响应
)
# 处理流式响应
for chunk in response:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
使用场景
- 实时交互:创建打字机效果,实时显示生成内容
- 长回答生成:对于长回答,提供即时反馈而不是等待完整响应
- 用户体验优化:减少用户等待感,提高交互体验
- 进度指示:显示模型正在工作,特别是对于需要较长时间的复杂查询
注意事项
- 流式响应需要前端实现相应的处理逻辑
- 在流式模式下,某些参数(如best_of)不可用
- 流式响应可能增加API调用的复杂性,但不会增加token消耗
- 对于非常短的回答,流式响应的优势不明显
- 在网络不稳定的环境中,流式响应可能导致用户体验问题
4. logprobs
用法示例
response = openai.Completion.create(
model="text-davinci-003", # 注意:logprobs参数主要用于Completion API
prompt="人工智能的未来是",
max_tokens=5,
logprobs=3 # 返回每个位置概率最高的3个token及其对数概率
)
# 访问logprobs信息
for i, token in enumerate(response.choices[0].logprobs.tokens):
print(f"位置 {i}, 选择的token: {token}")
top_logprobs = response.choices[0].logprobs.top_logprobs[i]
for candidate_token, logprob in top_logprobs.items():
print(f" 候选token: {candidate_token}, 对数概率: {logprob}")
使用场景
- 模型解释性:理解模型为什么选择特定token
- 不确定性估计:评估模型对其预测的确信度
- 调试和优化:分析模型输出中的问题或偏差
- 高级应用开发:构建基于token概率的自定义逻辑
注意事项
- logprobs参数主要用于传统的Completion API,在ChatCompletion API中支持有限
- 返回logprobs会增加API响应的大小,但不会显著增加计算成本
- logprobs的最大值为5,即每个位置最多返回5个候选token
- 对数概率值通常为负数,值越接近0表示概率越高
- 解释logprobs需要对语言模型的工作原理有一定了解
5. echo
用法示例
response = openai.Completion.create(
model="text-davinci-003", # 注意:echo参数主要用于Completion API
prompt="人工智能是指",
max_tokens=50,
echo=True # 在响应中包含原始提示
)
# 完整响应包含原始提示加上生成内容
full_text = response.choices[0].text
print(full_text)
使用场景
- 上下文保持:在处理响应时保持完整上下文
- 提示调试:验证API接收到的确切提示内容
- 文本续写:在现有文本基础上无缝续写
- 教育应用:展示输入和输出之间的关系
注意事项
- echo参数主要用于传统的Completion API,在ChatCompletion API中不常用
- 启用echo会将提示计入响应的token计数,但不会计入生成的token计数
- 在处理响应时,需要区分原始提示和模型生成的内容
- 对于长提示,使用echo可能导致响应大小显著增加
6. best_of
用法示例
response = openai.Completion.create(
model="text-davinci-003", # 注意:best_of参数主要用于Completion API
prompt="写一个吸引人的产品描述,介绍一款新型智能手表",
max_tokens=100,
n=1, # 返回1个回答
best_of=5 # 生成5个候选回答,但只返回最佳的1个
)
使用场景
- 质量优先:需要高质量输出但不需要多样性
- 关键内容生成:如广告文案、产品描述等重要内容
- 准确性要求高:如代码生成、技术文档等
- 优化单一输出:在不增加用户选择负担的情况下提高质量
注意事项
- best_of会增加API调用的token消耗和计算成本,因为模型实际生成了多个回答
- best_of必须大于或等于n,通常设置best_of >> n
- 不能与stream=True同时使用
- "最佳"是基于模型的内部评分(通常是对数概率),可能不总是符合人类判断
- 在ChatCompletion API中支持有限,主要用于传统的Completion API
7. logit_bias
用法示例
# 获取token ID
response = openai.Completion.create(
model="text-davinci-003",
prompt="",
max_tokens=0,
logprobs=0,
echo=True
)
# 设置logit_bias
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "描述一种水果"}],
logit_bias={
15339: 5, # 增加"苹果"的概率
9092: -100# 几乎禁止"香蕉"
}
)
使用场景
- 词汇控制:增加或减少特定词汇的使用概率
- 内容引导:引导模型讨论特定主题或使用特定术语
- 风格调整:通过偏好或避免某些词汇影响输出风格
- 内容过滤:减少不需要的词汇或主题
- 特定领域适应:增强模型在特定领域的表现
注意事项
- 需要知道具体token的ID,这通常需要额外的API调用或使用tokenizer
- 极端值(如100或-100)几乎会强制包含或排除相应的token
- 过度使用可能导致输出不自然或不连贯
- token是子词单元,不一定对应完整的单词,特别是非英语语言
- 复杂的logit_bias设置可能需要多次测试和调整
8. user
用法示例
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "推荐一本科幻小说"}],
user="user_123" # 用户标识符
)
使用场景
- 用户跟踪:在多用户系统中区分不同用户的请求
- 滥用监控:帮助API提供商检测潜在的滥用模式
- 使用分析:跟踪不同用户的API使用情况
- 合规要求:满足某些监管或合规要求
注意事项
- user参数不会直接影响模型的输出内容
- 应使用一致的标识符来表示同一用户
- 标识符应该是匿名的,避免使用可识别个人身份的信息
- 在处理敏感或个人数据时,确保符合相关隐私法规
- 主要用于API提供商的监控和分析,对开发者的直接价值有限
Anthropic Claude特有参数
1. system
用法示例
response = anthropic.messages.create(
model="claude-3-sonnet-20240229",
system="你是一位专业的科学顾问,专注于提供准确、基于证据的信息。避免使用技术术语,用简单的语言解释复杂概念。不要讨论政治话题。",
messages=[{"role": "user", "content": "解释黑洞是什么以及它们如何形成"}]
)
使用场景
- 角色定义:设置模型的身份、专业领域或角色
- 行为指导:定义模型应如何回应、使用什么语气或风格
- 内容限制:指定模型应避免的主题或内容类型
- 格式控制:要求模型使用特定格式(如JSON、表格等)
- 特殊指令:提供不希望作为对话一部分显示的背景信息或指导
注意事项
- system参数在Claude中是单独参数,而不是messages数组的一部分(与OpenAI不同)
- system指令对模型行为有持久影响,适用于整个对话
- 过长或过于复杂的system指令可能不会被完全遵循
- system指令应清晰、具体,避免模糊或矛盾的指导
- 如果system指令与用户请求冲突,模型可能会优先考虑用户请求
- 定期检查system指令的效果,必要时进行调整
Google Gemini特有参数
1. tools 和 toolConfig
用法示例
# 定义一个函数工具
weather_tool = {
"name": "get_current_weather",
"description": "获取指定位置的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如'北京'或'上海'"
}
},
"required": ["location"]
}
}
# 使用工具
response = model.generate_content(
"北京今天的天气怎么样?",
generation_config=genai.GenerationConfig(),
tools=[weather_tool],
tool_config={"function_calling_config": {"mode": "auto"}}
)
# 处理工具调用
if response.candidates[0].content.parts[0].function_call:
function_call = response.candidates[0].content.parts[0].function_call
function_name = function_call.name
function_args = json.loads(function_call.args)
# 实际调用外部API获取天气数据
weather_data = get_weather_data(function_args["location"])
# 将结果返回给模型
response = model.generate_content(
[
{"role": "user", "parts": ["北京今天的天气怎么样?"]},
{"role": "model", "parts": [{"function_call": function_call}]},
{"role": "function", "parts": [{"function_response": json.dumps(weather_data)}]}
]
)
使用场景
- 外部数据访问:获取实时信息,如天气、股票价格、新闻等
- API集成:调用外部API执行特定任务
- 数据处理:执行计算、数据转换或分析
- 动态内容生成:基于外部数据生成内容
- 多步骤任务:执行需要多个步骤或外部交互的复杂任务
注意事项
- 工具定义应清晰、具体,包括准确的参数描述
- 处理工具调用需要额外的代码逻辑,增加了实现复杂性
- 工具调用可能增加API交互的延迟,影响用户体验
- 安全考虑:确保工具只执行预期的操作,避免潜在的安全风险
- 错误处理:需要妥善处理工具调用可能出现的错误
- 工具配置可以控制调用行为,如自动调用或仅在明确请求时调用
2. safetySettings
用法示例
# 定义安全设置
safety_settings = [
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_ONLY_HIGH"
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_LOW_AND_ABOVE"
}
]
# 使用安全设置
response = model.generate_content(
"讨论互联网安全问题",
safety_settings=safety_settings
)
使用场景
- 内容审核:控制生成内容的安全性和适当性
- 特定受众适配:为不同年龄段或敏感度调整内容过滤级别
- 特定领域应用:在医疗、法律等领域允许讨论某些通常受限的主题
- 教育内容:在教育环境中允许讨论敏感主题,同时保持适当的界限
- 内容政策实施:实施特定的内容政策或指南
注意事项
- 不同安全类别可以设置不同的阈值级别
- 过于严格的安全设置可能过度限制有用内容
- 过于宽松的安全设置可能导致不适当内容生成
- 安全设置不能完全替代人工审核,特别是对于高风险应用
- 安全类别和阈值的定义可能随时间变化,需要关注API文档更新
- 在处理敏感主题时,应谨慎测试安全设置的效果
3. responseMimeType 和 responseSchema
用法示例
# 定义JSON响应架构
response_schema = {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "产品名称"
},
"price": {
"type": "number",
"description": "产品价格(美元)"
},
"features": {
"type": "array",
"items": {
"type": "string"
},
"description": "产品特点列表"
}
},
"required": ["name", "price", "features"]
}
# 请求JSON格式的响应
response = model.generate_content(
"创建一个智能手表的产品描述",
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
response_schema=response_schema
)
)
# 解析JSON响应
product_info = json.loads(response.text)
print(f"产品名称: {product_info['name']}")
print(f"价格: ${product_info['price']}")
print("特点:")
for feature in product_info['features']:
print(f"- {feature}")
使用场景
- 结构化数据生成:生成符合特定架构的JSON或其他结构化数据
- API集成:生成可直接用于其他API的格式化输出
- 数据提取:从非结构化文本中提取结构化信息
- 表单填充:生成符合特定表单或数据模型的数据
- 配置生成:生成符合特定格式的配置文件
注意事项
- 设置responseSchema时必须同时设置兼容的responseMimeType
- 架构应清晰、具体,避免过于复杂或嵌套过深
- 复杂架构可能需要更详细的描述来确保正确生成
- 模型可能不总是完全遵循架构,应进行验证和错误处理
- 对于非常特定或复杂的架构,可能需要在提示中提供示例
- 不同的MIME类型有不同的用途和限制,选择最适合需求的类型
4. responseModalities
用法示例
# 请求仅文本响应
response_text_only = model.generate_content(
"描述一个热带雨林场景",
generation_config=genai.GenerationConfig(
response_modalities=["text"]
)
)
# 请求多模态响应(如果模型支持)
response_multimodal = model.generate_content(
"描述一个热带雨林场景",
generation_config=genai.GenerationConfig(
response_modalities=["text", "image"] # 注意:需要支持多模态输出的模型
)
)
使用场景
- 限制输出类型:确保模型只返回特定类型的内容
- 多模态生成:请求包含文本和其他模态(如图像)的响应
- 特定应用需求:满足只能处理特定类型内容的应用需求
- 资源优化:避免生成不需要的模态内容,节省资源
注意事项
- 不是所有模型都支持多模态输出,需要检查模型能力
- 空列表等同于仅请求文本
- 如果请求的模态与模型支持的任何组合都不匹配,会返回错误
- 多模态输出可能需要特殊的前端处理逻辑
- 在请求多模态输出时,可能需要更详细的提示来指导每种模态的内容
5. candidateCount
用法示例
# 生成多个候选回答
response = model.generate_content(
"提供三种不同的周末活动建议",
generation_config=genai.GenerationConfig(
candidate_count=3, # 生成3个不同的回答
temperature=1.0 # 使用较高温度增加多样性
)
)
# 访问多个候选回答
for i, candidate in enumerate(response.candidates):
print(f"建议 {i+1}:")
print(candidate.content.text)
print()
使用场景
- 创意生成:获取多个创意想法或方案
- 多样化回答:提供不同角度或风格的回答
- A/B测试内容:生成多个版本进行测试
- 增强用户选择:让用户从多个选项中选择最喜欢的回答
- 集成学习:使用多个候选回答实现集成或投票机制
注意事项
- 增加candidateCount会增加API调用的计算成本和响应时间
- 为确保生成的多个回答足够不同,通常应同时设置较高的temperature值
- 不适用于Gemini 1.0系列等较早的模型
- 处理多个候选回答需要额外的应用逻辑
- 在某些情况下,多个候选回答可能相似或重复
6. seed
用法示例
# 使用固定种子生成内容
response1 = model.generate_content(
"写一个关于太空探险的短故事",
generation_config=genai.GenerationConfig(
temperature=0.7,
seed=42# 固定种子
)
)
# 使用相同种子再次生成,应得到相似结果
response2 = model.generate_content(
"写一个关于太空探险的短故事",
generation_config=genai.GenerationConfig(
temperature=0.7,
seed=42# 相同的固定种子
)
)
# 检查两次生成的内容是否相似
print("内容1:", response1.text[:100], "...")
print("内容2:", response2.text[:100], "...")
使用场景
- 可重现性:确保在相同输入和参数下获得相同或相似的输出
- 测试和调试:在开发过程中比较不同参数设置的效果
- 用户体验一致性:确保相同查询的用户获得一致的回答
- 质量控制:在部署前测试和验证模型输出
- A/B测试:控制变量,只改变特定参数进行比较
注意事项
- 即使使用相同的seed,输出也可能不完全相同,特别是在不同的API版本或模型更新后
- seed参数主要用于测试和开发,不应依赖它来实现关键业务逻辑
- 不设置seed会使用随机生成的种子,导致每次调用产生不同的结果
- 在生产环境中,通常建议不设置seed,以获得更多样化的输出
- seed值的范围可能有限制,查阅最新API文档了解具体限制
总结与最佳实践
通过对OpenAI GPT、Anthropic Claude和Google Gemini三个主流大语言模型API参数的详细分析,我们可以总结出以下关键点和最佳实践:
关键发现
-
共同参数:尽管不同模型的API设计有所不同,但它们共享许多核心参数,如模型选择、输入格式、最大输出长度、温度控制和采样方法等。这些共同参数反映了大语言模型生成过程的基本原理。
-
特有功能:每个模型都有其独特的参数和功能,反映了各自的设计理念和优势领域:
- OpenAI GPT提供了更多控制生成过程的细节参数(如logprobs、best_of等)
- Anthropic Claude强调简洁的API设计和系统指令的灵活性
- Google Gemini注重工具集成、安全控制和结构化输出
- 参数交互:许多参数之间存在相互影响,如temperature和top_p、frequency_penalty和presence_penalty等。理解这些参数的交互对于优化模型输出至关重要。
最佳实践
- 参数选择
-
需要精确推理:考虑GPT-4或Claude Opus
-
需要长上下文:考虑支持更长上下文窗口的模型
-
需要多模态能力:选择支持图像等输入的模型
-
需要工具使用:考虑Gemini或支持函数调用的GPT模型
-
事实性任务:低temperature/top_p,高精度设置
-
创意任务:高temperature/top_p,更多样化设置
-
代码生成:低temperature,可能需要特定的停止序列
-
长文本生成:适当的频率/存在惩罚以避免重复
-
任务导向选择:根据任务类型选择适当的参数设置:
-
模型特性匹配:了解不同模型的强项,选择最适合任务的模型:
- 优化策略
- 迭代调整:通过小步骤调整参数,观察效果,而不是一次性大幅改变
- A/B测试:为关键应用场景测试不同参数组合,找出最佳设置
- 参数组合:了解哪些参数可以协同工作,哪些参数应避免同时调整
- 默认值优先:除非有特定需求,否则从默认参数值开始,然后根据需要调整
- 提示工程与参数设置结合
- 提示优先:首先优化提示内容和结构,然后再调整生成参数
- 明确指导:在提示中明确指定期望的输出格式和风格,减少对参数的依赖
- 分步骤提示:对于复杂任务,将其分解为多个步骤,每个步骤使用适当的参数设置
- 系统指令:充分利用系统指令(OpenAI的system role或Claude的system参数)设置基础行为
- 成本与性能平衡
- token优化:通过设置适当的max_tokens限制输出长度,控制API调用成本
- 模型选择:根据任务复杂度选择适当的模型,不要过度使用高级模型
- 批处理:在可能的情况下,使用批处理而不是单独请求
- 缓存策略:对于常见查询,实施缓存策略以减少API调用
- 安全与责任使用
- 内容过滤:使用适当的安全设置(如Gemini的safetySettings)控制输出内容
- 用户反馈:建立机制收集用户对模型输出的反馈,持续改进参数设置
- 监控与审计:监控API使用情况和模型输出,确保符合预期和政策
- 备份策略:为关键应用准备备份模型或降级策略,以应对API变更或中断
通过理解和应用这些最佳实践,开发者可以更有效地利用大语言模型API,创建更高质量、更可靠的AI应用。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包:
- ✅ 从零到一的 AI 学习路径图
- ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
- ✅ 百度/阿里专家闭门录播课
- ✅ 大模型当下最新行业报告
- ✅ 真实大厂面试真题
- ✅ 2025 最新岗位需求图谱
所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》,下方扫码获取~
① 全套AI大模型应用开发视频教程
(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)
② 大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!
③ 大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。
④ AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
⑤ 大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。
⑥ 大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
以上资料如何领取?
为什么大家都在学大模型?
最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!
不出1年,“有AI项目经验”将成为投递简历的门槛。
风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
以上全套大模型资料如何领取?
更多推荐
所有评论(0)