使用 LlamaIndex 部署本地 Mistral-7b 大模型实现 RAG

原理

LlamaIndex的文档链接:Using LLMs - LlamaIndex 🦙 0.9.33

LlamaIndex 的一般使用模式如下:

  1. 加载文档(手动或通过数据加载器)
  2. 将文档解析为节点
  3. 构建索引(来自节点或文档)
  4. (可选,高级)在其他索引之上构建索引
  5. 查询索引

默认情况下,LlamaIndex 使用 OpenAI 的text-davinci-003模型,然而由于 OpenAI 的网站在国内无法访问,故使用本地下载好的 🐋 Mistral-7B-OpenOrca 🐋 模型代替之。
模型的链接如下:
Open-Orca/Mistral-7B-OpenOrca · Hugging Face

示例

HuggingFaceLLM 的参数如下:

HuggingFaceLLM - LlamaIndex 🦙 0.9.33

generate_kwargs 就是在生成时传递给模型的参数,具体可以看:

Generation 说明

首先准备一段文字,任意内容皆可,我准备的是关于【科学指南针】服务机构的介绍,摘自下面的网站:

科学指南针科研推出论文阅读,管理神器,强大AI赋能,轻松科研_服务_工作台_用户

科学指南针,一家始终致力于为科研工作者提供专业、快捷、全方位的检测及科研服务的大型科研服务机构,近日重磅推出全新产品「科研工作台」——一款集论文阅读、管理、分析于一体的AI赋能神器。这款产品的推出,将AI技术与科研工作深度融合,为科研工作者提供前所未有的便利。
「科研工作台」不仅具备自动解读论文研究目的、主要内容、实验过程等强大功能,还支持一键定位原文精读。更重要的是,它配备的AI阅读助手可以基于论文内容,快速回答用户提出的任何问题,帮助科研人员快速获取所需信息。这一创新性的设计,无疑将极大地提升科研工作的效率。
此外,「科研工作台」还支持分组/标签双体系管理文献。用户可以根据自己的需求,自定义建立分组和子分组进行文献管理。同时,系统会自动根据关键信息为文献打标签,并允许用户自定义新增或删除标签。通过这一功能,用户可以快速筛选出自己需要的文献。
自2014年成立以来,科学指南针始终以全心全意服务科研,助力全球科技创新为使命。经过数年的努力,公司已建立起包括材料测试、环境检测、生物服务、行业解决方案、科研绘图、模拟计算、数据分析、论文服务、试剂耗材、指南针学院等在内的科研产品和服务矩阵。如今,「科研工作台」的推出,再次证明了科学指南针在推动创新方面的能力。
值得一提的是,科学指南针的生物实验室已经取得了实验动物许可证,环境实验室和南京材料实验室先后获得了中国计量认证证书(CMA)。此外,南京材料实验室还获得了ISO三体系认证。这些资质和认证,不仅证明了科学指南针在科研服务领域的专业性和可靠性,也为其未来的发展奠定了坚实的基础。
展望未来,科学指南针的愿景是成为世界级科研服务机构。他们坚信,只要有科研的地方,就应有科学指南针的存在。而「科研工作台」的推出,正是实现这一愿景的重要一步。这款产品将为全球科研工作者提供更为便捷、高效的服务,助力科研事业的发展。
在新的历史起点上,科学指南针将继续秉承全心全意服务科研的使命,不断创新、追求卓越。我们期待着他们在未来的发展中,继续为全球科技创新做出更大的贡献

代码如下,这里使用了 HuggingFaceLLM 包来加载本地的 LLM。使用 load_in_4bit 对模型进行量化。
embed_model 选用了 “local:BAAI/bge-large-zh-v1.5”

from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index import ServiceContext
from llama_index.llms import HuggingFaceLLM
import torch
from transformers import BitsAndBytesConfig, AutoModelForCausalLM, AutoTokenizer
from llama_index.prompts import PromptTemplate
from llama_index import set_global_service_context

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
)

