从零到一:用华为云 AI DevSpace + CodeArts 构建一个可用的智能问答助手
一、为什么要写这篇
很多同学在拿到“AI 开发”相关任务时,第一反应是去找一个现成的 Demo,但真正的能力成长来自“从需求到上线”的完整闭环。本文以构建一个面向企业内部知识库的智能问答助手为例,完整记录在华为云 AI DevSpace 上完成环境搭建、模型接入、检索增强(RAG)、提示词工程、联调与发布的全过程,并给出可直接复用的关键代码与踩坑总结,帮助你把“会用工具”变成“能交付作品”。
二、整体方案与技术选型
系统的核心链路是:用户提问 → 意图理解 → 向量检索召回相关文档片段 → 拼接上下文交给大模型生成 → 返回带引用的答案。技术选型上:
- 开发环境:华为云 AI DevSpace,开箱即用,省去本地配环境的成本,内置常用工具链与模型调用能力;
- 模型服务:通过平台提供的模型接口调用对话模型,避免自建推理集群;
- 检索层:对知识文档做切分与向量化,落地为轻量向量索引,实现 RAG;
- 应用层:一个轻量 Web 服务,提供提问接口与前端交互页面。
三、关键实现步骤
3.1 文档切分与向量化
RAG 效果的好坏,很大程度取决于切分策略。我们不采用“定长截断”,而是按语义段落切分并保留重叠,避免把一句话切成两半导致语义丢失。核心思路:先按标题层级与空行分段,再对超长段落做带 overlap 的二次切分。
def split_docs(text, max_len=500, overlap=80):
paras = [p.strip() for p in text.split("\n\n") if p.strip()]
chunks = []
for p in paras:
if len(p) <= max_len:
chunks.append(p)
else:
start = 0
while start < len(p):
chunks.append(p[start:start + max_len])
start += max_len - overlap
return chunks
3.2 提示词工程:让模型“只依据检索内容作答”
智能问答最大的坑是幻觉。我们通过系统提示词强约束:只能依据提供的上下文回答,找不到就说不知道,并要求给出引用来源。一个经过实践打磨的提示词模板如下:
你是一名严谨的企业知识助手。请仅依据【参考资料】回答问题:
1) 若资料无法回答,请直接回复“根据现有资料无法确定”,不要编造;
2) 回答后用 [序号] 标注引用来源;
3) 语言简洁、条理清晰,必要时分点说明。
【参考资料】
{context}
【用户问题】
{question}
3.3 检索 + 生成的编排
把“召回”和“生成”串起来,形成一次完整问答。伪代码如下,重点是控制送入模型的上下文长度,避免超出窗口:
def answer(question, top_k=4):
hits = vector_store.search(question, top_k=top_k)
context = build_context(hits) # 拼接并去重
prompt = PROMPT_TEMPLATE.format(context=context, question=question)
return llm.chat(prompt)
四、联调与效果验证
联调阶段建议准备一组“金标准问题”,覆盖三类场景:能被资料直接回答、需要跨文档综合、资料中没有答案。前两类验证检索与整合能力,第三类专门检验是否会“胡说”。实测中,加入引用约束后,第三类问题的“编造率”显著下降;对跨文档问题,把 top_k 从 3 调到 5 并加入重排(re-rank)后,答案完整度提升明显。
五、踩坑与经验总结
- 切分比模型更重要:多数“答非所问”其实是检索没召回对,先优化切分与召回,再考虑换更大的模型。
- 上下文不是越多越好:塞太多片段会稀释关键信息,控制 top_k 并做去重、重排收益更大。
- 把“不知道”当成一等公民:一个能诚实说不知道的助手,比一个自信胡说八道的助手更可信。
- 开发环境用云上:AI DevSpace 免去环境配置,把时间留给真正重要的算法与产品逻辑。
六、小结
用一个可交付的小作品串起“环境—模型—检索—提示词—联调—发布”的完整链路,是提升 AI 工程能力最有效的方式。本文的方案可以直接迁移到客服问答、内部知识库、文档助手等场景。欢迎在评论区交流你的实现,一起把作品打磨得更好。
- 点赞
- 收藏
- 关注作者
评论(0)