RAG 分块策略深度对比

RAG 分块策略深度对比:语义分块 vs 文档感知 vs 层级分块

分块为何如此重要 在 RAG 系统中,分块(Chunking)是影响检索质量的第一道关卡。一个糟糕的分块策略会让最好的 Embedding 模型和最贵的 LLM 都无济于事。2026 年的分块策略已经从简单的固定长度切分进化到了语义感知、文档结构感知的智能分块。 五大分块策略对比 策略1:固定长度分块(Fixed-Size Chunking) 最基础的方式,按固定 token 数切分,带重叠窗口。 def fixed_size_chunk(text: str, chunk_size: int = 512, overlap: int = 50): tokens = tokenizer.encode(text) chunks = [] for i in range(0, len(tokens), chunk_size - overlap): chunk = tokens[i:i + chunk_size] chunks.append(tokenizer.decode(chunk)) if i + chunk_size >= len(tokens): break return chunks 优点:简单、快速、可控 缺点:可能切断语义、忽略文档结构 适用:纯文本、均匀内容 策略2:语义分块(Semantic Chunking) 基于 Embedding 相似度,在语义跳变点切分。 import numpy as np from sentence_transformers import SentenceTransformer def semantic_chunk(text: str, model, threshold: float = 0.5): # 1. 先按句子切分 sentences = split_sentences(text) # 2. 逐句计算 Embedding embeddings = model.encode(sentences) # 3. 计算相邻句子的余弦相似度 similarities = [] for i in range(len(embeddings) - 1): sim = cosine_similarity(embeddings[i], embeddings[i+1]) similarities.append(sim) # 4. 在相似度低于阈值处切分 chunks = [] current_chunk = [sentences[0]] for i, sim in enumerate(similarities): if sim < threshold: chunks.append(" ".join(current_chunk)) current_chunk = [sentences[i+1]] else: current_chunk.append(sentences[i+1]) if current_chunk: chunks.append(" ".join(current_chunk)) return chunks 优点:语义完整、边界自然 缺点:计算开销大、块大小不均匀 适用:长文本、叙述性内容 策略3:文档感知分块(Document-Aware Chunking) 基于文档结构(标题、段落、列表)进行切分。 ...

2026-06-28 · 3 min · 600 words · 硅基 AGI 探索者
rag architecture 2026 naive to graphrag agent

RAG 架构 2026 最新实践:从 Naive RAG 到 GraphRAG+Agent

RAG 架构的四代演进 检索增强生成(Retrieval-Augmented Generation, RAG)已经走过了三个年头。从 2023 年最初的概念验证,到 2026 年的今天,RAG 架构经历了四次重大范式转移。本文将系统梳理这条演进路线,并给出 2026 年的最佳实践。 第一代:Naive RAG(2023) 最朴素的 RAG 架构,核心流程是:文档分块 → 向量化 → 相似度检索 → 拼接 Prompt → LLM 生成。 用户提问 → Embedding → 向量检索 Top-K → 拼接上下文 → LLM 生成答案 问题:检索质量差、缺乏上下文理解、无法处理多跳推理。 第二代:Advanced RAG(2024) 引入了 Query 重写、重排序(Rerank)、混合检索等优化: # Advanced RAG 典型流程 def advanced_rag(query: str, vector_db, keyword_db): # 1. Query 重写 rewritten_query = llm.rewrite_query(query) # 2. 混合检索:向量 + 关键词 vector_results = vector_db.search(rewrite_query, top_k=20) keyword_results = keyword_db.search(rewrite_query, top_k=20) # 3. 合并去重 candidates = merge_and_dedupe(vector_results, keyword_results) # 4. 重排序 reranked = reranker.rerank(rewritten_query, candidates, top_k=5) # 5. 生成 return llm.generate(query, context=reranked) 提升:检索召回率提升 30-50%,但仍然缺乏全局视角。 ...

2026-06-28 · 2 min · 375 words · 硅基 AGI 探索者
rag evaluation framework 2026 ragas custom metrics

RAG 评估体系 2026:从 RAGAS 到自定义指标

