RAG应用的增强,是指通过检索来获得上下文知识,并将其输入大模型用于输入。因此数据经过加载与分割后,已经形成了大量的知识块(Node),那么下一步就是对Node构造索引,以便能够闪电式速度检索出他们。
向量存储索引是RAG应用中最常看到的一类索引。这类索引通常基于Embedding模型与向量存储而构造。用于在生成阶段快速检索出相关知识Node并形成增强的上下文。
向量存储索引并非唯一的最佳索引形式,尽管向量在语义检索上有天然的优势,但是在一些场景中会表现欠佳。有机会的话我们也讲讲除了向量存储索引意外的一些常用索引形式及用法。
import os
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# ---------------------
# step 1.设定key、模型url、推理模型名称以及embedding模型名称
# ---------------------
BASE_IP = "http://localhost:11434"
BASE_URL = BASE_IP+"/api/chat"
MODEL_NAME = "deepseek-r1"
# ---------------------
# step 2.设置本地embedding模型与本地大模型
# ---------------------
from llama_index.embeddings.ollama import OllamaEmbedding
embedding = OllamaEmbedding(base_url=BASE_IP, model_name=MODEL_NAME)
from llama_index.llms.ollama import Ollama
llm = Ollama(base_url=BASE_IP, model=MODEL_NAME)
# ---------------------
# step 3.使用SimpleDirectoryReader函数完成数据加载
# ---------------------
documents = SimpleDirectoryReader(input_files=['./docs/越女剑.txt',
'./docs/连城诀.txt',
'./docs/书剑恩仇录.txt',
'./docs/侠客行.txt',
'./docs/倚天屠龙记.txt',
'./docs/天龙八部.txt',
'./docs/射雕英雄传.txt',
'./docs/碧血剑.txt',
'./docs/雪山飞狐.txt',
'./docs/鸳鸯刀.txt',
'./docs/鹿鼎记.txt',
'./docs/神雕侠侣.txt',
'./docs/笑傲江湖.txt',]).load_data()
print('数据加载完毕')
# ---------------------
# step 4.构造向量存储索引
# ---------------------
index = VectorStoreIndex.from_documents(documents,embed_model=embedding,show_progress= True)
print('构造索引完毕')
# 4.1 查看index下面的所有文档
print(index.docstore.docs)
# 4.2 查看index下面的所有node的id
print(index.index_struct.nodes_dict)
# 4.3 查看index下面所有有ref的文档的信息
print(index.ref_doc_info)
# 4.4 查看任意给定id的node详细信息
# index.docstore.get_node('51595901-ebe3-48b5-b57b-dc8794ef4556')
# 删除一个节点,删除这个操作尽量不要尝试,可能会导致后面的代码运行出错。
测试结果:
输出太长了,不便展示