上个月接手一个交接质量很差的老项目:接口文档、设计文档、会议纪要散落在几十个 Markdown 文件里,加起来 300 多页。新人问我「token 过期策略是什么」,我自己都要翻半小时。后来干脆把文档喂给大模型做问答,用的是 claude-sonnet-4-6——它的长上下文(200K token 级别)正好适合这种活。下面是我实际跑通的做法。
需要一个 OpenAI 兼容的调用入口和 API Key。入口来源几类都行:官方接口、自建网关(如开源的 OneAPI)、第三方统一接入(如 OneAPI、kkaiapi 等,自行实测选择),代码里统一用环境变量,不绑定任何一家。
文档总量在上下文窗口内(粗略估算:中文 1 字约 1~2 token),就直接塞。关键是用 XML 标签把「文档」和「问题」隔开,并且要求模型先引用原文再下结论——这一步能显著减少幻觉:
import os
from openai import OpenAI
client = OpenAI(base_url=os.getenv("BASE_URL"), # 形如 YOUR_BASE_URL/v1
api_key=os.getenv("API_KEY"))
doc = open("auth_spec.md", encoding="utf-8").read()
prompt = f"""<document>
{doc}
</document>
基于上面文档回答:鉴权模块的 token 过期与续期策略是什么?
要求:
1. 先引用文档中的相关原文段落;
2. 再用自己的话总结结论;
3. 文档里没写的,明确说"文档未提及",不要推测。"""
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": prompt}],
)
print(resp.choices[0].message.content)实测下来,「先引用后结论」+「没写就说没写」这两条要求,是回答可信度的分水岭。不加的话它偶尔会把通用最佳实践当成你项目的设定讲出来。
文档超出窗口,或者想控制单次成本,就分块提炼再合并:
def digest(client, text, size=60000):
parts = [text[i:i+size] for i in range(0, len(text), size)]
notes = []
for p in parts:
r = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user",
"content": f"提炼这段文档中的接口定义、参数约束和注意事项,保留原有编号:\n{p}"}])
notes.append(r.choices[0].message.content)
return "\n\n".join(notes) # 得到一份压缩版"文档摘要",后续问答都基于它先把 300 页压成一份几千字的「项目知识卡」,之后的日常问答都基于这份摘要,单次调用成本降了一个量级。
temperature=0,输出稳定很多。这套流程跑顺之后,新人提问基本不用再找我了:能在文档里找到答案的,模型连原文位置一起给出;找不到的,它会老实说没有——这比一个「什么都敢答」的助手有用得多。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。