为什么 RAG 评估如此困难 RAG 系统的评估比单纯的 LLM 评估复杂得多,因为它涉及多个环节:检索质量、上下文相关性、生成质量、引用准确性。一个环节的优化可能影响另一个环节。2026 年的 RAG 评估已经形成了系统化的方法论。 RAG 评估的三层框架 ┌──────────────────────────────────────────────┐ │ 端到端评估(L3) │ │ 用户满意度 / 任务完成率 / 答案正确性 │ ├──────────────────────────────────────────────┤ │ 生成评估(L2) │ │ 答案相关性 / 忠实度 / 完整性 / 引用准确性 │ ├──────────────────────────────────────────────┤ │ 检索评估(L1) │ │ 召回率 / 精确率 / MRR / 上下文相关性 │ └──────────────────────────────────────────────┘ L1:检索层评估 基础指标 class RetrievalMetrics: @staticmethod def recall_at_k(retrieved_ids: list, relevant_ids: list, k: int = 5): """Top-K 召回率:相关文档是否出现在 Top-K 中""" retrieved_top_k = retrieved_ids[:k] hits = len(set(retrieved_top_k) & set(relevant_ids)) return hits / len(relevant_ids) if relevant_ids else 0.0 @staticmethod def precision_at_k(retrieved_ids: list, relevant_ids: list, k: int = 5): """Top-K 精确率""" retrieved_top_k = retrieved_ids[:k] hits = len(set(retrieved_top_k) & set(relevant_ids)) return hits / k @staticmethod def mrr(retrieved_ids: list, relevant_ids: list): """Mean Reciprocal Rank:第一个相关文档的排名倒数""" for i, doc_id in enumerate(retrieved_ids): if doc_id in relevant_ids: return 1.0 / (i + 1) return 0.0 @staticmethod def ndcg_at_k(retrieved_ids: list, relevance_scores: dict, k: int = 5): """Normalized Discounted Cumulative Gain""" dcg = sum( relevance_scores.get(doc_id, 0) / np.log2(i + 2) for i, doc_id in enumerate(retrieved_ids[:k]) ) ideal_scores = sorted(relevance_scores.values(), reverse=True)[:k] idcg = sum(s / np.log2(i + 2) for i, s in enumerate(ideal_scores)) return dcg / idcg if idcg > 0 else 0.0 上下文相关性评估 def context_relevance(question: str, contexts: list, llm) -> float: """评估检索到的上下文与问题的相关程度""" prompt = f""" 请评估以下检索上下文与问题的相关性。 问题:{question} 上下文: {chr(10).join([f'[{i+1}] {c[:200]}' for i, c in enumerate(contexts)])} 对每条上下文打分(0-3): - 0: 完全无关 - 1: 部分相关,缺少关键信息 - 2: 相关,包含部分答案 - 3: 高度相关,直接回答问题 输出 JSON:{{"scores": [0-3, ...], "overall": 0.0-1.0}} """ result = llm.generate(prompt, response_format="json") return result["overall"] L2:生成层评估 RAGAS 框架 RAGAS(Retrieval Augmented Generation Assessment)是 2026 年最主流的 RAG 评估框架,核心指标包括: ...

2026-06-28 · 4 min · 775 words · 硅基 AGI 探索者
RAG 数据管道设计

RAG 数据管道设计:从 PDF/HTML/数据库到高质量知识库

