RAG 问答助手(结合向量检索和BM25关键词检索生成准确回答)

大模型RAG实战|混合检索:BM25检索+向量检索的LlamaIndex实现 目前,大模型RAG系统中普遍采用混合检索来提升检索准确性。针对要回答的问题,同时通过。 阅读详情

1. 项目概述

1.1 项目简介

本项目是一个基于 RAG (Retrieval-Augmented Generation) 技术的智能问答助手应用。通过上传文档构建知识库,用户可以基于文档内容进行提问,系统会检索相关文档片段并结合大语言模型生成准确回答。

1.2 核心功能

功能模块功能描述
文件上传支持多种文档格式上传(PDF、TXT、DOCX、DOC、MD)
文档分块将文档切分为合理大小的片段,便于向量检索
向量存储使用 Chroma 向量数据库存储文档嵌入向量
混合检索结合向量检索和 BM25 关键词检索,提高召回率
重排精排使用 CrossEncoder 对候选文档进行精排,提升相关性
智能问答基于检索到的文档内容,通过大语言模型生成回答

1.3 项目结构

rag-rerank-retriever-app/
├── app.py                    # 应用入口
├── requirements.txt          # 依赖列表
├── .env                      # 环境配置文件
├── config/                   # 配置模块
│   ├── prompt_data.py        # 提示词模板配置
│   ├── rerank_search.py      # 混合检索与重排逻辑
│   ├── split_documents.py    # 文档分块处理
│   └── vector_db_config.py   # 向量数据库配置
└── view/                     # 视图模块
    ├── index.py              # 主页面逻辑
    └── sidebar.py            # 侧边栏组件

2. 技术架构

2.1 整体架构

┌─────────────────────────────────────────────────────────────────┐
│                        用户界面 (Streamlit)                      │
│  ┌─────────────┐  ┌──────────────────────────────────────────┐ │
│  │  Sidebar    │  │              Main Chat Area               │ │
│  │  文件上传    │  │  用户提问 → 流式回答展示                   │ │
│  │  参数配置    │  │                                          │ │
│  └─────────────┘  └──────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────────┐
│                     业务逻辑层 (LangChain)                       │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │ DocSplitter  │→│ VectorDBConfig│→│ Hybrid Search        │  │
│  │ 文档分块处理  │  │ 向量数据库构建 │  │ 向量+BM25混合检索    │  │
│  └──────────────┘  └──────────────┘  └───────────┬────────────┘  │
│                                                   │              │
│                                        ┌──────────▼────────────┐  │
│                                        │ Rerank Search        │  │
│                                        │ CrossEncoder精排     │  │
│                                        └───────────┬────────────┘  │
│                                                   │              │
│                                        ┌──────────▼────────────┐  │
│                                        │ Prompt + LLM         │  │
│                                        │ 提示词组装+模型调用   │  │
│                                        └──────────────────────┘  │
└──────────────────────────────┬──────────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────────┐
│                        数据存储层                                │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │                    Chroma Vector DB                       │   │
│  │  文档向量存储 / 相似度检索 / 文档检索                      │   │
│  └──────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

2.2 核心技术栈

技术分类技术名称版本要求用途说明
前端框架Streamlit>=1.37.0快速构建交互式 Web 应用
大语言模型LangChain>=1.3.0LLM 应用开发框架
向量数据库Chroma>=0.3.21轻量级向量存储与检索
嵌入模型HuggingFace Embeddings-文本向量化(text2vec-base-chinese)
重排模型SentenceTransformers-CrossEncoder 精排(bge-reranker-v2-m3)
分词工具jieba3-中文分词,用于 BM25 检索
关键词检索rank_bm25-BM25 算法实现

3. 模块详细说明

3.1 应用入口 - app.py

职责: 应用启动入口,初始化 Streamlit 应用。

# 核心逻辑
from view.index import get_streamlit_app
get_streamlit_app()  # 调用主页面函数

问题: 调用 get_streamlit_app() 时未传递参数,但 index.py 中定义的函数签名为 get_streamlit_app(model, api_key),存在参数不匹配问题。

3.2 主页面 - view/index.py

职责: Streamlit 主页面逻辑,包含文档处理、聊天交互、检索与问答流程。

