用0.7×向量相似度+0.3×BM25关键词的混合评分构建RAG,配合smolagents的CodeAgent强制模型不依赖预训练知识,严格限定回答范围。
我最近构建了一个"Agentic AI Knowledge Assistant",它将"检索增强生成(RAG)、混合搜索和 LLM Agent"结合起来,专门从预定义的知识库中回答问题。
这个项目的主要目标之一是解决 LLM 应用中的一个常见问题:当知识库中没有所需信息时,模型不应该使用其通用的预训练知识来回答问题。
该系统遵循"检索优先"的方法:用户问题 → 混合检索 → 相关上下文 → AI Agent → 最终答案
知识库使用"LangChain 的 RecursiveCharacterTextSplitter"被分割成更小的块。每个块使用以下模型转换为向量嵌入:
sentence-transformers/all-MiniLM-L6-v2
对于检索,我实现了两种方法:
FAISS 用于语义向量搜索
BM25 用于基于关键词的搜索
这些方法通过加权混合评分机制组合:
Hybrid Score = 0.7 × Vector Score + 0.3 × BM25 Score
这使系统能够同时受益于语义相似性和精确关键词匹配。
工作流程如下:
用户查询
↓
混合搜索
↓
FAISS || BM25
向量搜索 || 关键词搜索
↓
搜索
↓
相关知识库块
↓
检索到的上下文
↓
Qwen 语言模型
↓
最终答案
检索系统通过自定义的 knowledge_base_search() 工具暴露给 Agent。该项目使用 smolagents 的 CodeAgent 以及 Qwen/Qwen2.5-72B-Instruct 模型进行响应生成。Agent 在生成响应之前从知识库中检索相关信息。
该项目最重要的特性之一是严格的仅知识库方法。助手被指示不要使用:
如果知识库不包含足够的信息,预期的响应是:
"The knowledge base does not contain enough content to answer this question."
这使得系统更适合需要将响应保持在受控信息域内的应用。
构建这个项目帮助我理解了 AI 应用的不同组件如何协同工作,而不是将 LLM 视为独立系统。
特别是,我获得了以下方面的实践经验:
我接下来想实现的一些改进包括:
这个项目是一次很好的实践体验,帮助我理解如何将 RAG + 混合搜索 + Agentic AI + LLM 结合起来,构建一个更具可控性的 AI 助手。