简介
LlamaIndex
(前身为 GPT Index
)是一个数据框架,为了帮助我们去建基于大型语言模型(LLM
)的应用程序。
主要用于处理、构建和查询自定义知识库。
它支持多种数据源格式 excel
,txt
,pdf
,md
等等,并且以创建高效的数据结构以便快速检索著称,允许我们用自然地语言区查询数据,而不需要学习复杂的查询语言或了解底层数据结构。
下面我们来看看怎么在 django
中使用 LlamaIndex
。
安装django模块
pip install llama-index
一个简单的例子:
我们进入项目根目录,建立 data
文件夹,提前准备好我们需要检索的文件
如下面图所示:
这里的文件可以是 pdf
,doc
,excel
等,我这里准备了一个 txt
文件。
打开 tetsite/members/views.py
视图文件:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
def llamaIndexOpenAiSearch(request):documents = SimpleDirectoryReader("data").load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()response = query_engine.query("钥匙说了什么")return JsonResponse({'response': response})
进入路由文件 testsite/members/urls.py
:
path('llama-index-open-ai-search/', views.llamaIndexOpenAiSearch, name='search'),
打开我们的api
工具,或者浏览器
访问 http://127.0.0.1:8080/polls/llama-index-open-ai-search
对比一下我们的测试集txt,是不是检索答案就出来了,这个demo
是一个很简单LlamaIndex
入门例子。
我们上面引用的是 llama-index-core
是 LlamaIndex
核心自定义包
让我们可以使用喜欢的 LLM
、嵌入和向量存储提供程序进行构建。
然而正在上面例子中,LlamaIndex
的 Vector-embeddings
默认指定的是 openai
的 LLM
进行 Vector-embeddings
嵌入,然后创建索引
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)
持久化
文本被索引后,现在已经准备好进行查询了!
但是,嵌入所有文本可能非常耗时,如果您使用的是 openai
的 LLM
,那么成本也会很高。
我们也可以使用下列方式存储索引数据持久保存到磁盘,如果不指定,便会存储在内存中:
index.storage_context.persist(persist_dir="<persist_dir>")
然后,我们可以通过像这样加载持久索引来避免重新加载和重新索引数据:
from llama_index.core import StorageContext, load_index_from_storage
# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="<persist_dir>")
# load index
index = load_index_from_storage(storage_context)
假如我们想存储到向量数据库中,怎么做呢。
打开 tetsite/members/views.py
视图文件,新增一个方法视图:
import chromadb
from llama_index.core import VectorStoreIndex
from llama_index.core import StorageContext
def searchIndexVectory():db = chromadb.PersistentClient(path="./chroma_db")chroma_collection = db.get_or_create_collection("quickstart")storage_context = StorageContext.from_defaults(vector_store=chroma_collection)documents = SimpleDirectoryReader("data").load_data()index = VectorStoreIndex.from_vector_store(documents, storage_context=storage_context)query_engine = index.as_query_engine()response = query_engine.query("人形机器人的发展点在哪里?")return JsonResponse({'response': response})
记得运行之前更新一下 LlamaIndex
和 Chroma
,由于 llamaIndex
随时在更新,所以我们需要随时关注官网的动态,还有库的更新。
pip install -U llama-index chromadb
LlamaIndex本地模型
打开 tetsite/members/views.py
视图文件,新增一个方法视图:
def llamaIndexSearch(request):
加载文档
documents = SimpleDirectoryReader("data").load_data()
设置嵌入模型
embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2")
设置llm模型
llm = HuggingFaceLLM(model_name="gpt2",tokenizer_name="gpt2",device_map="cpu",generate_kwargs={"temperature": 0.7, "do_sample": False})
创建服务上下文
service_context = ServiceContext.from_defaults(llm=llm,embed_model=embed_model)
创建索引
index = VectorStoreIndex.from_documents(documents,service_context=service_context)
创建查询引擎
query_engine = index.as_query_engine()
执行查询
response = query_engine.query("钥匙说了什么")
运行过程中我们会看到python会自动帮我们下载 sentence-transformers/all-MiniLM-L6-v2
和 gpt2
模型
由于这是用的 HuggingFace
的方式,所以模型会下载我们设置的 HF_HOME
目录。
所以我们可以提前配置这个目录,更好的管理模型。
import os
os.environ['HF_HOME'] = '/path/to/new/cache/directory'
浏览器或接口访问 http://127.0.0.1:8080/polls/llama-index-search
,可以得到下面结果。
这里需要提一下,因为是本地模型,准确率取决于你选择的模型,还有硬件,所以一定要根据自己的事迹情况来选择
后面我会详细讲一下,每一种模型大概需要的硬件配置,和生成对应的效果,效率。
总结
LlamaIndex
确实是一个非常强大的工具,特别是在处理和检索大规模文本数据方面。
它还支持自定义数据加载器,以适应特殊的数据格式。支持数据分块和压缩,优化存储和检索效率。
里面的代码也可以看出它和可以与 Langchain
无缝集成,也解决了 Langchian
检索的问题,可以说 LlamaIndex
就是为检索而准备的工具。
LlamaIndex
的出现就成为构建智能文档检索、问答系统、知识管理平台等应用的强大工具。
它不仅简化了复杂的数据处理和 AI 集成过程,还提供了高度的灵活性和可扩展性,使其能够适应各种不同的用例和需求。