news 2026/7/2 4:46:24

LlamaIndex高级RAG实战:从检索增强到知识图谱问答

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LlamaIndex高级RAG实战:从检索增强到知识图谱问答

一、RAG的局限与高级RAG

基础RAG(检索增强生成)存在明显短板:检索精度低、缺乏多跳推理、无法处理复杂查询。高级RAG通过查询改写、重排序、知识图谱增强等技术,将RAG从简单检索提升到深度问答。LlamaIndex是构建高级RAG系统的首选框架,提供丰富的索引结构和检索策略。

回到顶部

二、LlamaIndex核心架构

核心组件: - Document/Node:文档与分片 - Index:索引(向量/关键词/知识图谱) - Retriever:检索器 - ResponseSynthesizer:响应合成器 - QueryEngine:查询引擎 - Tool/Agent:工具与智能体

回到顶部

三、环境搭建

pip install llama-index llama-index-llms-openai pip install llama-index-embeddings-openai pip install llama-index-graph-stores-nebula import os os.environ["OPENAI_API_KEY"] = "your-api-key"

回到顶部

四、基础RAG vs 高级RAG对比

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader # 基础RAG documents = SimpleDirectoryReader("data").load_data() index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() response = query_engine.query("什么是微服务架构?") print(response) # 高级RAG:带检索后处理 from llama_index.core.postprocessor import SentenceTransformerRerank rerank = SentenceTransformerRerank(top_n=3, model="cross-encoder/ms-marco-MiniLM-L-2-v2") query_engine = index.as_query_engine( similarity_top_k=10, # 先检索10个 node_postprocessors=[rerank] # 再重排取前3 ) response = query_engine.query("微服务和单体架构的核心区别是什么?") print(response)

回到顶部

五、查询改写:HyDE技术

from llama_index.core.indices.query.query_transform import HyDEQueryTransform from llama_index.core.query_engine import TransformQueryEngine # HyDE:先让LLM生成假设性文档,再用假设文档做检索 hyde = HyDEQueryTransform(include_original=True) query_engine = index.as_query_engine() hyde_query_engine = TransformQueryEngine(query_engine, hyde) # 对比效果 question = "如何设计高并发系统?" normal = query_engine.query(question) hyde_result = hyde_query_engine.query(question) print("普通RAG:", normal) print("HyDE RAG:", hyde_result)

回到顶部

六、多跳推理:子问题分解

from llama_index.core.query_engine import SubQuestionQueryEngine from llama_index.core.tools import QueryEngineTool, ToolMetadata # 为不同文档集创建独立索引 sql_index = VectorStoreIndex.from_documents(sql_docs) java_index = VectorStoreIndex.from_documents(java_docs) sql_tool = QueryEngineTool( query_engine=sql_index.as_query_engine(), metadata=ToolMetadata(name="sql_docs", description="SQL优化相关文档") ) java_tool = QueryEngineTool( query_engine=java_index.as_query_engine(), metadata=ToolMetadata(name="java_docs", description="Java性能优化文档") ) # 子问题分解引擎 sub_engine = SubQuestionQueryEngine.from_defaults(query_engine_tools=[sql_tool, java_tool]) # 复杂查询会自动分解为子查询 response = sub_engine.query( "如何优化Java应用中的数据库查询性能?需要同时考虑Java层面和SQL层面" ) print(response)

回到顶部

七、知识图谱RAG

from llama_index.core import KnowledgeGraphIndex from llama_index.core.graph_stores import SimpleGraphStore # 构建知识图谱索引 graph_store = SimpleGraphStore() kg_index = KnowledgeGraphIndex.from_documents( documents, max_triplets_per_chunk=5, graph_store=graph_store, include_embeddings=True ) # 知识图谱查询(支持多跳关系推理) kg_query_engine = kg_index.as_query_engine( include_text=True, response_mode="tree_summarize", embedding_mode="hybrid", similarity_top_k=5 ) response = kg_query_engine.query( "Spring Boot自动配置的完整流程是什么?涉及哪些核心注解?" ) print(response)

回到顶部

八、混合检索:向量+关键词+知识图谱