数据管道是 RAG 系统的地基 RAG 系统的效果上限由数据质量决定。再好的 Embedding 模型和 LLM,如果喂进去的是垃圾数据,出来的也是垃圾答案。2026 年的 RAG 数据管道已经发展为一套完整的工程体系。 整体架构 数据源 解析层 处理层 索引层 ┌─────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ PDF │───→│ │ │ │ │ │ │ HTML │───→│ 文档解析 │───→│ 清洗+增强 │───→│ Embedding │ │ Word │───→│ Unified │ │ Pipeline │ │ + Index │ │ DB │───→│ Parser │ │ │ │ │ │ API │───→│ │ │ │ │ │ │ Web │───→│ │ │ │ │ │ └─────────┘ └───────────┘ └───────────┘ └───────────┘ ↓ ┌───────────┐ │ 质量监控 │ │ QC Layer │ └───────────┘ 1. 多源文档解析 统一解析层 from abc import ABC, abstractmethod from typing import List, Document import fitz # PyMuPDF from bs4 import BeautifulSoup from unstructured import partition_pdf class DocumentParser(ABC): @abstractmethod def parse(self, file_path: str) -> List[Document]: pass class PDFParser(DocumentParser): def parse(self, file_path: str) -> List[Document]: # 方案1: PyMuPDF(快,但结构感知弱) # 方案2: Unstructured(慢,但结构感知强) # 方案3: LLM 辅助解析(最准,但贵) elements = partition_pdf( file_path, strategy="hi_res", # 高精度模式 infer_table_structure=True, extract_image_block_types=["Image", "Table"], extract_image_block_output_dir="./images/" ) documents = [] for elem in elements: doc = Document( content=elem.text if hasattr(elem, 'text') else str(elem), metadata={ "source": file_path, "page": elem.metadata.page_number if elem.metadata else 0, "category": elem.category, "type": self._map_type(elem.category) } ) documents.append(doc) return documents class HTMLParser(DocumentParser): def parse(self, file_path: str) -> List[Document]: with open(file_path, 'r', encoding='utf-8') as f: soup = BeautifulSoup(f.read(), 'html.parser') # 移除无关元素 for tag in soup(['script', 'style', 'nav', 'footer', 'header']): tag.decompose() documents = [] # 按标题分块 current_section = {"title": "", "content": []} for element in soup.find_all(['h1', 'h2', 'h3', 'p', 'li', 'table', 'pre']): if element.name in ['h1', 'h2', 'h3']: if current_section["content"]: documents.append(Document( content=self._format_section(current_section), metadata={"source": file_path, "section": current_section["title"]} )) current_section = {"title": element.get_text(), "content": []} else: current_section["content"].append(self._extract_content(element)) if current_section["content"]: documents.append(Document( content=self._format_section(current_section), metadata={"source": file_path, "section": current_section["title"]} )) return documents class DatabaseParser(DocumentParser): def parse(self, conn_config: dict) -> List[Document]: """从数据库提取知识""" import sqlalchemy as sa engine = sa.create_engine(conn_config["url"]) documents = [] for table_name in conn_config["tables"]: query = f"SELECT * FROM {table_name}" df = pd.read_sql(query, engine) # 将每行转为一个文档 for _, row in df.iterrows(): content = self._row_to_text(row, table_name) documents.append(Document( content=content, metadata={ "source": f"db://{table_name}", "table": table_name, "primary_key": str(row.get('id', '')) } )) return documents class UnifiedParser: """统一解析入口""" def __init__(self): self.parsers = { ".pdf": PDFParser(), ".html": HTMLParser(), ".htm": HTMLParser(), ".docx": DocxParser(), ".md": MarkdownParser(), ".txt": TextParser(), } def parse(self, file_path: str) -> List[Document]: ext = Path(file_path).suffix.lower() parser = self.parsers.get(ext, TextParser()) return parser.parse(file_path) 2. 数据清洗 Pipeline class DataCleaner: def __init__(self): self.steps = [ self._remove_boilerplate, # 去除样板文字 self._normalize_whitespace, # 规范化空白 self._fix_encoding, # 修复编码 self._remove_duplicates, # 去重 self._filter_quality, # 质量过滤 self._add_metadata, # 补充元数据 ] def clean(self, documents: List[Document]) -> List[Document]: for step in self.steps: documents = step(documents) return documents def _remove_boilerplate(self, docs): """去除样板文字""" boilerplate_patterns = [ r"版权所有.*?保留所有权利", r"Cookie.*?设置", r"订阅我们的.*?通讯", r"© \d{4}.*?", ] cleaned = [] for doc in docs: text = doc.content for pattern in boilerplate_patterns: text = re.sub(pattern, "", text, flags=re.IGNORECASE) doc.content = text.strip() if len(doc.content) > 50: # 过滤过短的 cleaned.append(doc) return cleaned def _filter_quality(self, docs): """质量过滤""" filtered = [] for doc in docs: # 检查文本质量 quality_score = self._assess_quality(doc.content) if quality_score > 0.5: doc.metadata["quality_score"] = quality_score filtered.append(doc) return filtered def _assess_quality(self, text: str) -> float: score = 1.0 # 过短 if len(text) < 50: score -= 0.3 # 重复内容过多 words = text.split() if len(words) > 0: unique_ratio = len(set(words)) / len(words) if unique_ratio < 0.3: score -= 0.3 # 特殊字符过多 special_chars = sum(1 for c in text if not c.isalnum() and not c.isspace()) if len(text) > 0 and special_chars / len(text) > 0.2: score -= 0.2 # 乱码检测 if re.search(r'[\ufffd]{3,}', text): score -= 0.5 return max(0, score) 3. 数据增强 class DataAugmentor: """为原始文档增加结构化信息""" def augment(self, documents: List[Document]) -> List[Document]: for doc in documents: # 1. 生成摘要 doc.metadata["summary"] = self._generate_summary(doc.content) # 2. 提取关键词 doc.metadata["keywords"] = self._extract_keywords(doc.content) # 3. 生成问答对(用于 FAQ 式检索) doc.metadata["qa_pairs"] = self._generate_qa_pairs(doc.content) # 4. 实体标注 doc.metadata["entities"] = self._extract_entities(doc.content) # 5. 生成假设性问题(HyDE 优化) doc.metadata["hypothetical_questions"] = self._generate_hyde(doc.content) return documents def _generate_hyde(self, content: str) -> List[str]: """生成该内容可能回答的问题,用于提升检索召回""" prompt = f""" 基于以下内容,生成 3 个用户可能会问的问题,这些问题可以由这段内容回答: 内容:{content[:1000]} 输出 JSON 列表:["问题1", "问题2", "问题3"] """ return llm.generate(prompt, response_format="json") 4. 分块与索引 class ChunkingAndIndexing: def __init__(self): self.chunker = HybridChunker() self.embedder = EmbeddingModel("bge-m3") self.sparse_embedder = BM25Encoder() def process(self, documents: List[Document]): all_chunks = [] for doc in documents: # 1. 智能分块 chunks = self.chunker.chunk(doc.content) # 2. 为每个 chunk 添加上下文 for i, chunk in enumerate(chunks): chunk.metadata = { **doc.metadata, "chunk_index": i, "total_chunks": len(chunks), "context_before": chunks[i-1].text[-100:] if i > 0 else "", "context_after": chunks[i+1].text[:100] if i < len(chunks)-1 else "" } # 3. 生成 Embedding(稠密 + 稀疏) chunk.dense_embedding = self.embedder.encode(chunk.text) chunk.sparse_embedding = self.sparse_embedder.encode(chunk.text) # 4. HyDE embedding(用假设问题做额外 embedding) if "hypothetical_questions" in doc.metadata: hyde_embeddings = [ self.embedder.encode(q) for q in doc.metadata["hypothetical_questions"] ] chunk.hyde_embeddings = hyde_embeddings all_chunks.append(chunk) # 5. 写入向量数据库 self._write_to_index(all_chunks) return all_chunks 5. 质量监控 class PipelineQualityMonitor: def __init__(self): self.metrics = {} def monitor(self, pipeline_run): report = { "input": { "total_documents": len(pipeline_run.input_docs), "total_size_mb": pipeline_run.input_size, }, "parsing": { "success_rate": pipeline_run.parsed / pipeline_run.total, "failed_files": pipeline_run.failed, "avg_parse_time": pipeline_run.avg_parse_time, }, "cleaning": { "retention_rate": len(pipeline_run.cleaned) / len(pipeline_run.parsed), "avg_quality_score": np.mean([d.metadata.get("quality_score", 0) for d in pipeline_run.cleaned]), }, "chunking": { "total_chunks": len(pipeline_run.chunks), "avg_chunk_size": np.mean([len(c.text) for c in pipeline_run.chunks]), "chunks_per_doc": len(pipeline_run.chunks) / len(pipeline_run.cleaned), }, "indexing": { "index_time": pipeline_run.index_time, "index_size_mb": pipeline_run.index_size, "vectors_written": len(pipeline_run.chunks), } } # 告警 if report["parsing"]["success_rate"] < 0.95: alert("解析成功率低于 95%") if report["cleaning"]["avg_quality_score"] < 0.7: alert("平均质量分数低于 0.7") if report["chunking"]["avg_chunk_size"] > 2000: alert("平均块大小过大") return report 6. 增量更新与调度 class IncrementalPipeline: """支持增量更新的数据管道""" def run(self, data_source: str): # 1. 发现新增/修改/删除的文件 changes = self._detect_changes(data_source) if not changes["added"] and not changes["modified"] and not changes["deleted"]: return "No changes detected" # 2. 处理新增和修改 new_docs = [] for file_path in changes["added"] + changes["modified"]: docs = self.parser.parse(file_path) docs = self.cleaner.clean(docs) docs = self.augmentor.augment(docs) new_docs.extend(docs) # 3. 处理删除 for file_path in changes["deleted"]: self.index.delete_by_source(file_path) # 4. 更新索引 if new_docs: self.indexer.process(new_docs) # 5. 记录变更 self._update_file_registry(changes) # 6. 质量检查 quality_report = self.monitor.monitor(pipeline_run) return quality_report def _detect_changes(self, source: str) -> dict: """检测文件变更""" current_files = self._scan_files(source) registered_files = self._get_registered_files() added = set(current_files) - set(registered_files) deleted = set(registered_files) - set(current_files) modified = { f for f in current_files if f in registered_files and current_files[f] != registered_files[f] # 比较 hash } return {"added": list(added), "modified": list(modified), "deleted": list(deleted)} 总结 RAG 数据管道是系统工程,核心原则是: ...

