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 全程不需要修改。

并发建议

  • 批量任务ThreadPoolExecutorasyncio + aiohttp 均可,但请求速率要控制在 10 次/秒以内,建议并发数不超过 5
  • 高峰期:遇到 503 noGpuAvailable 属正常排队信号,等待 3-5 秒重试即可,无需退避到分钟级

常见问题

现象原因处理
401 unauthorizedAPI Key 错误或未填 Bearer 前缀检查请求头 Authorization: Bearer YOUR_API_KEY
400 textTooLong单段超过1000字按语义拆分成多个自然段分别调用
requests.Timeout高峰期排队保持 timeout=180,重试 2-3 次
改写效果差多段合并成一次请求逐个自然段调用,标题/目录/参考文献/公式/代码/表格不要传入

下一步