from llama_index.core.retrievers import QueryFusionRetriever # 向量检索器 vector_retriever = index.as_retriever(similarity_top_k=5) # 关键词检索器 keyword_retriever = index.as_retriever( similarity_top_k=5, retriever_mode="keyword" ) # 融合检索器(Reciprocal Rank Fusion) fusion_retriever = QueryFusionRetriever( retrievers=[vector_retriever, keyword_retriever], num_queries=3, # 生成3个改写查询 similarity_top_k=10, mode="reciprocal_rerank" ) nodes = fusion_retriever.retrieve("分布式事务如何保证一致性?") for node in nodes: print(f"Score: {node.score:.4f} | {node.text[:80]}")

回到顶部

九、与Spring Boot集成

@Service public class AdvancedRAGService { private final RestTemplate restTemplate = new RestTemplate(); @Value("${llama-index.service.url}") private String llamaServiceUrl; public String query(String question, String mode) { Map<String, Object> body = Map.of( "question", question, "mode", mode, // basic / hyde / sub_question / kg "top_k", 5 ); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<Map<String, Object>> entity = new HttpEntity<>(body, headers); ResponseEntity resp = restTemplate.exchange( llamaServiceUrl + "/query", HttpMethod.POST, entity, Map.class); return (String) resp.getBody().get("answer"); } }

回到顶部

十、评估与优化

from llama_index.core.evaluation import FaithfulnessEvaluator, RelevancyEvaluator # 评估忠实度(回答是否基于检索内容) faith_eval = FaithfulnessEvaluator(llm=llm) # 评估相关性(回答是否切题) rel_eval = RelevancyEvaluator(llm=llm) # 批量评估 questions = ["什么是RAG?", "向量数据库如何选择?", "知识图谱如何构建?"] for q in questions: response = query_engine.query(q) faith_result = faith_eval.evaluate_response(query=q, response=response) rel_result = rel_eval.evaluate_response(query=q, response=response) print(f"Q: {q}") print(f" 忠实度: {faith_result.passing}") print(f" 相关性: {rel_result.passing}")

回到顶部

十一、最佳实践

  1. 分块策略:根据文档类型选择合适的chunk_size(256-1024)
  2. 混合检索:向量+关键词融合效果优于单一检索
  3. 重排序:检索top_k大,rerank后取小,精度更高
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 4:45:05

【微服务学习笔记】分布式锁与线程锁的理解和使用

分布式锁与线程锁的理解和使用 一、线程锁&#xff08;本地锁&#xff0c;JVM级别&#xff09; 理解&#xff1a; 线程锁用于同一进程内多线程对共享资源的互斥访问&#xff0c;保证线程安全。常见的有 synchronized、ReentrantLock、ReadWriteLock 等。 例子&#xff1a; …

作者头像 李华
网站建设 2026/7/2 4:44:42

MAC多微信登录

# 1. 安装工具 brew install sunnyyoung/repo/wechattweak-cli# 2. 安装插件&#xff08;需要输入密码&#xff09; sudo wechattweak-cli install# 3. 完全退出微信&#xff0c;重新打开现在你的 Mac 上可以同时运行两个微信了&#xff01;### 当前状态 - **第一个微信**: /Ap…

作者头像 李华
网站建设 2026/7/2 4:41:17

GraphRAG 实战:知识图谱和 RAG 结合起来,把核心能力写进作品集

聊《GraphRAG 实战&#xff1a;知识图谱和 RAG 结合起来&#xff0c;把核心能力写进作品集》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。摘要这篇面向需要构建企业知识库和复杂问答系统的开发者&#xff0c;但不…

作者头像 李华
网站建设 2026/7/2 4:39:37

制造业品牌策划设计:视维助力工厂从“代工“走向“品牌“

东莞作为"世界工厂"&#xff0c;聚集着数十万家制造型企业。过去几十年&#xff0c;这里的大多数企业靠接单代工、拼产能、压成本活得很扎实&#xff1b;但到了今天&#xff0c;原材料、人力、流量成本全线上涨&#xff0c;海外订单波动&#xff0c;单纯"做货&q…

作者头像 李华