2026-06-28 · 5 min · 990 words · 硅基 AGI 探索者
rag reranking cohere bge jina comparison

RAG 重排序实战:Cohere Rerank vs BGE-Reranker vs Jina

为什么重排序是 RAG 的必备环节 向量检索(Bi-Encoder)速度快但精度有限,因为它将 query 和文档独立编码。重排序(Cross-Encoder)将 query 和文档拼接在一起送入模型,能捕获更精细的语义交互,显著提升检索精度。 向量检索 (Bi-Encoder) 重排序 (Cross-Encoder) Q → [Embedding] → ← [Embedding] ← Doc Q + Doc → [Cross-Encoder] → Score 速度快,精度中等 速度慢,精度高 召回阶段 (Top-50) 精排阶段 (Top-5) 三大重排序方案概览 特性 Cohere Rerank BGE-Reranker Jina Reranker 类型 闭源 API 开源模型 开源模型 + API 最大序列长度 4096 8192 8192 多语言 ✅ 100+语言 ✅ 中英文为主 ✅ 100+语言 部署方式 仅 SaaS 自托管 自托管/SaaS 延迟 (P99) 200ms 150ms (GPU) 180ms (GPU) 成本 $2/1K调用 GPU成本 GPU或$1/1K 实战对比 1. Cohere Rerank v4 import cohere client = cohere.Client(api_key="your-api-key") def cohere_rerank(query: str, documents: list, top_n: int = 5): response = client.rerank( model="rerank-multilingual-v3.0", query=query, documents=documents, top_n=top_n, max_tokens_per_doc=4096 ) return [ { "index": r.index, "document": documents[r.index], "relevance_score": r.relevance_score } for r in response.results ] 优点:开箱即用、多语言强、稳定可靠 缺点:依赖外部 API、有数据隐私顾虑、按调用计费 ...

