RAG实战 llama-index+ollama 本地环境构建rag
1.环境搭建
1.1llama-index环境
pip install llama-index
#ollama chroma 使用到的包
pip install llama-index-llms-ollama
pip install llama-index-embeddings-ollama
pip install llama_index-vector_stores-chroma
1.2 ollama环境
git clone https://www.modelscope.cn/modelscope/ollama-linux.git
cd ollama-linux
sudo chmod 777 ./ollama-modelscope-install.sh
./ollama-modelscope-install.sh
1.3 ollama启动
ollama serve
2.模型下载(ollama)
2.1embedding模型下载
ollama pull yxl/m3e
2.2 llm模型下载
本次测试选用qwen2.5-7b模型
ollama pull qwen2.5:7b
2.3 模型查看
ollama list
2.4 自己微调模型使用
本次篇暂不详细说明,可以参考
ollama实战(二): gguf 格式部署及转换方式(llamacpp)_imtoken下载新版本-CSDN博客
3.向量数据库下载
开源向量存储 Chroma
pip install chromadb
4.构建RAG
自己修改的地方:
模型路径
文档读取路径
4.1构建数据向量库
import chromadb
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, get_response_synthesizer, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core.node_parser import SentenceSplitter
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
# 设置嵌入模型和语言模型
Settings.embed_model = OllamaEmbedding(model_name="yxl/m3e:latest")
Settings.llm = Ollama(model="qwen2.5:7b", request_timeout=360)
# 读取文档
documents = SimpleDirectoryReader("docs").load_data()
# 初始化 Chroma 客户端,指定数据存储路径为当前目录下的 chroma_db 文件夹
db = chromadb.PersistentClient(path="./chroma_db")
# 获取或创建名为 "quickstart" 的集合,如果该集合不存在,则创建它
chroma_collection = db.get_or_create_collection("quickstart")
# 使用上述集合创建一个 ChromaVectorStore 实例,以便 llama_index 可以与 Chroma 集合进行交互
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
# 创建一个存储上下文,指定向量存储为刚刚创建的 ChromaVectorStore 实例
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 构建索引
index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context, transformations=[SentenceSplitter(chunk_size=256)]
)
注:对同一个集合再次需要embedding时,对新的内容新的文件夹直接添加即可,无需再次对旧文件embedding
测试:对26M pdf文件embedding大概花费时间十分钟左右
4.2 自定义查询
import chromadb
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, get_response_synthesizer, Settings
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
# 设置嵌入模型和语言模型
Settings.embed_model = OllamaEmbedding(model_name="yxl/m3e:latest") # 使用指定的嵌入模型
Settings.llm = Ollama(model="qwen2.5:7b", request_timeout=360) # 使用指定的语言模型
# 初始化 Chroma 客户端,指定数据存储路径为当前目录下的 chroma_db 文件夹
db = chromadb.PersistentClient(path="./chroma_db")
# 获取或创建名为 "quickstart" 的集合,如果该集合不存在,则创建它
chroma_collection = db.get_or_create_collection("quickstart")
# 使用上述集合创建一个 ChromaVectorStore 实例,以便 llama_index 可以与 Chroma 集合进行交互
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
# 创建一个存储上下文,指定向量存储为刚刚创建的 ChromaVectorStore 实例
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 从存储的向量中加载索引
index = VectorStoreIndex.from_vector_store(
vector_store, storage_context=storage_context
)
# 配置检索器
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=5, # 返回最相似的前 n 个文档片段
)
# 配置响应合成器
response_synthesizer = get_response_synthesizer()
# 组装查询引擎
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
# 执行查询
response = query_engine.query("分析借款合同中关于利息的规定,特别是当利息预先在本金中扣除时的处理方式,指明是第几条民法典规定")
print(response) # 输出查询结果