【动手学大模型开发】使用 LLM API:讯飞星火
🌈 嗨,我是青松,很高兴遇到你!
🌟 希望用我的经验,让每个人的AI学习之路走的更容易些~
🔥 专栏:大模型(LLMs)高频面题全面整理(★2025最新版★)| 动手学大模型开发
目录
3.1 API 申请指引
3.2 通过 SDK 方式调用(推荐使用)
3.3 通过 WebSocket 调用
讯飞星火认知大模型,由科大讯飞于 2023 年 5 月推出的中文大模型,也是国内大模型的代表产品之一。同样,受限于中文语境与算力资源,星火在使用体验上与 ChatGPT 还存在差异,但是,作为与文心不分伯仲的国内中文大模型,仍然值得期待与尝试。相较于存在显著资源、技术优势的百度,科大讯飞想要杀出重围,成为国内大模型的佼佼者,需要充分利用相对优势,至少目前来看,星火并未掉队。
3.1 API 申请指引
讯飞星火平台提供了 Spark3.5 Max、Spark4.0 Ultra 等多种模型的免费额度,我们可以在平台领取免费 tokens 额度,点击免费领取
:
领取免费试用包后,点击进入控制台并创建应用,创建完成后,就可以看到我们获取到的 APPID
、APISecret
和 APIKey
了:
星火提供了两种调用模型的方式,一种是 SDK 方式调用,上手难度小,推荐初学者使用;另一种是 WebSocket 方式调用,对企业友好,但对初学者、新手开发者来说调用难度较大。下面会具体介绍这两种调用方式。
3.2 通过 SDK 方式调用(推荐使用)
首先执行以下代码,将密钥加载到环境变量中。
import osfrom dotenv import load_dotenv, find_dotenv# 读取本地/项目的环境变量。# find_dotenv() 寻找并定位 .env 文件的路径
# load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())
Copy to clipboardErrorCopied
然后我们使用 SDK,封装一个 get_completion
函数供后续使用。
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler
from sparkai.core.messages import ChatMessagedef 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 messagesdef 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
Copy to clipboardErrorCopied
# 这里直接打印输出了正常响应内容,在生产环境中,需要兼容处理响应异常的情况
get_completion("你好").generations[0][0].text
Copy to clipboardErrorCopied
'你好!有什么我能帮忙的吗?'
Copy to clipboardErrorCopied
3.3 通过 WebSocket 调用
通过 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 ###")
Copy to clipboardErrorCopied
然后我们运行一下修改后的官方示例代码。注意:在运行之前,还需要把在上一节中获取到的 API 的密钥赋值给 main
函数的入参 appid
、api_secret
、api_key
。
执行 python sparkAPI.py
,可以得到如下的输出结果:
可以注意到,官方示例的输出结果中除了 LLM 的回答内容外,还包含标识回答结束(“#### 关闭会话”、“### close ###”)的打印日志,如果只想保留原始输出内容,可以通过修改源代码来进行优化。
我们基于 sparkAPI.py
文件,同样封装一个 get_completion
函数,用于后续章节的调用。
首先执行如下代码,读取 .env
文件的密钥配置。
import os
import sparkAPIfrom dotenv import load_dotenv, find_dotenv# 读取本地/项目的环境变量。# find_dotenv() 寻找并定位 .env 文件的路径
# load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())
Copy to clipboardErrorCopied
星火大模型 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
Copy to clipboardErrorCopied
get_completion("你好")
Copy to clipboardErrorCopied
你好!有什么我能帮忙的吗?
Copy to clipboardErrorCopied
需要注意的是,在官方示例 sparkAPI.py
文件中,temperature
参数并不支持外部传入,而是固定值为 0.5,如果不想使用默认值,可以通过修改源代码实现支持外部参数传入,这里就不额外讲解了。