核心流程:

  1. 页面配置: 设置页面标题、图标和布局
  2. 侧边栏数据: 获取上传文件和配置参数
  3. 文档处理:
    • 计算文件哈希值作为缓存键
    • 使用 DocSplitter 进行文档分块
    • 使用 VectorDBConfig 构建向量数据库
  4. 聊天界面: 维护消息历史,展示对话
  5. 检索与回答:
    • 调用 hybrid_search 获取候选文档
    • 调用 rerank_search 进行精排
    • 组装 Prompt,调用 LLM 生成回答

关键代码片段:

# 混合检索 + 重排流程
candidates = hybrid_search(question, vectordb, k=k_value * 2)
final_results = rerank_search(question, candidates, top_k=k_value)
contexts = "\n\n".join(final_results)

3.3 侧边栏 - view/sidebar.py

职责: 提供文件上传和参数配置界面。

配置参数:

参数名称类型默认值范围说明
chunk_sizeint300100-1000每个文档片段的最大字符数
chunk_overlapint500-200相邻片段的重叠字符数
k_valueint31-10检索返回的文档数量

支持文件格式: txt、pdf、docx、doc、md、markdown

3.4 文档分块 - config/split_documents.py

职责: 将上传的文档切分为合适大小的文本片段。

类: DocSplitter

方法参数返回值说明
__init__chunk_size, chunk_overlap-初始化分块参数
split_documentsfiles, temp_dirList[Document]处理文件并返回分块后的文档列表
_get_loaderfile_name, file_pathLoader根据文件扩展名获取对应加载器

分块策略:

  • 使用 RecursiveCharacterTextSplitter
  • 支持多种分隔符:\n\n, \n, 。, !, ?, ., !, ?, , ``
  • 确保语义完整性的同时控制片段大小

文件加载器映射:

文件格式加载器来源模块
pdfPyPDFLoaderlangchain_classic.document_loaders
txtTextLoaderlangchain_classic.document_loaders
docxDocx2txtLoaderlangchain_classic.document_loaders
docUnstructuredWordDocumentLoaderlangchain_classic.document_loaders
md/markdownUnstructuredMarkdownLoaderlangchain_classic.document_loaders

3.5 向量数据库 - config/vector_db_config.py

职责: 配置和管理向量数据库,存储文档嵌入向量。

类: VectorDBConfig

方法参数返回值说明
__init__vector_db_type, vector_name-初始化数据库类型和名称
get_vector_db_configdocs, embeddingsChroma创建并返回向量数据库实例

实现细节:

  • 使用 Chroma 作为向量数据库
  • 每次构建时会删除旧的数据库目录,确保数据更新
  • 嵌入模型使用 shibing624/text2vec-base-chinese(中文支持)

3.6 混合检索与重排 - config/rerank_search.py

职责: 实现混合检索和重排算法,提高检索准确性。

3.6.1 混合检索 - hybrid_search

算法流程:

  1. 向量检索: 使用 Chroma 的 similarity_search 进行语义检索
  2. BM25 检索: 使用 jieba3 分词 + BM25Okapi 进行关键词检索
  3. 去重合并: 合并两种检索结果,去重后返回

关键代码:

def hybrid_search(question: str, vectordb: Chroma, k: int = 20) -> List[str]:
    # 向量检索
    vector_results = vectordb.similarity_search(question, k=k)
    
    # BM25 检索
    all_docs = vectordb.get(include=["documents"])["documents"]
    tokenized_corpus = [seg.cut_text(doc) for doc in all_docs]
    bm25 = BM25Okapi(tokenized_corpus)
    bm25_scores = bm25.get_scores(tokenized_question)
    
    # 去重合并
    seen = {}
    for doc in vector_docs + bm25_docs:
        seen[doc] = None
    return list(seen.keys())[:k]
3.6.2 重排精排 - rerank_search

算法流程:

  1. 构造输入: 将问题与每个候选文档配对 [(query, doc1), (query, doc2), ...]
  2. 计算得分: 使用 CrossEncoder 模型计算相关性得分
  3. 排序截取: 按得分降序排序,截取 top_k 文档

重排模型: BAAI/bge-reranker-v2-m3(中英双语支持)

3.7 提示词配置 - config/prompt_data.py

职责: 定义问答提示词模板。

指令模板:

你是一个知识库问答助手。
请根据以下资料回答问题。
如果资料中没有相关信息,请直接回复"抱歉,我不知道"。

提示词模板:

{instructions}

资料:
{contexts}

问题:{question}

请基于以上资料回答:

3.8 自定义回调 - config/custom_callback.py

职责: 定义 Streamlit 回调处理器,用于实时展示 ReAct 推理步骤。(自行加入到代码中,展示推理过程)

from langchain_classic.callbacks.base import BaseCallbackHandler
import re

class CustomStreamlitCallbackHandler(BaseCallbackHandler):
    """
    用于 st.status 的回调处理器,实时展示 ReAct 推理步骤。
    """

    # 关键词模式(支持中英文,冒号后允许空格)
    _PATTERNS = {
        "thought": r"(?:Thought|思考)\s*[::]\s*(.*?)(?=\s*(?:Action|行动)\s*[::]|$)",
        "action": r"(?:Action|行动)\s*[::]\s*(.*?)(?=\s*(?:Action Input|行动输入)\s*[::]|$)",
        "action_input": r"(?:Action Input|行动输入)\s*[::]\s*(.*?)(?=\s*(?:Observation|观察)\s*[::]|$)",
        "final_answer": r"(?:Final Answer|最终回答)\s*[::]\s*(.*?)$",
    }

    def __init__(self, write_func, show_tokens=False):
        self.write_func = write_func
        self.show_tokens = show_tokens
        self._token_buffer = "" if show_tokens else None

    def _emit(self, icon, title, content, code=True):
        """统一输出到 status,自动处理空内容"""
        if not content:
            content = "(无内容)"
        else:
            content = str(content)

        if code:
            markdown = f"{icon} **{title}**\n\n```text\n{content}\n```\n\n---"
        else:
            markdown = f"{icon} **{title}**\n\n{content}\n\n---"
        self.write_func(markdown)

    def _parse(self, text):
        """提取 Thought, Action, Action Input, Final Answer"""
        result = {}
        for key, pattern in self._PATTERNS.items():
            match = re.search(pattern, text, re.DOTALL)
            result[key] = match.group(1).strip() if match else None
        return result

    # -------------------- 回调事件 --------------------

    def on_llm_start(self, serialized, prompts, **kwargs):
        self.write_func("🔄 正在调用语言模型...")

    def on_llm_end(self, response, **kwargs):
        try:
            if not response.generations:
                return
            text = response.generations[0][0].text
            parsed = self._parse(text)

            if parsed["thought"]:
                self._emit("💭", "思考", parsed["thought"], code=False)
            if parsed["action"]:
                action_input = parsed["action_input"] or ""
                self._emit(
                    "🔧",
                    f"执行工具: {parsed['action']}",
                    f"输入: {action_input}" if action_input else "",
                    code=False,
                )
            if parsed["final_answer"]:
                self._emit("✅", "推理完成", "已生成最终回答,请查看上方聊天区域。", code=False)

            # 显示 token 流(调试)
            if self.show_tokens and self._token_buffer:
                self._emit("📜", "完整 token 流(调试)", self._token_buffer)
                self._token_buffer = ""

        except Exception as e:
            self.write_func(f"⚠️ 解析 LLM 输出出错: {e}")

    def on_tool_start(self, serialized, input_str, **kwargs):
        tool_name = serialized.get("name", "未知工具")
        self.write_func(f"🛠️ 正在执行工具: {tool_name}")

    def on_tool_end(self, output, **kwargs):
        try:
            if output is None:
                return
            output_str = str(output)
            # 过滤解析错误
            if any(kw in output_str for kw in ("Invalid", "incomplete", "Parsing error", "Could not parse")):
                self.write_func("⚠️ 模型输出格式有误,正在重试...")
                return

            if len(output_str) > 800:
                output_str = output_str[:800] + "\n... (截断)"
            self._emit("📤", "观察结果", output_str)

        except Exception as e:
            self.write_func(f"⚠️ 处理工具输出出错: {e}")

    def on_llm_new_token(self, token, **kwargs):
        if self.show_tokens and token:
            self._token_buffer += token

    def on_error(self, error, **kwargs):
        self.write_func(f"❌ 执行错误: {error}")

4. 核心数据流

4.1 文档上传与处理流程

用户上传文件 → Sidebar 获取文件 → DocSplitter 分块 → 嵌入模型向量化 → Chroma 存储
    │                    │                  │                  │              │
    │                    │                  │                  │              │
    ▼                    ▼                  ▼                  ▼              ▼
  多格式文件          文件列表           文档片段列表          向量列表       向量数据库
  (pdf/txt/docx/md)   (Streamlit)      (RecursiveSplit)    (text2vec)    (ChromaDB)