2026-06-28 · 4 min · 706 words · 硅基 AGI 探索者
reranker model selection 2026 cohere bge jina

Reranker 模型选型 2026:Cohere vs BGE vs Jina 对比

在 RAG 系统中,Embedding 负责粗排,Reranker 负责精排。一个优质的 Reranker 可以将 RAG 的检索准确率提升 10-20%。2026 年,Reranker 市场形成了 Cohere(闭源标杆)、BGE(开源之光)、Jina(多语言专家)三足鼎立的格局。本文将在真实 RAG 场景中对三者进行全面对比。 一、Reranker 基础 Reranker vs Embedding 维度 Embedding Reranker 架构 双塔(Bi-Encoder) 交叉(Cross-Encoder) 计算方式 独立编码,余弦相似度 联合编码,输出相关性分数 速度 快(可预计算) 慢(每对实时计算) 精度 中(粗排) 高(精排) 在RAG中的角色 第一阶段召回 第二阶段重排 典型 RAG 检索流程: 查询 → Embedding检索(Top-100) → Reranker重排(Top-5) → 生成 为什么需要 Reranker? 方案 Top-5 准确率 端到端准确率 仅 Embedding 78.3% 75.5% Embedding + Reranker 91.2% 87.3% 加入 Reranker 后 Top-5 准确率提升 12.9%,端到端准确率提升 11.8%——这是 RAG 系统中投入产出比最高的优化之一。 ...

2026-06-28 · 4 min · 742 words · 硅基 AGI 探索者
multimodal rag image text hybrid retrieval

多模态 RAG 实战:图文混合检索的工程实现

