AI回答采集系统需要向多个模型发送问题并获取回答。本文以腾讯混元为例,实现一个可复用、可监控的模型调用模块,重点处理流式输出拼接、错误码分类、指数退避重试和成本监控。适合需要构建模型调用链路的开发者,前提是已开通腾讯混元API并获取SecretId和SecretKey。
在AI回答采集系统中,一次模型调用并不复杂,但采集系统需要处理多个问题并发、流式响应拼接、限流重试和异常恢复。本文只解决一个问题:如何以腾讯混元为例,封装一个稳定的模型调用模块,并说明每个环节的工程边界。
采集系统模型调用模块的输入输出如下:
pip install tencentcloud-sdk-python-hunyuan具体版本未提供,请根据项目实际环境和官方兼容性要求选择。
腾讯混元API使用SecretId和SecretKey进行签名认证。以下为客户端初始化示例:
from tencentcloud.common import credential
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
cred = credential.Credential("your_secret_id", "your_secret_key")
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou")这段代码创建了混元客户端。地域选择需要与API开通地域一致,否则会报错。生产环境建议将密钥保存在环境变量或密钥管理服务中,不要硬编码。如果使用环境变量,可以这样读取:
import os
secret_id = os.environ.get("HUNYUAN_SECRET_ID")
secret_key = os.environ.get("HUNYUAN_SECRET_KEY")
cred = credential.Credential(secret_id, secret_key)这种方式可以避免密钥泄露。
采集系统通常需要完整回答,因此需要拼接流式片段。以下是一个流式调用的关键实现:
req = models.ChatCompletionsRequest()
req.Model = "hunyuan-standard"
req.Messages = [
{"Role": "user", "Content": "请解释AI心智指数是什么?"}
]
req.Stream = True
resp = client.ChatCompletions(req)
full_content = ""
for chunk in resp:
if chunk.Choices and chunk.Choices[0].Delta and chunk.Choices[0].Delta.Content:
full_content += chunk.Choices[0].Delta.Content注意:流式响应中每个chunk的Choices列表可能为空,因此需要先检查chunk.Choices是否存在。如果直接访问chunk.Choices[0],在空列表时会抛出异常。
如果不需要流式,可以请求非流式响应,直接获取完整回答:
req.Stream = False
resp = client.ChatCompletions(req)
content = resp.Choices[0].Message.Content非流式响应适合采集系统,但可能因回答较长而超时,建议设置超时时间。
模型调用可能遇到网络超时、限流、参数错误等异常。以下为错误处理示例,包含指数退避重试:
from tencentcloud.common.exception import TencentCloudSDKException
import time
def call_with_retry(client, req, max_retries=3, base_delay=1):
for attempt in range(max_retries):
try:
resp = client.ChatCompletions(req)
return resp
except TencentCloudSDKException as e:
error_code = e.get_code()
error_msg = e.get_message()
# 记录错误信息
print(f"Attempt {attempt+1} failed: {error_code} - {error_msg}")
if error_code in ["LimitExceeded", "RequestLimitExceeded", "InternalError"]:
if attempt < max_retries - 1:
delay = base_delay * (2 ** attempt)
time.sleep(delay)
continue
else:
# 参数错误等,不重试
raise
raise Exception("Max retries exceeded")常见错误码处理差异:
LimitExceeded:账户配额超限,需要等待配额刷新或升级套餐。RequestLimitExceeded:请求频率超限,需要降低并发或增加间隔。InternalError:服务端临时错误,可重试。InvalidParameter:参数错误,不重试,需要检查请求参数。采集系统对稳定性要求高,需要设置超时时间:
from tencentcloud.common.http.http_client import HttpClient
http_client = HttpClient(timeout=30)
client.set_http_client(http_client)超时时间应根据模型响应速度调整。如果回答较长,30秒可能不够,可以适当增加。
正常情况下,调用返回后应检查:
resp.Choices是否非空验证示例:
if resp.Choices:
print("回答内容长度:", len(content))
print("Token消耗:", resp.Usage.TotalTokens)
else:
print("未获取到回答")本文以腾讯混元为例,实现了AI回答采集系统中的模型调用模块,重点解决了流式拼接的边界检查、错误码分类重试和指数退避。关键实现是封装一个可复用、可监控的调用函数,并处理超时、重试和异常。适用于需要稳定调用大模型的采集系统,但需要注意密钥安全、成本控制和日志脱敏。该模块不依赖特定云环境,可迁移到其他模型API。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。