4.2 问答检索流程

用户提问 → hybrid_search → rerank_search → 组装 Prompt → LLM 生成 → 流式输出
    │            │               │               │              │            │
    │            │               │               │              │            │
    ▼            ▼               ▼               ▼              ▼            ▼
  文本问题    向量+BM25检索   CrossEncoder精排   上下文+问题     大语言模型    回答内容
                          (候选文档20个)      (最终文档k个)   (gpt-3.5)

4.3 完整时序图

用户                    Streamlit              DocSplitter           Chroma
 │                         │                       │                   │
 │ 上传文件                 │                       │                   │
 │─────────────────────────▶│                       │                   │
 │                         │──split_documents()───▶│                   │
 │                         │                       │──load()           │
 │                         │                       │──split()          │
 │                         │◀────文档片段列表───────│                   │
 │                         │                       │                   │
 │                         │────from_documents()──────────────────────▶│
 │                         │                       │                   │──存储向量
 │                         │◀────────Chroma实例───────────────────────│
 │                         │                       │                   │
 │                         │                       │                   │
 │ 提问                     │                       │                   │
 │─────────────────────────▶│                       │                   │
 │                         │──hybrid_search()─────────────────────────▶│
 │                         │                       │                   │──similarity_search
 │                         │◀────────候选文档列表───────────────────────│
 │                         │                       │                   │
 │                         │──rerank_search()──────▶│                   │
 │                         │                       │──CrossEncoder精排  │
 │                         │◀────────精排结果───────│                   │
 │                         │                       │                   │
 │                         │──LLM.generate()───────▶│                   │
 │                         │                       │                   │
 │◀──────────回答───────────│                       │                   │

5. 技术栈与依赖

5.1 依赖列表

依赖名称版本要求用途
streamlit>=1.37.0Web 应用框架
langchain>=1.3.0LLM 应用开发
langchain-community>=0.4.0LangChain 社区模块
langchain-classic>=1.0.8LangChain 经典模块
langchain-chroma>=1.1.0Chroma 集成
chromadb>=0.3.21向量数据库
langchain-openai>=1.3.0OpenAI 集成
python-dotenv>=1.0.0环境变量管理
langchain-text-splitters>=1.2.1文本分块
pypdf>=6.14.0PDF 解析
unstructured>=0.23.1非结构化文档处理
rank_bm25-BM25 算法
jieba3-中文分词
sentence_transformers-CrossEncoder 模型
langchain-huggingface-HuggingFace 集成

注意: requirements.txt 中存在拼写错误 (langchian-classic 应为 langchain-classic),且缺少 rank_bm25、jieba3、sentence_transformers、langchain-huggingface 四个依赖。

5.2 模型配置

模型类型模型名称来源用途
嵌入模型shibing624/text2vec-base-chineseHuggingFace文本向量化
重排模型BAAI/bge-reranker-v2-m3HuggingFace文档精排
LLMgpt-3.5-turboOpenAI回答生成
LLM (可选)glm-4.5-air智谱 AI可选

6. 配置说明

6.1 环境变量配置 (.env)

# 大语言模型配置
AI_MODEL = "glm-4.5-air"
AI_API_KEY = "your_api_key_here"

# 可选配置(当前未使用)
# AI_MODEL = "qwen3.7-max-preview"
# AI_API_KEY = "your_qwen_api_key"

注意: .env 中配置的模型 (glm-4.5-air) 未被实际使用,代码中硬编码为 gpt-3.5-turbo。

6.2 运行环境配置

# 国内镜像配置(index.py 中)
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["HUGGINGFACE_HUB_URL"] = "https://hf-mirror.com"

7. 使用说明

7.1 环境准备

# 安装依赖(注意补充缺失的依赖)
pip install streamlit langchain langchain-community langchain-classic langchain-chroma chromadb langchain-openai python-dotenv langchain-text-splitters pypdf unstructured rank_bm25 jieba3 sentence_transformers langchain-huggingface

# 配置环境变量
# 编辑 .env 文件,设置 AI_MODEL 和 AI_API_KEY

7.2 运行应用

streamlit run app.py