model_name = "/root/autodl-tmp/kdy/models/Mistral-7B-OpenOrca"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
question = [
    {"role": "user", "content": "{query_str}"},
]
llm = HuggingFaceLLM(  
    model=model,
    tokenizer=tokenizer,
    query_wrapper_prompt=PromptTemplate(tokenizer.apply_chat_template(question, tokenize=False)),
    context_window=3900,
    max_new_tokens=500,
    model_kwargs={"quantization_config": quantization_config},
    generate_kwargs={"temperature": 0.2, "top_k": 5, "do_sample": True, "top_p": 0.95},
    device_map="auto",
)
service_context = ServiceContext.from_defaults(llm=llm, embed_model="local:BAAI/bge-large-zh-v1.5")
set_global_service_context(service_context)

documents = SimpleDirectoryReader("/root/autodl-tmp/kdy/RAG/data").load_data()
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir="./storage")

query_engine = index.as_query_engine(streaming=True, similarity_top_k=3)
response_stream = query_engine.query("科学指南针提供哪些服务?")
response_stream.print_response_stream()
print()

其中documents = SimpleDirectoryReader("/root/autodl-tmp/kdy/RAG/data").load_data() 中的 data 文件夹下存放自己提供的内容。

输出如下:
在这里插入图片描述

response_stream.print_response_stream() 方法会将答案逐字输出,如下面的 GIF 所示。
在这里插入图片描述

参考文献:

Using LLMs - LlamaIndex 🦙 0.9.33

Google Colaboratory