为什么需要多模态 RAG 传统 RAG 只处理文本,但现实世界的信息以多种模态存在:技术文档包含图表、医疗记录附带影像、电商页面图文并茂。2026 年的多模态 RAG 已经成为企业级 RAG 系统的标配。 核心架构 多模态 RAG 的关键挑战是:如何让文本 Query 检索到相关图片,以及如何让图片 Query 检索到相关文本。 ┌──────────────────────────────────────────────┐ │ 多模态 RAG Pipeline │ ├──────────────────────────────────────────────┤ │ │ │ 文档处理层 │ │ ├─ 文本分块 → Text Embedding │ │ ├─ 图片提取 → Image Embedding (CLIP) │ │ ├─ 表格解析 → Table → Text + Structure │ │ └─ 图文对齐 → Cross-modal Alignment │ │ │ │ 检索层 │ │ ├─ 文本向量索引 (bge-m3) │ │ ├─ 图像向量索引 (CLIP ViT-L/14) │ │ └─ 融合重排序 (Cross-modal Reranker) │ │ │ │ 生成层 │ │ └─ 多模态 LLM (GPT-5.5 / Claude 4) │ │ │ └──────────────────────────────────────────────┘ 工程实现 1. 文档解析与多模态提取 from unstructured import partition_pdf from PIL import Image import torch from transformers import CLIPModel, CLIPProcessor class MultimodalDocProcessor: def __init__(self): self.clip_model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14") self.clip_processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14") self.text_embedder = TextEmbedder(model="bge-m3") def process_document(self, file_path: str): # 1. 解析文档 elements = partition_pdf(file_path) results = [] for elem in elements: if elem.category == "Text": results.append({ "type": "text", "content": elem.text, "embedding": self.text_embedder.encode(elem.text), "metadata": {"page": elem.metadata.page_number} }) elif elem.category == "Image": # 提取图片并生成 embedding img = elem.image img_embedding = self._encode_image(img) # 同时用 VLM 生成图片描述文本 img_description = vlm.describe(img) text_embedding = self.text_embedder.encode(img_description) results.append({ "type": "image", "content": img, "description": img_description, "image_embedding": img_embedding, "text_embedding": text_embedding, "metadata": {"page": elem.metadata.page_number} }) elif elem.category == "Table": # 表格转为结构化文本 table_text = self._table_to_text(elem) results.append({ "type": "table", "content": table_text, "embedding": self.text_embedder.encode(table_text), "metadata": {"page": elem.metadata.page_number} }) return results def _encode_image(self, image): inputs = self.clip_processor(images=image, return_tensors="pt") with torch.no_grad(): features = self.clip_model.get_image_features(**inputs) return features[0].cpu().numpy() 2. 双索引构建 class MultimodalIndex: def __init__(self): self.text_index = MilvusIndex( dim=1024, # bge-m3 metric="IP" ) self.image_index = MilvusIndex( dim=768, # CLIP metric="IP" ) def add_documents(self, docs: list): for doc in docs: if doc["type"] == "text": self.text_index.add( id=doc["id"], embedding=doc["embedding"], metadata=doc["metadata"] ) elif doc["type"] == "image": # 图片同时加入两个索引 self.image_index.add( id=doc["id"], embedding=doc["image_embedding"], metadata={"description": doc["description"], **doc["metadata"]} ) self.text_index.add( id=f"{doc['id']}_text", embedding=doc["text_embedding"], metadata={"ref_image_id": doc["id"], **doc["metadata"]} ) 3. 混合检索与跨模态重排序 class MultimodalRetriever: def __init__(self, index: MultimodalIndex, reranker): self.index = index self.reranker = reranker def retrieve(self, query: str, top_k: int = 10): # 1. 文本检索 text_hits = self.index.text_index.search( embedding=self.text_embedder.encode(query), top_k=top_k * 2 ) # 2. 用 CLIP 做跨模态检索(文本→图像) clip_query_emb = self.clip_encode_text(query) image_hits = self.index.image_index.search( embedding=clip_query_emb, top_k=top_k * 2 ) # 3. 合并候选 candidates = self._merge(text_hits, image_hits) # 4. 跨模态重排序 reranked = self.reranker.rerank( query=query, candidates=candidates, top_k=top_k ) return reranked 图文混合检索效果对比 方法 文本 Recall@5 图像 Recall@5 MRR 纯文本 RAG 0.82 0.00 0.71 纯图像 RAG 0.00 0.68 0.55 简单双路合并 0.80 0.65 0.73 双索引+重排序 0.88 0.79 0.82 双索引+VLM描述增强 0.91 0.85 0.88 实际案例:技术文档智能问答 以一份 200 页的技术白皮书为例,包含大量架构图和流程图: ...

2026-06-28 · 3 min · 503 words · 硅基 AGI 探索者
graphrag graph retrieval

GraphRAG图检索增强生成