测试:
测试文章:
2007年1月9日,美国旧金山MacWorld大会。当史蒂夫·乔布斯走上舞台说出“今天,苹果将重新发明手机”时,很少有人意识到,接下来的三十分钟将彻底改变世界。 人们最初以为苹果即将推出三种新设备——iPod、手机和互联网通信器。但当乔布斯展示那个融合了触控屏、iPod和互联网功能的设备时,全场沸腾。第一代iPhone的诞生,终结了诺基亚等传统手机厂商的霸权,开启了一场移动革命。此后,苹果发布会被称为“科技春晚”,在一年又一年的9月,令无数媒体人翘首以盼,让全球果粉熬夜围观。那不仅是一场发布会,更是一个新时代的起点。 乔布斯的演讲堪称经典。他先是巧妙地回顾了苹果的革命性产品——Mac改变了计算机,iPod改变了音乐。然后,他话锋一转,指向了当时市场上所谓的“智能”手机,指出它们既不智能,也难以使用。在吊足观众胃口后,他轻描淡写地说:“今天,我们要推出三款革命性产品:一部触控宽屏的iPod,一部革命性的手机,以及一个突破性的互联网通讯设备。” 他重复了三遍,台下观众在短暂的困惑后,爆发出雷鸣般的掌声——他们意识到,这不是三个独立的设备,而是一个设备。它就是iPhone。 那一刻的震撼,源于其颠覆性的设计。初代iPhone正面几乎只有一块3.5英寸的“巨大”屏幕和一个Home键。它抛弃了当时智能手机必备的物理键盘、手写笔,取而代之的是基于电容屏的多点触控技术。乔布斯在台上用手指放大照片、用惯性滚动联系人列表,这些在今天看来习以为常的操作,在当时无异于施展魔法。

问题一:第一代iPhone的诞生是什么时候,在哪发布的?

Rag问答助手的回答:
在这里插入图片描述

问题二:说一下初代iPhone正面设计的特征?

Rag问答助手的回答:
在这里插入图片描述

7.3 操作步骤

  1. 上传文档: 在侧边栏点击"上传文件",选择支持的文档格式
  2. 调整参数: 根据需要调整分块大小、重叠大小和检索数量
  3. 等待处理: 系统会自动处理文档并构建向量数据库
  4. 输入问题: 在聊天框中输入问题,系统会基于文档内容生成回答

7.4 注意事项

  • 首次运行会下载嵌入模型和重排模型,可能需要较长时间
  • 建议使用国内网络或配置 HF_ENDPOINT 加速模型下载
  • 文档处理完成后会自动缓存,重新上传相同文件不会重复处理
rag检索 中和 基于知识库faq 通过bm25检索区别在于哪里 简言之,FAQ 的 BM25 检索是 “找固定答案”,而 RAG 检索是 “找相关信息并生成答案”,前者适合简单标准化场景,后者适合复杂灵活的知识问答。例如:用户问 “量子计算对加密的影响”,RAG 可能结合 “量子计算破解 RSA”“后量子加密算法” 等片段,生成一段逻辑连贯的分析,而非固定文本。”,RAG 先从物理教材、论文中检索出 “量子叠加”“量子纠缠” 等相关段落,再让模型结合这些内容生成解释。,即匹配到的 FAQ 条目中预设的回答,格式固定(如步骤列表、短句),无法根据查询的细微差异调整内容。 阅读详情

相关推荐

Reranker + BM25 + FAISS 构建高效的多阶段知识库检索系统一

在构建基于大语言模型的问答系统(如 RAG)中,知识库检索(Retrieval)是第一步,也是影响最终回答质量的关键环节。它负责从大规模文档中快速定位与用户问题最相关的 top-k 段落。下面提供的是一个思路方向,包括代码的大概实现步骤。BM25:粗排召回FAISS:向量相似度排序Reranker:精排打分[Query]↓↓↓Reranker → [Top-3 最佳匹配段落]方法优点缺点BM25快速、无需训练不支持语义理解FAISS支持高维向量检索无法处理复杂语义关系。

guoguozgw的博客 1871

深入剖析 RAG 检索系统中的召回方式:BM25、向量召回、混合策略全解析

RAG(检索增强生成)系统通过结合信息检索与文本生成技术提升大模型回答的准确性。其中,召回作为第一步,直接影响系统性能。本文系统介绍了三种核心召回方式:基于关键词匹配的BM25稀疏召回、利用语义向量的BCE稠密召回,以及融合两者的混合召回。

weixin_48389642的博客 3946

RAG混合检索实战:BM25+向量+重排序三层协同架构

