用 Python 在华为云 MaaS 上搭一个知识库问答助手:从分块到流式输出

举报
yd_219600272 发表于 2026/10/31 09:20:24 2026/10/31
【摘要】 今天把公司内部的一份运维手册做成了问答助手,整个链路没有自己训模型,全部跑在华为云上。记录一下从 0 到 1 的关键几步,代码都是 Python。一、先想清楚"检索什么"知识库问答的效果,八成取决于检索质量,而不是模型大小。我的做法是先把 200 多页 PDF 转成纯文本,再按语义段落切分,而不是按固定 500 字硬切。经验值:每块 300~500 字,块与块之间保留 80 字左右的重叠;标...

今天把公司内部的一份运维手册做成了问答助手,整个链路没有自己训模型,全部跑在华为云上。记录一下从 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。


整体算下来,一个能用的小助手两三天就能跑通。真正花时间的是数据清洗和提示词打磨,而不是模型本身。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。