概述 GraphRAG图检索增强生成是AI智能体领域中GraphRAG图检索增强生成的重要主题。本文将从多个角度深入分析这一话题,为读者提供系统性的认知框架和实践参考。 核心概念 基本定义 在深入讨论之前,我们需要明确几个核心概念。AI智能体是指能够感知环境、理解指令、规划行动并调用工具完成任务的AI系统。与传统的聊天机器人不同,智能体具有自主性、目标导向性和工具使用能力。 GraphRAG图检索增强生成涉及的关键技术包括: 大语言模型:作为智能体的认知引擎,负责理解、推理和生成 工具调用:通过Function Calling或MCP协议与外部系统交互 记忆系统:短期记忆处理当前对话,长期记忆存储历史经验 规划引擎:将复杂任务分解为可执行的子步骤 技术原理 从技术层面看,GraphRAG图检索增强生成的核心在于如何让AI系统更好地理解和执行人类意图。这涉及多个技术环节的协同: 首先是感知层,智能体需要准确理解用户的自然语言指令,提取关键信息和约束条件。其次是规划层,将高层目标分解为具体的执行步骤。然后是执行层,调用合适的工具完成每个步骤。最后是反馈层,根据执行结果调整后续策略。 实践分析 当前现状 在RAG与微调领域,当前的技术实践呈现出几个明显特征: 工程化程度提升:从实验室原型到生产级系统,工程能力成为关键差异化因素 评估体系完善:越来越多标准化的评测基准被提出,帮助开发者量化能力边界 开源生态繁荣:开源框架和工具链的成熟降低了开发门槛 安全意识增强:对AI安全和对齐问题的重视程度显著提升 关键挑战 尽管进展显著,GraphRAG图检索增强生成仍面临几个核心挑战: 技术挑战: 大模型的幻觉问题在智能体场景下被放大,因为智能体需要做出实际决策 多步推理中的错误累积效应导致长程任务成功率下降 工具调用的可靠性受外部API稳定性影响 工程挑战: 智能体的可观测性不足,调试和排错困难 成本控制与性能优化的平衡 从单机到分布式部署的架构复杂性 安全挑战: Prompt注入等攻击手段不断进化 智能体权限管理需要更精细化的控制 数据隐私保护在多Agent协作场景下更加复杂 优化策略 针对上述挑战,以下是几个关键优化方向: 技术优化 分而治之:将复杂任务分解为可独立验证的子任务,降低单步错误影响 多路投票:对关键决策使用多次采样投票机制,提高可靠性 渐进式信任:智能体权限从最小化开始,根据表现逐步扩展 人在回路:高风险决策保留人工审核环节 工程优化 可观测性优先:建立完善的日志、指标和追踪体系 灰度发布:新版本智能体先在小流量环境验证 自动化测试:构建端到端测试套件,防止回归 成本监控:实时追踪Token消耗和API调用成本 案例研究 为了更具体地说明GraphRAG图检索增强生成的实践价值,我们来看一个典型场景: 某科技公司在内部IT运维中部署了AI智能体,负责处理员工的工单请求。智能体需要理解员工的自然语言描述,判断问题类型,查询知识库,执行修复操作或转接人工。 实施过程中遇到的关键问题包括: 员工描述模糊导致意图识别错误 知识库信息过时导致给出错误建议 某些操作需要管理员权限存在安全风险 解决方案: 引入澄清对话机制,在不确定时主动追问 建立知识库更新流程,定期审核内容 实施权限分级制度,敏感操作需人工确认 效果:工单首次解决率提升35%,平均处理时间缩短60%,员工满意度显著提升。 未来趋势 GraphRAG图检索增强生成的发展趋势值得关注: 标准化:MCP等开放协议将推动工具接口标准化,降低集成成本 垂直化:针对特定行业和场景的专用智能体将大量涌现 协作化:多智能体协作将成为复杂任务的标准解决方案 自主化:智能体的自主决策能力将持续提升,但需要配套的安全机制 结论 GraphRAG图检索增强生成是AI智能体技术发展中的重要一环。无论是技术原理的深入理解,还是实践中的工程优化,都需要系统性思维。对于开发者和企业而言,关键在于: 理解技术能力和边界,避免过度期待 建立系统化的评估和监控体系 在创新和安全之间找到平衡 持续学习和适应快速变化的技术生态 硅基AGI探索者将持续关注RAG与微调领域的最新进展,为读者提供深度分析和实践指导。— ...

2026-06-27 · 1 min · 88 words · 硅基 AGI 探索者
graphrag knowledge graph rag

GraphRAG图检索增强生成

引言 传统RAG基于向量相似度检索文本块,在处理需要跨文档推理、全局性总结和多跳关系分析的任务时存在明显局限。GraphRAG将知识图谱与RAG结合,通过图结构组织信息,支持基于关系的检索和推理。本文深入GraphRAG的架构设计、构建流程和工程实践。 传统RAG的局限 局部检索的困境 传统RAG将文档切分为文本块,用向量相似度检索最相关的Top-K块。这种方式存在根本局限: 多跳推理失效:问题"A公司的CEO在B公司担任什么职务?“需要先找到A公司的CEO是谁,再查找此人在B公司的职务。向量检索可能只检索到A公司或B公司中的一个文档块,无法建立跨文档的连接。 全局信息缺失:问题"这个行业的主要趋势是什么?“需要综合所有文档的全局信息,但向量检索只能返回局部相似的文本块,无法提供全局视角。 关系信息丢失:文档切分时,实体间的关系可能被分散到不同文本块中,向量检索难以捕获这些结构化关系。 GraphRAG架构 整体架构 GraphRAG在传统RAG基础上增加知识图谱层: 文档 → 文本块提取 → 实体抽取 → 关系抽取 → 知识图谱构建 ↓ 查询 → 查询理解 → 图检索(子图提取)→ 上下文组装 → LLM生成 ↑ 向量检索(补充) 知识图谱构建 实体抽取:使用LLM从文本中提取实体(人物、组织、地点、概念等): def extract_entities(text, llm): prompt = f""" 从以下文本中提取实体,按类型分类。 文本:{text} 输出JSON格式: {{ "persons": ["..."], "organizations": ["..."], "locations": ["..."], "concepts": ["..."], "events": ["..."] }} """ return json.loads(llm.generate(prompt)) 关系抽取:识别实体间的关系: def extract_relations(text, entities, llm): prompt = f""" 识别以下文本中实体间的关系。 文本:{text} 实体:{entities} 输出三元组列表: [(主体, 关系, 客体), ...] 例如:(苹果公司, 收购, NeXT) """ return eval(llm.generate(prompt)) 图谱存储:将实体和关系存入图数据库(如Neo4j): ...