混合检索(Hybrid Search)是一种融合关键词匹配与语义理解的检索范式,其核心原理是通过BM25保障字面召回精度、向量检索增强语义相关性、重排序模型(Reranker)实现细粒度相关性打分。该技术显著提升RAG系统在专业领域(如医疗指南、芯片文档、法律条文)中的事实准确率与答案稳定性,尤其适用于需同时满足时间约束(如Q3 2023)、数值单位(如2cm)、术语一致性等强条件的查询场景。本文基于Python构建可调试、信号贯通的端到端混合检索流水线,覆盖RankBM25索引构建、BGE向量局部编码、双

weixin_33182798的博客 364

大模型RAG实战:结合BM25与向量检索的LlamaIndex实现

目前,大模型RAG系统中普遍采用混合检索来提升检索准确性。针对要回答的问题,同时通过。

2401_84494441的博客 2451

Hybrid RAG工程实践:向量、BM25与Rerank的混合检索架构解析

在信息检索领域,向量检索和关键词检索是两大核心技术路径。向量检索基于Embedding模型将文本映射到高维语义空间,通过计算向量相似度来匹配语义相近的内容,其核心价值在于强大的语义理解与泛化能力,能够有效应对同义词和多样化表达。而关键词检索(如经典的BM25算法)则依赖于词频和逆文档频率进行精确匹配,擅长处理包含特定实体、数字和术语的查询,在工程实践中具有计算高效和结果可解释的优势。为了兼顾语义理解与精确匹配,混合检索增强生成(Hybrid RAG)技术应运而生,它通过融合两者的优势,并引入Rerank模型

WGH100817的博客 535

rag增强检索-基于关键词检索的混合检索模式

Milvus 2.4 开始原生支持 Hybrid 查询,可以直接用关键词 + 向量同时搜!Qdrant 支持 “filter + vector” 的查询,很丝滑。→ 先关键词召回,再向量检索排序,或者两者结合。

JustinMars的博客 649

从零打造RAG检索系统:BM25让检索快到飞起

为了能够让大家理解什么是RAG,本作者专门在本次教程中使用BM25检索的方式构建一个RAG系统。至于为什么没有用向量检索的形式,主要是为了降低大家体验RAG的成本,因为向量模型一般都比较大(也不算特别大),或者是去调用别人的模型服务,大多要钱,而且也会提升系统的复杂度,且向量化也是需要时间的,我们先用BM25算法构建出来一个RAG系统闭环最后持续快速迭代这个系统,先将优秀的方式加进去,不管是后面加Agent模式,或者是加入图谱检索的模式都可以,不过我们在这之前要做的是先构建出来一个闭环,是否加入向量检索其实

qkh1234567的博客 1098

Langfuse落地教程:从Docker部署到项目接入,掌控LLM调用链路

大模型应用开发中,调用链路的透明度直接决定调试效率与成本控制。可观测性技术通过记录每次请求的输入、输出、模型参数与Token消耗,帮助开发者快速定位问题。Langfuse作为开源LLM可观测性平台,将Trace、Prompt版本管理、评分等能力集成于一体,支持Docker Compose自托管部署,并提供Python/JS SDK与REST API。借助部署后的控制台,团队能够直观追踪RAG检索、Agent工具调用等复杂流程中的每一步耗时与资源占用,实现从黑盒调用到全链路可视化的转变。无论是本地调试、线上排

weixin_29698641的博客 308

RAG 为什么离不开 BM25?稀疏检索基础入门

在大模型与RAG检索增强生成技术全面普及的今天,绝大多数开发者都会陷入一个共性误区:过度依赖向量语义检索,认为只要Embedding模型足够优质、向量数据库性能足够强悍,就能搭建出高精度、高稳定的智能问答系统。但在真实工业落地场景中,纯向量RAG总会出现各类难以规避的问题:专业名词漏召回、设备型号匹配失败、故障代码检索偏差、核心关键信息被语义相似的无效内容覆盖,最终导致大模型回答失真、答非所问、关键信息缺失等线上故障。

2301_81680467的博客 1385

Nano Banana 2哪里使用?Nano Banana 2提示词合集和使用教程

收集最强的Nano Banana 2提示词合集,以及Nano Banana 2哪里使用的教程,并且有10个免费使用渠道。

qq_42927225的博客 1993

电压电流双闭环PFC单相PWM整流

