赞
踩
Prompt 最初是 NLP(自然语言处理)研究者为下游任务设计出来的一种任务专属的输入模板,类似于一种任务(例如:分类,聚类等)会对应一种 Prompt
我们每一次访问大模型的输入为一个 Prompt,而大模型给我们的返回结果则被称为 Completion。
LLM 生成是具有随机性的,在模型的顶层通过选取不同预测概率的预测结果来生成最后的结果。我们一般可以通过控制 temperature 参数来控制 LLM 生成结果的随机性与创造性。
Temperature 一般取值在 0~1 之间,取值越高,预测的随机性越高,所有词被选择的可能性更大,会产生更有创意、多样化的文本
对于不同的问题与应用场景,我们可能需要设置不同的 temperature。
例如,在个性化 AI、创意营销文案生成等场景中,我们就更需要创意性,从而更倾向于将 temperature 设置为较高的值
System Prompt是大模型服务方为提升用户体验所设置的一种策略
在使用 ChatGPT API 时,你可以设置两种 Prompt:一种是 System Prompt,该种 Prompt 内容会在整个会话过程中持久地影响模型的回复,且相比于普通 Prompt 具有更高的重要性;另一种是 User Prompt,这更偏向于我们平时提到的 Prompt,即需要模型做出回复的输入
例如
{
"system prompt": "你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
"user prompt": "我今天有什么事务?"
}
讯飞星火认知大模型,由科大讯飞于 2023 年 5 月推出的中文大模型,也是国内大模型的代表产品之一。同样,受限于中文语境与算力资源,星火在使用体验上与 ChatGPT 还存在差异,但是,作为与文心不分伯仲的国内中文大模型,仍然值得期待与尝试。相较于存在显著资源、技术优势的百度,科大讯飞想要杀出重围,成为国内大模型的佼佼者,需要充分利用相对优势,至少目前来看,星火并未掉队。
import os from dotenv import load_dotenv, find_dotenv # 读取本地/项目的环境变量。 # find_dotenv() 寻找并定位 .env 文件的路径 # load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中 # 如果你设置的是全局的环境变量,这行代码则没有任何作用。 _ = load_dotenv(find_dotenv()) from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler from sparkai.core.messages import ChatMessage def gen_spark_params(model): ''' 构造星火模型请求参数 ''' spark_url_tpl = "wss://spark-api.xf-yun.com/{}/chat" model_params_dict = { # v1.5 版本 "v1.5": { "domain": "general", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v1.1") # 云端环境的服务地址 }, # v2.0 版本 "v2.0": { "domain": "generalv2", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v2.1") # 云端环境的服务地址 }, # v3.0 版本 "v3.0": { "domain": "generalv3", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v3.1") # 云端环境的服务地址 }, # v3.5 版本 "v3.5": { "domain": "generalv3.5", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v3.5") # 云端环境的服务地址 } } return model_params_dict[model] def gen_spark_messages(prompt): ''' 构造星火模型请求参数 messages 请求参数: prompt: 对应的用户提示词 ''' messages = [ChatMessage(role="user", content=prompt)] return messages def get_completion(prompt, model="v3.5", temperature = 0.1): ''' 获取星火模型调用结果 请求参数: prompt: 对应的提示词 model: 调用的模型,默认为 v3.5,也可以按需选择 v3.0 等其他模型 temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。 ''' spark_llm = ChatSparkLLM( spark_api_url=gen_spark_params(model)["spark_url"], spark_app_id=os.environ["SPARK_APPID"], spark_api_key=os.environ["SPARK_API_KEY"], spark_api_secret=os.environ["SPARK_API_SECRET"], spark_llm_domain=gen_spark_params(model)["domain"], temperature=temperature, streaming=False, ) messages = gen_spark_messages(prompt) handler = ChunkPrintHandler() # 当 streaming设置为 False的时候, callbacks 并不起作用 resp = spark_llm.generate([messages], callbacks=[handler]) return resp
通过 WebSocket 进行连接的方式相对来说配置较为复杂,讯飞给出了调用示例 ,点击对应的语言调用示例下载即可。这里我们以 Python 调用示例为例进行讲解,下载后我们可以得到一个 sparkAPI.py
文件,文件中包含了服务端封装和客户端调用的实现。
需要注意的是,直接运行官方示例的 sparkAPI.py
文件会有报错,需要做如下修改:
(1)注释掉如下行:import openpyxl
(代码中并未使用到这个包,如未安装,则会提示 ModuleNotFoundError);
(2)修改 on_close
函数(该函数接收 3 个入参),修改后的函数如下:
# 收到 websocket 关闭的处理
def on_close(ws, close_status_code, close_msg):
print("### closed ###")
然后我们运行一下修改后的官方示例代码。注意:在运行之前,还需要把在上一节中获取到的 API 的密钥赋值给 main
函数的入参 appid
、api_secret
、api_key
。
执行 python sparkAPI.py
,可以得到如下的输出结果:
![[appendix/Pasted image 20240620213656.png]]
可以注意到,官方示例的输出结果中除了 LLM 的回答内容外,还包含标识回答结束(“#### 关闭会话”、“### close ###”)的打印日志,如果只想保留原始输出内容,可以通过修改源代码来进行优化。
我们基于 sparkAPI.py
文件,同样封装一个 get_completion
函数,用于后续章节的调用。
首先执行如下代码,读取 .env
文件的密钥配置。
import os
import sparkAPI
from dotenv import load_dotenv, find_dotenv
# 读取本地/项目的环境变量。
# find_dotenv() 寻找并定位 .env 文件的路径
# load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())
星火大模型 API 当前有 V1.5、V2.0、V3.0 和 V3.5 四个版本,四个版本独立计量 tokens。get_completion
函数封装如下:
def gen_spark_params(model): ''' 构造星火模型请求参数 ''' spark_url_tpl = "wss://spark-api.xf-yun.com/{}/chat" model_params_dict = { # v1.5 版本 "v1.5": { "domain": "general", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v1.1") # 云端环境的服务地址 }, # v2.0 版本 "v2.0": { "domain": "generalv2", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v2.1") # 云端环境的服务地址 }, # v3.0 版本 "v3.0": { "domain": "generalv3", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v3.1") # 云端环境的服务地址 }, # v3.5 版本 "v3.5": { "domain": "generalv3.5", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v3.5") # 云端环境的服务地址 } } return model_params_dict[model] def get_completion(prompt, model="v3.5", temperature = 0.1): ''' 获取星火模型调用结果 请求参数: prompt: 对应的提示词 model: 调用的模型,默认为 v3.5,也可以按需选择 v3.0 等其他模型 temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。 ''' response = sparkAPI.main( appid=os.environ["SPARK_APPID"], api_secret=os.environ["SPARK_API_SECRET"], api_key=os.environ["SPARK_API_KEY"], gpt_url=gen_spark_params(model)["spark_url"], domain=gen_spark_params(model)["domain"], query=prompt ) return response
get_completion("你好")
# 你好!有什么我能帮忙的吗?
需要注意的是,在官方示例 sparkAPI.py
文件中,temperature
参数并不支持外部传入,而是固定值为 0.5,如果不想使用默认值,可以通过修改源代码实现支持外部参数传入,这里就不额外讲解了。
智谱 AI 是由清华大学计算机系技术成果转化而来的公司,致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B,并构建了高精度通用知识图谱,形成数据与知识双轮驱动的认知引擎,基于此模型打造了 ChatGLM(chatglm.cn)。
ChatGLM 系列模型,包括 ChatGLM-130B、ChatGLM-6B 和 ChatGLM2-6B(ChatGLM-6B 的升级版本)模型,支持相对复杂的自然语言指令,并且能够解决困难的推理类问题。其中,ChatGLM-6B 模型来自 Huggingface 上的下载量已经超过 300w(截至 2023 年 6 月 24 日统计数据),该模型在 Hugging Face (HF) 全球大模型下载榜中连续 12 天位居第一名,在国内外的开源社区中产生了较大的影响。
智谱的调用传参和其他类似,也需要传入一个 messages 列表,列表中包括 role 和 prompt。我们封装如下的 get_completion
函数,供后续使用。
智谱 AI 提供了 SDK 和原生 HTTP 来实现模型 API 的调用,建议使用 SDK 进行调用以获得更好的编程体验
读取环境变量代码略
from zhipuai import ZhipuAI client = ZhipuAI( api_key=os.environ["ZHIPUAI_API_KEY"] ) def gen_glm_params(prompt): ''' 构造 GLM 模型请求参数 messages 请求参数: prompt: 对应的用户提示词 ''' messages = [{"role": "user", "content": prompt}] return messages def get_completion(prompt, model="glm-4", temperature=0.95): ''' 获取 GLM 模型调用结果 请求参数: prompt: 对应的提示词 model: 调用的模型,默认为 glm-4,也可以按需选择 glm-3-turbo 等其他模型 temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。 ''' messages = gen_glm_params(prompt) response = client.chat.completions.create( model=model, messages=messages, temperature=temperature ) if len(response.choices) > 0: return response.choices[0].message.content return "generate answer error"
get_completion("你好")
# '你好!有什么可以帮助你的吗?如果有任何问题或需要咨询的事情,请随时告诉我。'
这里对传入 zhipuai 的参数进行简单介绍:
messages (list)
,调用对话模型时,将当前对话信息列表作为提示输入给模型;按照 {“role”: “user”, “content”: “你好”} 的键值对形式进行传参;总长度超过模型最长输入限制后会自动截断,需按时间由旧到新排序
temperature (float)
,采样温度,控制输出的随机性,必须为正数取值范围是:(0.0, 1.0),不能等于 0,默认值为 0.95。值越大,会使输出更随机,更具创造性;值越小,输出会更加稳定或确定
top_p (float)
,用温度取样的另一种方法,称为核取样。取值范围是:(0.0, 1.0) 开区间,不能等于 0 或 1,默认值为 0.7。模型考虑具有 top_p 概率质量 tokens 的结果。例如:0.1 意味着模型解码器只考虑从前 10% 的概率的候选集中取 tokens
request_id (string)
,由用户端传参,需保证唯一性;用于区分每次请求的唯一标识,用户端不传时平台会默认生成
建议您根据应用场景调整 top_p 或 temperature 参数,但不要同时调整两个参数
如何去使用 Prompt,以充分发挥 LLM 的性能?首先我们需要知道设计 Prompt 的原则,它们是每一个开发者设计 Prompt 所必须知道的基础概念。本节讨论了设计高效 Prompt 的两个关键原则:编写清晰、具体的指令和给予模型充足思考时间
用清晰、详尽的语言表达 Prompt,“Adding more context helps the model understand you better.”
使用各种标点符号作为“分隔符”
可以选择用
```,""",< >, ,:
等做分隔符,只要能明确起到隔断作用即可
提示词注入
LLM支持格式化输入,例如JSON
引导模型思考
指定步骤
给出自己的思考
//大模型的幻觉是一大缺陷
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。