<think>好的,用户现在问的是怎么本地搭建RAG,也就是检索增强生成系统。之前他已经问过关于中文文本嵌入模型的问题,我给他推荐了BGE、M3E这些模型。现在他可能想进一步构建一个完整的RAG系统,利用之前提到的嵌入模型来处理中文文档。 首先,我需要确认用户的需求。RAG系统通常包括文档处理、嵌入模型、向量数据库和生成模型这几个部分。用户可能是在本地环境搭建,比如个人电脑或者公司服务器,所以需要考虑资源限制,比如是否需要GPU,模型的大小,以及部署的复杂度。 用户之前对嵌入模型有了解,可能需要选择合适的嵌入模型,比如之前提到的BGE-Zh或者M3E。接着是向量数据库的选择,常见的有FAISS、Chroma、Milvus等,需要根据用户的技术栈和资源来选择。例如,FAISS适合快速搭建,而Milvus适合分布式环境,但可能更复杂。 然后是生成模型部分,用户可能需要一个中文生成模型,比如ChatGLM、Qwen或者百川。需要考虑到模型的大小,比如7B参数的模型可能需要较高的显存,如果用户只有CPU,可能需要推荐量化版本或者更小的模型。 接下来是文档处理部分,需要将用户的文档转换为向量并存储到数据库中。这一步可能需要文本分割,比如按段落或固定长度分块,确保语义连贯。然后使用嵌入模型生成向量,并建立索引。 用户可能在实际操作中遇到问题,比如如何安装依赖库,如何处理不同格式的文档(PDF、Word、网页等),如何优化检索效果,以及如何集成生成模型。需要给出具体的步骤和示例代码,帮助用户一步步搭建。 此外,用户可能关心性能优化,比如如何处理长文本,如何提高检索速度,或者如何调整生成模型的参数以获得更好的回答。可能需要提到一些调优技巧,比如调整top-k检索数量,使用重排序模型,或者对生成模型进行温度参数调整。 还需要注意一些常见问题,比如中文分词的准确性,嵌入模型和生成模型的兼容性,向量数据库的持久化存储,以及系统的可扩展性。可能用户的应用场景是企业知识库、客服系统或者个人学习工具,不同的场景可能需要不同的配置建议。 最后,用户可能需要验证搭建的系统是否有效,可以建议使用示例数据进行测试,检查检索结果的相关性和生成回答的准确性。如果有问题,可能需要调试各个模块,比如检查嵌入是否正确,向量索引是否构建成功,或者生成模型是否正常加载。</think>以下是本地搭建RAG(Retrieval-Augmented Generation)系统的分步指南,涵盖从环境准备到代码实现的关键环节: --- ### **一、核心组件及工具选择** | 模块 | 推荐方案 | 替代方案 | |----------------|-----------------------------------|-------------------------| | 文本嵌入模型 | BGE-Zh / M3E | text2vec / Ernie | | 向量数据库 | FAISS(轻量) / Chroma(易用) | Milvus(分布式高性能) | | 生成模型 | ChatGLM3-6B / Qwen-7B | Baichuan2-7B / Mistral | | 文档处理工具 | LangChain / LlamaIndex | 自定义Python脚本 | --- ### **二、详细搭建步骤** #### **步骤1:环境准备** ```bash # 创建虚拟环境 conda create -n rag python=3.9 conda activate rag # 安装核心依赖 pip install langchain faiss-cpu transformers torch sentence-transformers ``` #### **步骤2:文档处理流水线** ```python from langchain.document_loaders import DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 加载文档(支持PDF/TXT/Word等) loader = DirectoryLoader('./docs/', glob="**/*.pdf") documents = loader.load() # 中文文本分割(建议块大小256-512字) text_splitter = RecursiveCharacterTextSplitter( chunk_size=300, chunk_overlap=50, separators=["\n\n", "\n", "。", "!", "?"] ) splits = text_splitter.split_documents(documents) ``` #### **步骤3:向量数据库构建** ```python from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 加载中文嵌入模型 embed_model = HuggingFaceEmbeddings(model_name="BAAI/bge-base-zh-v1.5") # 创建向量库 vector_db = FAISS.from_documents( documents=splits, embedding=embed_model ) # 持久化存储 vector_db.save_local("faiss_index") ``` #### **步骤4:检索增强生成整合** ```python from langchain.llms import HuggingFacePipeline from transformers import AutoModelForCausalLM, AutoTokenizer # 加载生成模型(示例使用ChatGLM3) model_path = "THUDM/chatglm3-6b" tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto") # 创建生成管道 llm = HuggingFacePipeline(pipeline=transformers.pipeline( "text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512 )) # 构建RAG链 retriever = vector_db.as_retriever(search_kwargs={"k": 3}) rag_chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) ``` #### **步骤5:查询测试** ```python query = "如何申请年度休假?" response = rag_chain.invoke(query) print(f"Answer: {response}") ``` --- ### **三、关键优化技巧** 1. **检索优化** - 混合检索:结合关键词(BM25)+语义检索 - 重排序:使用bge-reranker-base优化Top结果 ```python from FlagEmbedding import FlagReranker reranker = FlagReranker('BAAI/bge-reranker-base') ``` 2. **生成控制** - 添加系统提示词: ```python prompt = """基于以下上下文回答问题: {context} 问题:{question} 要求:用中文简洁回答,拒绝编造信息""" ``` - 设置生成参数:`temperature=0.3`, `top_p=0.85` 3. **性能提升** - 量化部署使用`llama.cpp`或`gptq`量化模型 - 硬件加速:通过`vLLM`提升推理速度 --- ### **四、硬件需求参考** | 组件 | 最低配置 | 推荐配置 | |---------------|------------------------|------------------------| | CPU | Intel i5 8代 | Xeon Silver 4210R | | 内存 | 16GB DDR4 | 64GB DDR4 ECC | | GPU | 无(CPU推理) | RTX 3090 (24GB显存) | | 存储 | 50GB HDD | 1TB NVMe SSD | --- ### **五、常见问题排查** 1. **显存不足** → 启用量化加载: ```python model = AutoModelForCausalLM.from_pretrained( model_path, load_in_4bit=True, # 4位量化 device_map="auto" ) ``` 2. **中文乱码** → 设置编码格式: ```python import locale locale.setlocale(locale.LC_ALL, 'zh_CN.utf8') ``` 3. **检索不相关** → 检查: - 文档分块是否合理 - 嵌入模型是否适配领域 - 相似度阈值设置(建议cosine>0.6) --- 如果需要更详细的配置方案(如Docker部署/集群扩展),可提供具体场景需求~
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

明月出天山_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值