电压电流双闭环PFC单相整流。仿真及代码

xht2403267701的博客 6052

Qwen3-Reranker效果实测:相比BM25/向量检索提升Top-5准确率42%

本文介绍了Qwen3-Reranker语义重排序模型在提升RAG系统检索精度上的显著效果。用户可以在星图GPU平台上自动化部署🚀 Qwen3-Reranker Semantic Refiner镜像,快速构建智能检索系统。该模型的核心应用场景是作为传统检索方法(如BM25或向量检索)的后置“精排”模块,通过深度理解查询与文档的语义关联,将最相关的答案精准排序在前,从而大幅提升智能客服、知识库问答等场景的答案准确率。

weixin_36304957的博客 1449

告别配置烦恼!保姆级教程:在Windows 10/11上为QT5.14.2配置MSVC2017编译器(附VS2022组件避坑指南)

本文提供了一份详细的保姆级教程,指导如何在Windows 10/11上为QT5.14.2配置MSVC2017编译器,包括VS2022组件避坑指南。从环境准备到关键配置,再到调试工具验证和Qt Creator中的编译器设置,一步步解决常见问题,帮助开发者快速搭建稳定可靠的开发环境。

weixin_30615767的博客 503

混合检索:BM25检索+向量检索的LlamaIndex实现

本文介绍了使用LlamaIndex框架实现混合检索的方法,通过结合向量语义检索和BM25全文检索提升RAG系统效果。作者详细讲解了如何构建中文BM25检索器,并实现基于权重和分布特性的融合处理。同时探讨了多种融合算法,并指出未来可探索3路召回混合检索。相关代码已在开源项目ThinkRAG中发布,该项目是基于LlamaIndex的本地化RAG系统。

青鸟飞鱼 1050

CST微带贴片天线设计全流程:从S11优化到辐射方向图分析

微带贴片天线是现代无线通信设备中的关键部件,其设计依赖于电磁场理论与仿真软件的结合。理解天线的基本工作原理,如谐振频率、阻抗匹配和辐射机制,是进行有效设计的基础。通过电磁仿真,工程师可以精确预测天线性能,避免传统手工计算的误差。在工程实践中,CST Studio Suite作为行业标准的三维电磁仿真工具,能够高效处理复杂的边界条件与材料属性,帮助优化S11参数和辐射方向图。本文聚焦于2.4GHz Wi-Fi频段微带贴片天线的完整设计流程,详细解析了端口设置、网格划分等关键步骤,并针对常见的仿真失败问题提供了

weixin_30784501的博客 459

Qt C++ 串口调试助手

1. **串口配置**:支持自动检测可用串口,可配置波特率(9600~921600)、数据位(5~8)、校验位(无/奇/偶/标记/空格)、停止位(1/1.5/2)。- HEX 模式发送时,输入格式需为十六进制字符(0-9、A-F),可带空格(如 `01 A3 FF`)或不带空格(如 `01A3FF`)。// 发送模式:true=HEX,false=ASCII。// 字符串转HEX字节数组。ui->parity->addItems({"无", "奇校验", "偶校验", "标记校验", "空格校验"});

寒寒豆豆软件公司的博客 147

RAG中的混合检索:如何用BM25+向量搜索提升问答系统准确率

本文深入探讨了RAG系统中混合检索的进阶策略,通过结合经典的BM25算法与现代向量搜索,有效提升了问答系统的准确率。文章分析了关键词匹配与语义理解两种检索范式的优劣,并提供了加权分数融合等实战方案与调参经验,旨在帮助开发者构建更健壮、更聪明的检索层,以应对知识库问答、智能客服等场景中的复杂需求。

m2n3o4p5的博客 257

Vue3+Openlayers教程导航页【目录】

欢迎来到 Vue3+Openlayers 系列教程,这里是我在 优快云 编写的所有 Vue3+Openlayers 系列相关文章的索引页,适合初学者到进阶用户系统阅读。👀 更多教程正在持续更新中,欢迎关注我,一起探索 Openlayers 的强大魅力!

小彭的博客 1271

利用语义搜索和混合查询策略提升RAG系统的准确性

人工智能咨询培训老师叶梓 转载标明出处在构建基于大模型(LLM)的生成式问答系统(Generative Q&A)时,检索增强生成(Retrieval-Augmented Generation, RAG)方法被广泛采用。RAG通过结合检索器(Retriever)和生成器(Generator)来实现,其中检索器负责从大量文档中提取最相关的信息,为语言模型提供上下文支持。然而,随着文档库规模的扩大,RAG的准确性面临挑战。

