用 Python 在华为云 MaaS 上搭一个知识库问答助手:从分块到流式输出
今天把公司内部的一份运维手册做成了问答助手,整个链路没有自己训模型,全部跑在华为云上。记录一下从 0 到 1 的关键几步,代码都是 Python。
一、先想清楚"检索什么"
知识库问答的效果,八成取决于检索质量,而不是模型大小。我的做法是先把 200 多页 PDF 转成纯文本,再按语义段落切分,而不是按固定 500 字硬切。经验值:每块 300~500 字,块与块之间保留 80 字左右的重叠;标题作为元数据单独存一份,检索时把标题拼回块首,能明显减少答非所问。
二、分块之后做向量化
文本块通过 embedding 接口转成向量,落到向量库里。我这边数据量不大(约 3000 块),用一个轻量的本地向量索引就够了,没必要上分布式。检索时先按向量召回 Top 8,再用关键词命中做一次重排,把章节号、参数名这类精确匹配的结果顶上来,实测准确率提升比较明显。
三、调用 MaaS 做生成
生成这一步用华为云 MaaS 提供的模型服务,不需要自己部署推理实例,按 token 计费,调试成本很低。核心代码只有几行:
from openai import OpenAI
client = OpenAI(api_key=AK, base_url=MAAS_ENDPOINT)
resp = client.chat.completions.create(
model="your-model-name",
messages=[{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": prompt}],
temperature=0.2,
)
print(resp.choices[0].message.content)
提示词里我固定了三件事:只能依据给定材料回答;材料里没有就直说不知道;回答末尾列出引用的块编号。三条一加,胡编的情况基本消失。
四、流式输出与超时处理
命令行里等十秒才出结果,体验很差。改成 stream=True 后边生成边打印,首字延迟降到 1 秒以内。这里要处理两件事:一是网络中断后的重试,别把半截回答当成完整答案;二是单次请求的超时设置,建议 60 秒,超时后降级成"直接返回召回原文片段",用户至少能拿到资料,而不是一个报错。
五、上线前踩过的三个坑
第一,PDF 里的表格被拆成了乱序文本,后来改成按行提取再拼装;第二,分块时把代码块和正文切开了,导致回答缺上下文;第三,没有做并发限制,批量测试时把配额打满,接口直接返回 429。
整体算下来,一个能用的小助手两三天就能跑通。真正花时间的是数据清洗和提示词打磨,而不是模型本身。
- 点赞
- 收藏
- 关注作者
评论(0)