Python 接入降重降AI接口
Python 调用降重降AI API 完整示例:requests 带超时重试的基础调用、逐段落处理全文、complex-text-tools 字数预检、python-docx 脚注占位符提取与写回。
Python 接入降重降AI接口
用 Python 调用降重降AI接口,推荐使用 requests 库。接口一次改写同时完成降重和降AI,单次请求处理一个正文自然段(不超过1000字),详细参数说明见接口文档。
安装依赖
pip install requests
基础调用
以下代码包含超时控制与错误重试,可直接复制运行(替换 API_KEY):
import time
import requests
API_URL = "https://api.llmapi.fit/completion/v2/reduce"
API_KEY = "YOUR_API_KEY"
def reduce_paragraph(text: str, max_retries: int = 3) -> str:
"""改写单个正文段落,带超时与重试"""
for attempt in range(1, max_retries + 1):
try:
resp = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={"text": text},
timeout=180, # 高峰期智能排队最长约2分钟
)
if resp.status_code == 200:
data = resp.json()
if data.get("code") == "success":
return data["output_text"]
raise RuntimeError(f"业务错误: {data.get('code')} {data.get('message')}")
if resp.status_code in (429, 503):
# 429 请求过于频繁 / 503 GPU服务繁忙:等待后重试
time.sleep(4)
continue
# 400 参数或余额问题、401 密钥问题:不可重试,直接抛出
raise RuntimeError(f"HTTP {resp.status_code}: {resp.text}")
except requests.Timeout:
if attempt == max_retries:
raise
time.sleep(3)
raise RuntimeError("重试次数已用尽,请稍后再试")
逐段落处理全文
接口按段落级别改写,把论文的正文自然段逐个传入即可:
paragraphs = [
"第一个正文自然段……",
"第二个正文自然段……",
]
rewritten = []
for p in paragraphs:
rewritten.append(reduce_paragraph(p))
time.sleep(0.5) # 请求速率控制在 10 次/秒以内
字数预检:与接口一致的统计口径
接口按 Word 统计方式计字数(非字符数),发送前可在本地预检是否超过1000字,避免 textTooLong 错误。统计口径与接口一致的开源库是 complex-text-tools:
pip install complex-text-tools
from complex_text_tools import count_eff_len
text = "2024年2月14日"
print(count_eff_len(text)) # 6 —— 与 Word 统计接近,接口按此口径计费
处理 Word 文档脚注(python-docx)
论文段落常带脚注引用,直接发送会丢失。正确做法是把脚注引用替换为 [[FNn]] 占位符,改写后原样保留,写回时恢复(完整规范见接口文档第8节)。
python-docx 没有高层脚注 API,用 lxml 遍历段落的 XML 子元素即可提取:
from docx import Document
doc = Document("论文.docx")
paragraph = doc.paragraphs[0]
parts = []
fn_index = 0
for child in paragraph._p:
tag = child.tag
if tag.endswith("}t") and child.text:
# 普通文本
parts.append(child.text)
elif tag.endswith("}footnoteReference"):
# 脚注引用 -> 占位符,段内从 [[FN0]] 开始编号
parts.append(f"[[FN{fn_index}]]")
fn_index += 1
text_with_placeholders = "".join(parts)
提取结果示例:
国外研究方面,Zawaideh[[FN0]]将BIM与可解释机器学习相结合……
把 reduce_paragraph(text_with_placeholders) 的返回结果按占位符切分写回:文字段写入为新文本,[[FNn]] 处把原脚注引用(原 id)插回原位。word/footnotes.xml 全程不需要修改。
并发建议
- 批量任务:
ThreadPoolExecutor或asyncio + aiohttp均可,但请求速率要控制在 10 次/秒以内,建议并发数不超过 5 - 高峰期:遇到
503 noGpuAvailable属正常排队信号,等待 3-5 秒重试即可,无需退避到分钟级
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
401 unauthorized | API Key 错误或未填 Bearer 前缀 | 检查请求头 Authorization: Bearer YOUR_API_KEY |
400 textTooLong | 单段超过1000字 | 按语义拆分成多个自然段分别调用 |
requests.Timeout | 高峰期排队 | 保持 timeout=180,重试 2-3 次 |
| 改写效果差 | 多段合并成一次请求 | 逐个自然段调用,标题/目录/参考文献/公式/代码/表格不要传入 |