人工智能前沿分享 2089

【ARM CoreLink 系列 5.3 -- CI-700 SLC memory 系统组件详细介绍】

在 CI-700 系统级缓存(SLC)内存系统中,HN-F 节点负责管理缓存一致性和数据传输。每个 HN-F 节点可以发送三种类型的 Snoop 请求,以确保系统中多核处理器和缓存之间的一致性。CI-700 中的系统级缓存(SLC)内存系统通过 HN-F 节点支持 TrustZone® 技术。以下是 CI-700 支持的 SN 类型以及配置方法的简要介绍。ARM CI-700 系统级缓存(SLC)是一个分布式、主要排他性(mostly exclusive) 的最后一级缓存,集成在 HN-F 节点内。

CodingCos的博客 898

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合检索增强生成系统

RAG_HYBRID_BM25_WEIGHT 是 Hybrid RAG 检索系统中的核心调节器,它决定了语义检索与关键词检索的相对重要性。通过合理设定和动态调整这个参数,可以构建出更加准确、灵活和高效的 RAG 问答系统。

gs80140的专栏 873

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【收藏必备】RAG检索模块全解析:从向量检索到混合检索的实战指南

文章详解RAG系统中的检索模块,涵盖Query向量化、召回策略(向量、关键词、混合检索)、重排和结果过滤等关键步骤。强调检索优化需平衡召回率与精确率、降低延迟、处理专有词等挑战,提供实战案例和面试框架。核心观点是:检索优化是工程平衡的艺术,好的RAG系统依靠稳定的检索和准确的知识,而非玄学Prompt。

Android23333的博客 793

RAG检索增强生成:RRF融合BM25与向量检索的混合检索实践

检索增强生成(RAG)通过外部知识缓存缓解大模型幻觉,但单路检索存在天然边界:稠密向量检索擅长语义相似却对型号编号等精确字符串不敏感,BM25关键词检索精确却难以应对同义改写。混合检索将两路结果合并,而RRF倒数排名融合算法基于排名而非原始分数,巧妙规避了BM25与向量分数不可比的难题,显著提升检索稳定性。该方案适用于企业知识库问答、产品型号匹配、合同编号查询等同时要求语义理解与精确命中的场景。从概念到代码,完整梳理了一套基于BM25+Embedding+RRF的RAG落地实践,涵盖环境准备、可运行示例与排

weixin_28273593的博客 322

向量检索能懂语义但漏关键词——BM25 焊死混合检索,RRF 融合两路召回一个都不丢

本文基于 Python 3.12 + Milvus + rank-bm25 0.2.2 + jieba 0.42.1 编写。所有代码均经过验证,可直接复制运行。前置条件:第十章基础向量检索已跑通,MySQL 和 Milvus 中已有数据。

2601_96614951的博客 421

RAG 检索优化:向量相似度不够用时,该怎么让大模型找到正确答案

RAG 的精度问题不是单一环节的缺陷,而是从查询到生成的五个环节叠加的结果。优化思路是逐层修复:查询改写消除词汇鸿沟,混合检索弥补向量检索的模糊性,重排序纠正相似度与相关性的偏差,上下文压缩减少窗口浪费,位置编排规避"迷失在中间"效应。落地路线建议:先从混合检索 + 重排序开始,这是投入产出比最高的组合。查询改写和上下文压缩作为第二阶段引入,位置编排作为最后一步。每个阶段引入后,用标注数据集做 A/B 测试验证精度提升是否显著,避免过度优化。改写说明:删除了公式化的章节编号。

specter__的博客 2801

[RAG system] 信息检索器 | BM25 & Vector | Pickle格式 | HybridRetriever重排序

信息检索器是RAG系统的核心搜索引擎,通过结合关键词匹配(BM25)和语义理解(向量)两种检索方式,高效定位知识库中的相关文档块。 特别是==采用`HybridRetriever`进行智能重排序==后,系统能确保提取最精准的信息来解答用户问题。

No Game No Life 888
上一篇: 基于LangChain+Redis构建会话持久化的智能 Agent系统
下一篇: RAG (向量检索 + BM25关键词检索)+ Agent 自主决策
IT_WEH_coder
博客等级 码龄5年 2万+粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_WEH_coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值