基本概念
Prompt
Prompt 最初是 NLP(自然语言处理)研究者为下游任务设计出来的一种任务专属的输入模板,类似于一种任务(例如:分类,聚类等)会对应一种 Prompt
我们每一次访问大模型的输入为一个 Prompt,而大模型给我们的返回结果则被称为 Completion。
Temperature
LLM 生成是具有随机性的,在模型的顶层通过选取不同预测概率的预测结果来生成最后的结果。我们一般可以通过控制 temperature 参数来控制 LLM 生成结果的随机性与创造性。
Temperature 一般取值在 0~1 之间,取值越高,预测的随机性越高,所有词被选择的可能性更大,会产生更有创意、多样化的文本
对于不同的问题与应用场景,我们可能需要设置不同的 temperature。
例如,在个性化 AI、创意营销文案生成等场景中,我们就更需要创意性,从而更倾向于将 temperature 设置为较高的值
System Prompt
System Prompt是大模型服务方为提升用户体验所设置的一种策略
在使用 ChatGPT API 时,你可以设置两种 Prompt:一种是 System Prompt,该种 Prompt 内容会在整个会话过程中持久地影响模型的回复,且相比于普通 Prompt 具有更高的重要性;另一种是 User Prompt,这更偏向于我们平时提到的 Prompt,即需要模型做出回复的输入
例如
{
"system prompt": "你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
"user prompt": "我今天有什么事务?"
}
使用 LLM API
ChatGPT API
文心一言
讯飞星火
讯飞星火认知大模型,由科大讯飞于 2023 年 5 月推出的中文大模型,也是国内大模型的代表产品之一。同样,受限于中文语境与算力资源,星火在使用体验上与 ChatGPT 还存在差异,但是,作为与文心不分伯仲的国内中文大模型,仍然值得期待与尝试。相较于存在显著资源、技术优势的百度,科大讯飞想要杀出重围,成为国内大模型的佼佼者,需要充分利用相对优势,至少目前来看,星火并未掉队。
通过SDK调用
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
通过 Web Socket 调用
通过 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,如果不想使用默认值,可以通过修改源代码实现支持外部参数传入,这里就不额外讲解了。
使用智谱 GLM
智谱 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 Engineering
Prompt Engineering 的意义
如何去使用 Prompt,以充分发挥 LLM 的性能?首先我们需要知道设计 Prompt 的原则,它们是每一个开发者设计 Prompt 所必须知道的基础概念。本节讨论了设计高效 Prompt 的两个关键原则:编写清晰、具体的指令和给予模型充足思考时间
Prompt 设计的原则及使用技巧
原则一:编写清晰、具体的指令
用清晰、详尽的语言表达 Prompt,“Adding more context helps the model understand you better.”
使用各种标点符号作为“分隔符”
使用分隔符
可以选择用
```,""",< >, ,:
等做分隔符,只要能明确起到隔断作用即可
提示词注入
结构化的输出
LLM支持格式化输入,例如JSON
要求检查
提供少量示例
原则二:给模型时间去思考
引导模型思考
指定步骤
给出自己的思考
//大模型的幻觉是一大缺陷
标签:model,Prompt,url,universe,notes,llm,prompt,spark,模型 From: https://blog.csdn.net/2301_81944256/article/details/139843490