采集系统定时向大模型提交问题集时,常遇到认证失效、流式中断、响应格式不一致、限流和超时等问题。本文以腾讯混元大模型为例,从认证、SDK集成、流式输出、结构化响应到错误处理,介绍如何稳定调用API并处理常见异常。适合需要批量或实时调用混元API的开发者。前提:已开通腾讯混元大模型服务,获取SecretId和SecretKey。
假设你有一个定时任务,每天向混元提交100个问题,期望返回结构化的品牌提及数据。上线第一天就遇到认证失败、流式响应中断、部分回答无法解析为JSON。这些问题单独看都不复杂,但组合在一起就需要一个稳定的调用模块来兜底。
采集系统的模型调用模块分为三层:
本文聚焦调用层和解析层。
pip install tencentcloud-sdk-python-hunyuan使用SecretId和SecretKey初始化客户端。密钥应保存在环境变量或密钥管理服务中,不硬编码。
import os
from tencentcloud.common import credential
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
secret_id = os.environ.get("TENCENT_SECRET_ID")
secret_key = os.environ.get("TENCENT_SECRET_KEY")
cred = credential.Credential(secret_id, secret_key)
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou")地域参数影响可用性和延迟,生产环境应选择与采集服务相同的地域。
混元支持流式(SSE)和非流式两种模式。采集场景下,如果不需要实时展示,推荐使用非流式,因为返回完整回答后直接解析,逻辑更简单。流式适合需要低首字延迟的场景,但需要处理事件拼接。
def call_hunyuan_sync(prompt: str) -> str:
req = models.ChatCompletionsRequest()
req.Model = "hunyuan-pro" # 具体模型版本请根据实际环境调整
req.Messages = [{"Role": "user", "Content": prompt}]
req.Stream = False
resp = client.ChatCompletions(req)
return resp.Choices[0].Message.Content非流式返回完整回答,适合不需要实时展示的场景。但响应时间可能较长,需设置超时。
def call_hunyuan_stream(prompt: str) -> str:
req = models.ChatCompletionsRequest()
req.Model = "hunyuan-pro"
req.Messages = [{"Role": "user", "Content": prompt}]
req.Stream = True
resp = client.ChatCompletions(req)
full_content = ""
for event in resp:
if event.Choices:
delta = event.Choices[0].Delta
if delta and delta.Content:
full_content += delta.Content
return full_content流式返回事件流,需要逐事件拼接。注意处理事件中的索引和结束标记。
采集系统需要从回答中提取结构化字段,如品牌名称、推荐理由等。可以要求模型以JSON格式返回,但需处理格式异常。
def parse_response(content: str) -> dict:
import json
try:
return json.loads(content)
except json.JSONDecodeError:
import re
match = re.search(r'```(?:json)?\s*([\s\S]*?)\s*```', content)
if match:
return json.loads(match.group(1))
else:
raise ValueError("无法解析为JSON")模型可能返回Markdown包裹的JSON,需要兼容处理。生产环境应记录原始回答以便复查。
常见错误包括:认证失败、限流、超时、模型不存在。需要分类处理。
import time
from tencentcloud.common.exception import TencentCloudSDKException
def call_with_retry(prompt: str, max_retries=3):
for attempt in range(max_retries):
try:
return call_hunyuan_sync(prompt)
except TencentCloudSDKException as e:
if "RequestLimitExceeded" in str(e):
wait = 2 ** attempt
time.sleep(wait)
continue
elif "AuthFailure" in str(e):
raise # 认证失败不重试
else:
if attempt < max_retries - 1:
time.sleep(1)
continue
else:
raise限流时指数退避,认证失败直接抛出,其他错误重试有限次数。
正常情况下应当看到以下现象:
可能原因:模型版本不支持流式,或请求参数错误。检查Model字段和Stream参数。
可能原因:模型返回格式不符合预期。建议在prompt中明确指定输出格式,并添加示例。
可能原因:模型响应时间长,或网络延迟。设置合理的超时时间,如30秒。
本文以腾讯混元为例,介绍了AI回答采集中的模型调用工程实践,包括认证、SDK使用、流式输出、结构化响应和错误处理。关键实现是封装稳定的调用函数,处理流式拼接和JSON解析,并实现分类重试。适用于需要批量调用混元API的采集系统。需要注意密钥安全、成本控制和限流处理。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。