【动手学大模型开发】使用 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 额度,点击免费领取

领取免费试用包后,点击进入控制台并创建应用,创建完成后,就可以看到我们获取到的 APPIDAPISecret 和 APIKey 了:

星火提供了两种调用模型的方式,一种是 SDK 方式调用,上手难度小,推荐初学者使用;另一种是 WebSocket 方式调用,对企业友好,但对初学者、新手开发者来说调用难度较大。下面会具体介绍这两种调用方式。

3.2 通过 SDK 方式调用(推荐使用)

首先执行以下代码,将密钥加载到环境变量中。

import os

from 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 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 respCopy to clipboardErrorCopied
# 这里直接打印输出了正常响应内容,在生产环境中,需要兼容处理响应异常的情况
get_completion("你好").generations[0][0].textCopy 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 函数的入参 appidapi_secretapi_key

执行 python sparkAPI.py,可以得到如下的输出结果:

可以注意到,官方示例的输出结果中除了 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())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 responseCopy to clipboardErrorCopied
get_completion("你好")Copy to clipboardErrorCopied
你好!有什么我能帮忙的吗?Copy to clipboardErrorCopied

需要注意的是,在官方示例 sparkAPI.py 文件中,temperature 参数并不支持外部传入,而是固定值为 0.5,如果不想使用默认值,可以通过修改源代码实现支持外部参数传入,这里就不额外讲解了。

### 关于大型语言模型API文档和服务 对于希望集成或利用大型语言模型(LLM)能力的应用程序开发者而言,访问高质量的API文档和支持服务至关重要。这些资源不仅提供了技术细节,还指导如何有效地部署和管理基于LLM的服务。 #### 主要提供商及其特点 许多云服务平台提供专门针对LLM优化过的API接口以及配套的支持服务: - **阿里云** 提供了对企业级大语言模型加速解决方案的支持,通过NVIDIA NIM容器化工具简化部署流程[^4]。 - **Google Cloud AI Platform** 支持多种机器学习框架,并允许用户轻松创建自定义预测端点来调用训练好的LLM模型[^2]。 - **AWS SageMaker** 同样支持主流ML库如TensorFlow、PyTorch等,并且内置了对大规模分布式训练的良好支持,使得构建高性能的语言处理应用成为可能[^3]。 #### 开发者友好特性 为了提高开发效率并降低进入门槛,优秀的LLM API通常具备以下特征: - **详尽的官方文档**:包括但不限于快速入门指南、最佳实践建议和技术参考手册。 - **丰富的客户端SDKs**:覆盖Python、Java等多种编程语言环境下的便捷接入方式。 - **实时在线帮助中心**:随时解答常见疑问并向用户提供最新资讯更新。 ```python import requests def call_llm_api(prompt_text): url = "https://api.example.com/v1/llm" headers = {"Authorization": "Bearer YOUR_API_KEY"} payload = { 'prompt': prompt_text, 'max_tokens': 50 } response = requests.post(url, json=payload, headers=headers) return response.json() ``` 此代码片段展示了如何使用Python向假设中的LLM API发送请求并获取响应数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值