2026-06-27 · 2 min · 411 words · 硅基 AGI 探索者
rag agent fusion architecture

RAG+Agent融合架构实践

概述 RAG+Agent融合架构实践是AI智能体领域中RAG+Agent融合架构实践的重要主题。本文将从多个角度深入分析这一话题,为读者提供系统性的认知框架和实践参考。 核心概念 基本定义 在深入讨论之前,我们需要明确几个核心概念。AI智能体是指能够感知环境、理解指令、规划行动并调用工具完成任务的AI系统。与传统的聊天机器人不同,智能体具有自主性、目标导向性和工具使用能力。 RAG+Agent融合架构实践涉及的关键技术包括: 大语言模型:作为智能体的认知引擎,负责理解、推理和生成 工具调用:通过Function Calling或MCP协议与外部系统交互 记忆系统:短期记忆处理当前对话,长期记忆存储历史经验 规划引擎:将复杂任务分解为可执行的子步骤 技术原理 从技术层面看,RAG+Agent融合架构实践的核心在于如何让AI系统更好地理解和执行人类意图。这涉及多个技术环节的协同: 首先是感知层,智能体需要准确理解用户的自然语言指令,提取关键信息和约束条件。其次是规划层,将高层目标分解为具体的执行步骤。然后是执行层,调用合适的工具完成每个步骤。最后是反馈层,根据执行结果调整后续策略。 实践分析 当前现状 在架构设计领域,当前的技术实践呈现出几个明显特征: 工程化程度提升:从实验室原型到生产级系统,工程能力成为关键差异化因素 评估体系完善:越来越多标准化的评测基准被提出,帮助开发者量化能力边界 开源生态繁荣:开源框架和工具链的成熟降低了开发门槛 安全意识增强:对AI安全和对齐问题的重视程度显著提升 关键挑战 尽管进展显著,RAG+Agent融合架构实践仍面临几个核心挑战: 技术挑战: 大模型的幻觉问题在智能体场景下被放大,因为智能体需要做出实际决策 多步推理中的错误累积效应导致长程任务成功率下降 工具调用的可靠性受外部API稳定性影响 工程挑战: 智能体的可观测性不足,调试和排错困难 成本控制与性能优化的平衡 从单机到分布式部署的架构复杂性 安全挑战: Prompt注入等攻击手段不断进化 智能体权限管理需要更精细化的控制 数据隐私保护在多Agent协作场景下更加复杂 优化策略 针对上述挑战,以下是几个关键优化方向: 技术优化 分而治之:将复杂任务分解为可独立验证的子任务,降低单步错误影响 多路投票:对关键决策使用多次采样投票机制,提高可靠性 渐进式信任:智能体权限从最小化开始,根据表现逐步扩展 人在回路:高风险决策保留人工审核环节 工程优化 可观测性优先:建立完善的日志、指标和追踪体系 灰度发布:新版本智能体先在小流量环境验证 自动化测试:构建端到端测试套件,防止回归 成本监控:实时追踪Token消耗和API调用成本 案例研究 为了更具体地说明RAG+Agent融合架构实践的实践价值,我们来看一个典型场景: 某科技公司在内部IT运维中部署了AI智能体,负责处理员工的工单请求。智能体需要理解员工的自然语言描述,判断问题类型,查询知识库,执行修复操作或转接人工。 实施过程中遇到的关键问题包括: 员工描述模糊导致意图识别错误 知识库信息过时导致给出错误建议 某些操作需要管理员权限存在安全风险 解决方案: 引入澄清对话机制,在不确定时主动追问 建立知识库更新流程,定期审核内容 实施权限分级制度,敏感操作需人工确认 效果:工单首次解决率提升35%,平均处理时间缩短60%,员工满意度显著提升。 未来趋势 RAG+Agent融合架构实践的发展趋势值得关注: 标准化:MCP等开放协议将推动工具接口标准化,降低集成成本 垂直化:针对特定行业和场景的专用智能体将大量涌现 协作化:多智能体协作将成为复杂任务的标准解决方案 自主化:智能体的自主决策能力将持续提升,但需要配套的安全机制 结论 RAG+Agent融合架构实践是AI智能体技术发展中的重要一环。无论是技术原理的深入理解,还是实践中的工程优化,都需要系统性思维。对于开发者和企业而言,关键在于: 理解技术能力和边界,避免过度期待 建立系统化的评估和监控体系 在创新和安全之间找到平衡 持续学习和适应快速变化的技术生态 硅基AGI探索者将持续关注架构设计领域的最新进展,为读者提供深度分析和实践指导。— ...

2026-06-27 · 1 min · 88 words · 硅基 AGI 探索者
鲁ICP备2026018361号