网站建设运营推广,品牌网络推广公司排名,网站网页制作模板,装修图片大全一、引言
在前面的文章我们对langchain和RAG都做过深入的探讨#xff0c;检索增强生成#xff08;RAG#xff09;是解决模型核心痛点的关键技术#xff0c;它能让大模型基于本地私有数据生成精准回答#xff0c;彻底规避 幻觉问题#xff0c;同时满足数据本地化、合规性要…一、引言在前面的文章我们对langchain和RAG都做过深入的探讨检索增强生成RAG是解决模型核心痛点的关键技术它能让大模型基于本地私有数据生成精准回答彻底规避 幻觉问题同时满足数据本地化、合规性要求。而LlamaIndex是专为 RAG 场景设计的轻量级 Python 框架定位为大模型的外部数据中间件核心能力是高效连接本地数据与大模型。相较于 LangChain 等全场景框架LlamaIndex 更聚焦 RAG 流程的轻量化实现无需复杂配置即可完成 “文档加载→向量索引→智能问答” 的全闭环且深度兼容 Qwen、Llama、Baichuan 等开源大模型支持纯 CPU 本地化部署是个人开发者和中小企业落地 RAG 应用的首选工具。今天我们将从核心概念、技术架构、实战落地三个维度由浅入深拆解 LlamaIndex 的使用方法配套可直接运行的代码示例基于本地的 paraphrase-MiniLM-L6-v2 嵌入模型和 Qwen1.5-1.8B-Chat 大模型并补充关键技术细节与可视化流程图覆盖从原理到实践的全维度知识。二、LlamaIndex 核心概念LlamaIndex 的核心价值在于将非结构化本地数据与大语言模型高效连接其底层逻辑围绕一组核心概念构建这些概念构成了 RAG检索增强生成流程的完整闭环。以下对每个核心概念进行逐维度、精细化的解析Document文档1.1 基础定义Document 是 LlamaIndex 对原始数据源的标准化封装是整个 RAG 流程的数据入口。它并非仅指传统的文本文档而是涵盖所有可被加载的结构化 / 非结构化数据的抽象载体无论是本地 TXT/PDF/Markdown 文件、数据库中的单行数据、网页爬取的文本还是 API 返回的结构化信息加载后都会被统一封装为 Document 对象。1.2 核心属性每个 Document 对象包含以下关键属性决定了数据的可用性与溯源性text核心属性存储文档的原始文本内容如 TXT 文件的全部字符、PDF 解析后的文本metadata元数据字典用于记录文档的上下文信息是「回答溯源」和「多文档管理」的核心依据常见字段包括file_name文档文件名如 system_design.txtfile_path文档绝对路径如 D:/docs/system_design.txtcreation_date文档创建时间category自定义文档分类如 “需求文档”“技术文档”id_唯一标识符LlamaIndex 自动生成也可自定义用于区分不同 Document。1.3 关键特性多源适配性LlamaIndex 提供 100 内置 Data Loader可将不同数据源本地文件、数据库、Notion、Slack 等转为统一的 Document 对象无需手动适配格式不可变性原始 Document 一旦加载内容不会被修改后续的分割、清洗操作会基于其生成新的 Node而非修改原 Document编码保障加载中文文档时需通过 encoding“utf-8” 指定编码否则会导致 text 字段乱码直接影响后续向量化和检索精度批量加载通过 SimpleDirectoryReader 可批量加载指定目录下的所有文件生成 Document 列表示例from llama_index.core import SimpleDirectoryReader # 加载目录下所有文件生成Document列表 documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() # 查看第一个Document的属性 print(f文档名称{documents[0].metadata[file_name]}) print(f文档内容长度{len(documents[0].text)}字符)1.4 应用场景单文档加载加载单个 TXT/PDF 文件作为问答数据源多文档批量加载加载整个知识库目录下的所有文档实现跨文档检索动态文档加载从数据库 / API 实时获取数据并封装为 Document适配动态更新的数据源。Node节点2.1 基础定义Node 是 LlamaIndex 对 Document 的最小可检索单元也被称为文本块。它是将原始长文档切分后生成的子文本片段是 RAG 流程中向量化和检索的核心对象长文档直接向量化会丢失局部语义如一个 10000 字符的文档其向量无法精准表征某一段落的含义而将文档切分为小尺寸的 Node 后每个 Node 的向量能精准对应局部语义大幅提升检索精度。2.2 与 Document 的关系从属关系一个 Document 可被切分为多个 Node一对多每个 Node 会继承原 Document 的 metadata如文件名、路径并新增自身的元信息如在原文档中的位置独立性Node 是独立的检索单元检索过程中只会匹配与问题最相关的 Node而非整个 Document可追溯性通过 Node 的 metadata 可反向定位到原始 Document实现 “回答→Node→Document” 的全链路溯源。2.3 核心属性textNode 的核心文本内容如 512 字符的子文本片段metadata继承自原 Document 的元数据 新增的节点元数据如start_char_idxNode 在原 Document 中的起始字符位置end_char_idxNode 在原 Document 中的结束字符位置document_id关联的原始 Document IDid_Node 唯一标识符relationships记录 Node 与其他 Node / 原 Document 的关系如前序 Node、后序 Node、父 Document。2.4 切分规则LlamaIndex 提供 SentenceSplitter默认、TokenTextSplitter 等 Node 切分器核心参数决定切分效果2.4.1 chunk_size定义单个 Node 的最大字符 / Token 数作用核心参数需适配嵌入模型的上下文长度轻量模型如 paraphrase-MiniLM-L6-v2256~512 字符高精度模型如 bge-large-zh512~1024 字符过小会导致语义割裂如一句话被切分过大则失去局部精准性。2.4.2 chunk_overlap定义相邻 Node 的重叠字符数作用用于避免语义割裂如 chunk_size512 时chunk_overlap50 表示后一个 Node 会包含前一个 Node 最后 50 字符确保上下文连贯推荐值chunk_size 的 10%~20%。2.4.3 separator定义切分分隔符作用按语义切分的关键避免切断完整语义中文文档\n换行、。句号Markdown 文档\n## 标题分隔符默认值空格易切断语义需手动指定。2.5 切分示例实践from llama_index.core.node_parser import SentenceSplitter from llama_index.core import SimpleDirectoryReader # 1. 加载原始Document documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() # 2. 自定义切分器适配中文Markdown文档 splitter SentenceSplitter( chunk_size512, # 单个Node 512字符 chunk_overlap50, # 重叠50字符 separator\n## # 按Markdown二级标题切分 ) # 3. 切分Document为Node列表 nodes splitter.get_nodes_from_documents(documents) # 查看Node属性 print(f原始Document数量{len(documents)}) print(f切分后Node数量{len(nodes)}) print(f第一个Node的文本{nodes[0].text[:100]}...) print(f第一个Node的来源文档{nodes[0].metadata[file_name]}) print(fNode在原文档中的位置{nodes[0].metadata[start_char_idx]}-{nodes[0].metadata[end_char_idx]})2.6 关键说明语义优先于长度切分的核心目标是 “保留完整语义”而非严格遵守 chunk_size—— 若按分隔符切分后的文本块略超过 chunk_sizeLlamaIndex 会优先保留完整语义而非强制截断避免过度切分对于短文档如 1000 字符无需切分单个 Node 即可满足检索需求多语言适配中文文档需避免按空格切分中文无空格优先使用换行、标点作为分隔符。Index索引3.1 基础定义Index 是 LlamaIndex 对Node 向量的结构化存储与检索引擎是连接 “文本数据” 与 “相似度检索” 的核心桥梁。其本质是将所有 Node 的文本内容通过嵌入模型转为高维向量再将 “向量→Node” 的映射关系存储在特定的数据结构中当用户提问时能快速检索出与问题向量最相似的 Node 集合。3.2 核心价值提速检索直接比对文本相似度的时间复杂度为 O (n)n 为 Node 数量而基于向量索引的检索时间复杂度可降至 O (log n)即使上千个 Node 也能毫秒级返回结果精准匹配基于向量的语义检索能突破关键词检索的局限性如 “电脑卡” 可匹配到 “计算机运行缓慢”实现 “语义级” 精准匹配灵活扩展支持内存存储默认、磁盘存储、第三方向量数据库Chroma、Pinecone、Milvus 等适配不同规模的应用场景。3.3 索引类型LlamaIndex 提供多种索引类型适配不同场景其中 VectorStoreIndex 是最基础、最常用的类型3.3.1 VectorStoreIndex基础介绍存储 Node 向量基于余弦相似度检索适用场景通用场景本地文档问答、知识库支持纯 CPU 运行轻量化部署3.3.2 KeywordIndex基础介绍基于关键词倒排索引检索适用场景精准关键词匹配场景如产品型号、编号检索检索速度最快3.3.3 TreeIndex基础介绍构建树形结构逐层汇总文本内容适用场景长文档摘要、多文档汇总场景适合生成结构化回答3.3.4 ListIndex基础介绍按顺序存储 Node线性检索适用场景小批量 Node100场景实现简单无需复杂计算3.3.5 KnowledgeGraphIndex基础介绍构建实体关系图基于图谱检索适用场景实体关系推理场景如 “XX 产品的适配型号有哪些”3.4 VectorStoreIndex详细介绍3.4.1 核心原理向量化遍历所有 Node通过嵌入模型如 paraphrase-MiniLM-L6-v2将每个 Node 的 text 转为固定维度的向量如 paraphrase-MiniLM-L6-v2 输出 384 维向量存储将 “Node ID→向量→Node 元数据” 的映射关系存储在内存默认或磁盘检索用户提问时先将问题转为向量通过「余弦相似度」计算问题向量与所有 Node 向量的匹配度返回 Top-K 最相似的 Node。3.4.2 构建与使用from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter # 1. 加载Document并切分为Node documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() splitter SentenceSplitter(chunk_size512, chunk_overlap50) nodes splitter.get_nodes_from_documents(documents) # 2. 构建VectorStoreIndex基于Node向量 index VectorStoreIndex(nodes) # 3. 索引持久化保存到磁盘避免重复构建 index.storage_context.persist(persist_dir./index_cache) # 4. 加载缓存索引后续运行直接加载 from llama_index.core import StorageContext, load_index_from_storage storage_context StorageContext.from_defaults(persist_dir./index_cache) index load_index_from_storage(storage_context)3.4.3 核心参数调优similarity_top_k检索返回的最相似 Node 数量推荐 3~5数量过少会丢失相关信息过多会增加大模型推理压力embed_model指定嵌入模型默认 OpenAI Embedding需替换为本地模型如 paraphrase-MiniLM-L6-v2show_progress构建索引时显示进度条True/False大批量 Node 时建议开启。3.5 索引的生命周期构建首次加载 Document 并切分 Node 后生成向量并构建索引耗时最长取决于 Node 数量加载后续运行从磁盘加载已构建的索引毫秒级更新新增 / 删除 Document 时可增量更新索引无需重新构建全部销毁删除索引缓存目录即可清除索引需重新构建。Query Engine查询引擎4.1 基础定义Query Engine 是 LlamaIndex 封装的端到端问答引擎是连接Index索引与 大模型 的核心桥梁。它将 “问题检索→提示词拼接→大模型生成→回答格式化” 的全流程封装为统一接口用户只需调用 query() 方法即可完成从 “输入问题” 到 “获取回答” 的闭环无需手动处理中间环节。4.2 核心工作流程Query Engine 的内部运行逻辑是 RAG 流程的核心可拆解为 6 个步骤问题向量化将用户输入的自然语言问题通过与构建索引时相同的嵌入模型转为向量检索相关 Node调用 Retriever检索器从 Index 中检索与问题向量最相似的 Top-K Node提示词拼接将 “用户问题 检索到的 Node 文本” 拼接为符合大模型格式的提示词Prompt调用大模型将拼接后的提示词传入大模型如 Qwen1.5-1.8B-Chat生成原始回答回答格式化剔除原始回答中的冗余信息如重复的提示词内容仅保留核心回答返回结果将格式化后的回答返回给用户同时可携带溯源信息如回答对应的 Node。提示词拼接参考示例基于以下信息回答问题 1. 智能客服系统基于LlamaIndex框架开发支持纯CPU运行内存占用≤6GB 2. 系统采用的嵌入模型为paraphrase-MiniLM-L6-v2大小80MB 问题智能客服系统的内存占用要求是多少4.3 核心 Query Engine 类型DefaultQueryEngine默认查询引擎适配绝大多数通用场景RetrieverQueryEngine自定义 Retriever 的查询引擎适配个性化检索需求MultiDocumentQueryEngine多文档联合查询引擎适配跨索引检索场景SubQuestionQueryEngine子问题查询引擎将复杂问题拆分为子问题分别检索后汇总回答适配复杂推理问题。4.4 核心配置参数as_query_engine()4.4.1 similarity_top_k定义检索的 Top-K Node 数量作用通用场景 3~5复杂推理场景 5~8避免过多导致提示词过长4.4.2 response_mode定义回答生成模式作用- compact紧凑回答默认剔除冗余最常用tree_summarize树形汇总多 Node 汇总回答refine迭代优化先生成初步回答再结合更多 Node 优化simple_summarize简单汇总直接汇总 Node 内容4.4.3 llm定义指定大模型实例作用替换为自定义本地大模型如 LocalQwenLLM替代默认的 OpenAI GPT4.4.4 verbose定义是否显示检索过程True 显示检索的 Node 数量、相似度等信息调试用False 仅返回回答4.4.5 streaming定义是否流式返回回答作用True 逐字返回回答提升交互体验False 一次性返回CPU 更高效4.5 使用示例from llama_index.core import VectorStoreIndex, SimpleDirectoryReader # 1. 构建索引 documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() index VectorStoreIndex.from_documents(documents) # 2. 创建查询引擎自定义参数 query_engine index.as_query_engine( similarity_top_k3, # 检索Top-3 Node response_modecompact, # 紧凑回答模式 verboseTrue, # 显示检索过程 streamingFalse # 非流式返回 ) # 3. 执行问答 response query_engine.query(智能客服系统的核心功能有哪些) # 4. 查看结果 print(f最终回答{response}) # 查看回答溯源对应的Node print(\n回答来源) for node in response.source_nodes: print(f 相似度{node.score:.2f} | 文本片段{node.node.text[:100]}...)4.6 关键特性端到端封装用户无需关注中间的向量化、检索、提示词拼接等细节只需调用 query() 方法可扩展性支持自定义 Retriever、LLM、回答模式适配个性化需求溯源性返回的 response 对象包含 source_nodes 属性可追溯回答的数据源满足合规性要求异常处理内置基础的异常捕获逻辑如检索不到相关 Node 时大模型会基于通用知识回答并提示 “未检索到相关信息”。Retriever检索器5.1 基础定义Retriever 是 LlamaIndex 中从 Index 中检索相关 Node的核心组件是 Query Engine 的 “检索子模块”。它的唯一职责是接收用户问题的向量表示从 Index 中筛选出与问题语义最相似的 Node 集合为后续的提示词拼接提供素材。Retriever 与 Index是配套使用的关系不同类型的 Index 对应不同的 Retriever如 VectorStoreIndex 对应 VectorIndexRetriever确保检索逻辑与索引存储结构匹配。5.2 核心 Retriever 类型检索器类型适配索引类型检索原理适用场景VectorIndexRetrieverVectorStoreIndex余弦相似度匹配向量通用语义检索场景90% 的 RAG 场景KeywordTableRetrieverKeywordIndex关键词匹配倒排索引精准关键词检索如产品编号、文档名称TreeRetrieverTreeIndex树形结构逐层检索长文档摘要、结构化回答场景ListRetrieverListIndex线性遍历 Node 匹配小批量 Node100、简单检索场景BM25Retriever任意 IndexBM25 算法传统信息检索补充向量检索提升关键词匹配精度5.3 核心检索原理向量计算将用户问题的向量与 Index 中所有 Node 的向量进行余弦相似度计算余弦值越接近 1语义越相似余弦相似度公式similarity(A,B) A⋅B / ∥A∥×∥B∥其中A 为问题向量B 为 Node 向量∥A∥、∥B∥ 为向量的模长。排序筛选将所有 Node 按相似度从高到低排序筛选出前 similarity_top_k 个 Node返回结果返回筛选后的 Node 列表包含 Node 文本、相似度得分、元数据等信息。5.4 Retriever 使用5.4.1 默认 Retriever 使用通过 Query Engine 间接调用from llama_index.core import VectorStoreIndex, SimpleDirectoryReader # 1. 构建索引 documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() index VectorStoreIndex.from_documents(documents) # 2. 创建Query Engine时默认使用VectorIndexRetriever query_engine index.as_query_engine(similarity_top_k3) # Retriever的top_k参数5.4.2 自定义 Retriever灵活适配场景from llama_index.core.retrievers import VectorIndexRetriever from llama_index.core.query_engine import RetrieverQueryEngine # 1. 构建索引 documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() index VectorStoreIndex.from_documents(documents) # 2. 自定义Retriever指定top_k和索引 retriever VectorIndexRetriever( indexindex, similarity_top_k3, # 检索Top-3 Node vector_store_query_modecosine # 检索模式余弦相似度 ) # 3. 基于自定义Retriever创建Query Engine query_engine RetrieverQueryEngine.from_args( retrieverretriever, response_modecompact ) # 4. 执行检索手动调用Retriever无需Query Engine nodes retriever.retrieve(智能客服系统的内存占用要求是多少) print(f检索到的Node数量{len(nodes)}) for node in nodes: print(f相似度{node.score:.2f} | 文本{node.text[:100]}...)5.5 检索精度优化组合检索将 VectorIndexRetriever语义检索与 BM25Retriever关键词检索结合取并集后再筛选提升检索覆盖率调优 similarity_top_k从 3 开始逐步增加直到回答精度不再提升避免过度检索过滤低相似度 Node设置相似度阈值如 0.5剔除得分低于阈值的 Node减少冗余信息优化嵌入模型更换更高精度的嵌入模型如 bge-large-zh-v1.5提升向量表征能力。Response Synthesis回答合成6.1 基础定义Response Synthesis回答合成是 LlamaIndex 中将检索到的 Node 文本与用户问题结合生成最终回答的核心环节是 Query Engine 的 “生成子模块”。它的核心职责是将检索到的相关 Node 文本合理组织为提示词传入大模型并格式化输出结果确保回答既基于检索到的真实数据又符合用户的提问意图。6.2 核心合成模式LlamaIndex 提供多种合成模式适配不同的检索结果和提问场景核心模式的对比与适用场景如下6.2.1 compact默认核心逻辑拼接问题 Top-K Node 文本生成紧凑提示词大模型直接回答输出特点简洁、精准、无冗余适用场景通用问答场景如 “系统的核心功能有哪些”6.2.2 tree_summarize核心逻辑将 Node 按树形结构分层汇总逐层生成回答最终汇总为完整回答输出特点结构化、全面、适合多 Node 场景适用场景多文档汇总、长文本摘要如 “总结系统的部署要求”6.2.3 refine核心逻辑先基于第一个 Node 生成初步回答再结合后续 Node 迭代优化回答输出特点精准、迭代优化、适合复杂问题适用场景复杂推理、细节型问题如 “系统的内存占用和 CPU 要求分别是什么”6.2.4 simple_summarize核心逻辑直接汇总所有 Node 的文本内容生成简洁摘要输出特点简洁、仅汇总事实、无推理适用场景纯事实汇总如 “列出系统支持的文档格式”6.2.5 generation核心逻辑不使用检索到的 Node直接调用大模型回答退化为纯 LLM 问答输出特点无检索依据、易幻觉适用场景仅用于对比测试验证 RAG 的价值6.2.6 accumulate核心逻辑按 Node 顺序累加文本逐步生成回答输出特点上下文连贯、适合时序数据适用场景时序文档问答如 “按时间顺序说明系统的迭代历程”6.3 合成流程拆解6.3.1 提示词构建核心逻辑是 “问题 检索到的 Node 文本 指令”示例提示词模板请严格基于以下提供的信息回答问题不要使用外部知识。如果信息不足请回答“未检索到相关信息”。 提供的信息 {context} # 检索到的Node文本多个Node用换行分隔 问题{query} 回答其中{context} 为检索到的 Top-K Node 文本拼接结果{query} 为用户问题。6.3.2 大模型调用将构建好的提示词传入大模型如 Qwen1.5-1.8B-Chat生成原始回答示例原始回答 请严格基于以下提供的信息回答问题不要使用外部知识。如果信息不足请回答“未检索到相关信息”。 提供的信息 1. 智能客服系统基于LlamaIndex框架开发支持纯CPU运行内存占用≤6GB 2. 系统采用的嵌入模型为paraphrase-MiniLM-L6-v2大小80MB 问题智能客服系统的内存占用要求是多少 回答智能客服系统的内存占用≤6GB。6.3.3 回答格式化剔除提示词中的冗余内容如 “提供的信息”“请严格基于以下信息” 等仅保留核心回答“智能客服系统的内存占用≤6GB。”。6.3.4 结果封装将格式化后的回答封装为 Response 对象包含以下核心属性text最终回答文本source_nodes回答对应的 Node 列表溯源用metadata回答的元数据如生成时间、使用的合成模式。6.4 自定义合成逻辑对于个性化的合成需求如自定义提示词模板、多轮优化回答可通过继承 BaseSynthesizer 实现自定义合成器from llama_index.core.response_synthesizers import BaseSynthesizer, ResponseTuple from llama_index.core.llms import LLM from typing import List from llama_index.core.schema import NodeWithScore class CustomSynthesizer(BaseSynthesizer): def __init__(self, llm: LLM): self.llm llm def get_response(self, query: str, nodes: List[NodeWithScore]) - ResponseTuple: # 1. 自定义提示词模板 context \n.join([f{i1}. {node.text} for i, node in enumerate(nodes)]) prompt f 请以“专业、简洁”的风格回答以下问题回答必须基于以下信息 信息 {context} 问题{query} 专业回答 # 2. 调用大模型生成回答 response self.llm.complete(prompt) # 3. 封装结果 return ResponseTuple(response.text, nodes) # 使用自定义合成器创建Query Engine from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.query_engine import RetrieverQueryEngine from llama_index.core.retrievers import VectorIndexRetriever # 1. 构建索引和Retriever documents SimpleDirectoryReader(./docs, encodingutf-8).load_data() index VectorStoreIndex.from_documents(documents) retriever VectorIndexRetriever(indexindex, similarity_top_k3) # 2. 加载自定义LLM from custom_llm import LocalQwenLLM # 自定义Qwen LLM类 llm LocalQwenLLM(D:\\modelscope\\hub\\qwen\\Qwen1___5-1___8B-Chat) # 3. 创建自定义合成器 custom_synthesizer CustomSynthesizer(llmllm) # 4. 构建Query Engine query_engine RetrieverQueryEngine( retrieverretriever, response_synthesizercustom_synthesizer ) # 5. 执行问答 response query_engine.query(智能客服系统的核心功能有哪些) print(f自定义合成回答{response})6.5 关键优化原则提示词简洁化避免过长的提示词CPU 场景下大模型处理长提示词速度慢且易出错仅保留核心问题和检索到的 Node 文本指令明确化在提示词中明确回答要求如 “严格基于提供的信息”“简洁回答”“不要编造信息”减少大模型幻觉格式标准化对多 Node 场景按固定格式如编号列表拼接 Node 文本提升大模型理解效率异常兜底当检索到的 Node 为空时提示大模型返回 “未检索到相关信息”而非编造答案。三、应用示例LlamaIndex支持自定义嵌入模型和LLM我们可以通过相应的类来集成本地模型。这里我们使用sentence-transformers的模型作为嵌入模型使用Qwen1.5-1.8B-Chat作为大模型。执行步骤加载文档这里假设有一个data目录里面存放了要处理的文档设置嵌入模型使用本地sentence-transformers模型设置大模型使用本地Qwen1.5-1.8B-Chat创建索引并查询from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.llms.huggingface import HuggingFaceLLM from llama_index.core.prompts import PromptTemplate from modelscope import snapshot_download import torch # 1. 下载或加载本地模型 model_id qwen/Qwen1.5-1.8B-Chat cache_dir D:\\modelscope\\hub local_model_path snapshot_download(model_id, cache_dircache_dir) # 2. 配置本地嵌入模型 embed_model_path D:/modelscope/hub/models/sentence-transformers/paraphrase-MiniLM-L6-v2 Settings.embed_model HuggingFaceEmbedding( model_nameembed_model_path, devicecuda if torch.cuda.is_available() else cpu ) # 3. 配置本地大模型 - 修正版本 system_prompt 你是一个有帮助的AI助手。请根据提供的上下文信息回答问题。如果无法从上下文中找到答案请诚实地说明。 query_wrapper_prompt PromptTemplate( 下面是一个问题。\n ---------------------\n {query_str}\n ---------------------\n 请根据你的知识回答这个问题 ) # 方法1: 使用正确的参数配置 Settings.llm HuggingFaceLLM( model_namelocal_model_path, tokenizer_namelocal_model_path, # 将 device_map 移到 model_kwargs 外面 device_mapauto, model_kwargs{ torch_dtype: torch.float16 if torch.cuda.is_available() else torch.float32, cache_dir: cache_dir, }, generate_kwargs{ temperature: 0.1, top_p: 0.95, do_sample: True, }, system_promptsystem_prompt, query_wrapper_promptquery_wrapper_prompt, ) # 4. 加载文档 try: documents SimpleDirectoryReader(./data).load_data() print(f成功加载 {len(documents)} 个文档) except Exception as e: print(f文档加载失败: {e}) print(请确保 ./data 目录存在且包含文档文件) print(正在创建示例文档...) # 创建一个示例文本文件 import os os.makedirs(./data, exist_okTrue) with open(./data/example.txt, w, encodingutf-8) as f: f.write(LlamaIndex 是一个用于构建检索增强生成(RAG)应用的数据框架。 它允许你连接自定义数据源到大语言模型。 主要功能包括 1. 数据加载和索引 2. 向量搜索 3. 查询引擎 4. 对话系统) documents SimpleDirectoryReader(./data).load_data() print(已创建并加载示例文档) # 5. 创建向量索引 print(正在创建向量索引...) index VectorStoreIndex.from_documents( documents, embed_modelSettings.embed_model ) # 6. 创建查询引擎 query_engine index.as_query_engine( llmSettings.llm, similarity_top_k3 ) # 7. 测试查询 print(\n *50) print(LlamaIndex 本地模型示例 - 测试查询) print(*50) # 简单的测试查询 try: response query_engine.query(LlamaIndex 是什么) print(f问题: LlamaIndex 是什么) print(f回答: {response}) except Exception as e: print(f查询失败: {e}) # 8. 交互式查询 print(\n *50) print(进入交互式查询模式 (输入 quit 或 exit 退出)) print(*50) while True: try: user_query input(\n请输入问题: ).strip() if user_query.lower() in [quit, exit, q]: print(再见) break if not user_query: continue response query_engine.query(user_query) print(f\n回答: {response}) except KeyboardInterrupt: print(\n\n程序被中断) break except Exception as e: print(f查询出错: {e})输出参考成功加载 1 个文档 正在创建向量索引... LlamaIndex 本地模型示例 - 测试查询 问题: LlamaIndex 是什么 回答: LlamaIndex 是一个用于构建检索增强生成(RAG)应用的数据框架它允许用户连接自定义数据源到大语言模型并提供以下 主要功能 1. 数据加载和索引 2. 向量搜索 3. 查询引擎 4. 对话系统 其中LlamaIndex 的具体功能包括 1. 数据加载和索引用户可以将来自各种来源如数据库、API、文件系统等的数据导入到LlamaIndex 中进行存储和索引。这 使得模型能够快速地从这些数据中提取有用的信息从而提高检索性能和查询效率。 2. 向量搜索LlamaIndex 提供了一种高效的方法来搜索和查找向量数据。通过使用词袋模型或TF-IDF 等方法模型能够识别出 与特定关键词相关的向量并在搜索过程中优先匹配这些向量。这种搜索方式不仅适用于文本数据也适用于图像、音频、视频等 多种类型的数据。 3. 查询引擎LlamaIndex 为用户提供了一个强大的查询引擎使他们能够基于预定义的查询条件如关键词、实体、关系等对 模型中的向量进行查询。这个引擎还支持模糊查询、 进入交互式查询模式 (输入 quit 或 exit 退出) 请输入问题: 公司的年假政策是怎样的 回答: 公司规定员工每年享受多少天年假具体为 1-3年员工享有5天年假3-5年员工享有10天年假。所有员工都需要遵守保密协议不得泄露公司商业秘密和技术信息。 请输入问题: 智能客服系统有哪些功能 回答: 智能客服系统的主要功能包括... 请输入问题: 2024年AI发展趋势是什么 回答: 2024年生成式AI技术将继续快速发展多模态能力成为重点。企业应用AI的主要方向包括智能客服、内容生成、数据分析 等。深度学习和神经网络技术不断突破大模型参数规模持续增长。具体来说以下几点是2024年AI发展趋势...四、总结基于LlamaIndex框架构建的本地RAG系统实现了从用户提问到智能回答的完整工作流。系统首先将用户输入的自然语言问题通过Sentence-Transformers嵌入模型向量化随后调用Retriever组件从预先构建的向量索引中检索最相关的Top-K个文档节点。检索到的节点文本与原始问题经过精心设计的提示词模板进行智能拼接形成完整的上下文输入。本地部署的Qwen1.5大模型基于该上下文生成初步回答最后经过后处理模块剔除冗余信息、格式化输出向用户返回精准、可溯源的最终答案。整个流程充分体现了检索增强生成技术的核心优势在保证数据隐私的前提下有效扩展了大语言模型的知识边界为构建企业级智能问答系统提供了可靠的技术路径。那么如何系统的去学习大模型LLM作为一名深耕行业的资深大模型算法工程师我经常会收到一些评论和私信我是小白学习大模型该从哪里入手呢我自学没有方向怎么办这个地方我不会啊。如果你也有类似的经历一定要继续看下去这些问题啊也不是三言两语啊就能讲明白的。所以我综合了大模型的所有知识点给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢我就曾放空大脑以一个大模型小白的角度去重新解析它采用基础知识和实战项目相结合的教学方式历时3个月终于完成了这样的课程让你真正体会到什么是每一秒都在疯狂输出知识点。由于篇幅有限⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》扫码获取~大模型学习指南路线汇总我们这套大模型资料呢会从基础篇、进阶篇和项目实战篇等三大方面来讲解。①.基础篇基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念用最易懂的方式带你入门大模型。②.进阶篇接下来是进阶篇你将掌握RAG、Agent、Langchain、大模型微调和私有化部署学习如何构建外挂知识库并和自己的企业相结合学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。③.实战篇实战篇会手把手带着大家练习企业级的落地项目已脱敏比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等从而帮助大家更好的应对大模型时代的挑战。④.福利篇最后呢会给大家一个小福利课程视频中的所有素材有搭建AI开发环境资料包还有学习计划表几十上百G素材、电子书和课件等等只要你能想到的素材我这里几乎都有。我已经全部上传到CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】相信我这套大模型系统教程将会是全网最齐全 最易懂的小白专用课