探索LlamaIndex:如何用Django打造高效知识库检索

简介

LlamaIndex(前身为 GPT Index)是一个数据框架,为了帮助我们去建基于大型语言模型(LLM)的应用程序。

主要用于处理、构建和查询自定义知识库。

它支持多种数据源格式 exceltxtpdfmd 等等,并且以创建高效的数据结构以便快速检索著称,允许我们用自然地语言区查询数据,而不需要学习复杂的查询语言或了解底层数据结构。

下面我们来看看怎么在 django 中使用 LlamaIndex

安装django模块

shell 复制代码
pip install llama-index

一个简单的例子:

我们进入项目根目录,建立 data 文件夹,提前准备好我们需要检索的文件

如下面图所示:

这里的文件可以是 pdfdocexcel等,我这里准备了一个 txt 文件。

打开 tetsite/members/views.py 视图文件:

python 复制代码
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 :

python 复制代码
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-coreLlamaIndex 核心自定义包

让我们可以使用喜欢的 LLM 、嵌入和向量存储提供程序进行构建。

然而正在上面例子中,LlamaIndexVector-embeddings 默认指定的是 openaiLLM 进行 Vector-embeddings 嵌入,然后创建索引

python 复制代码
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)

持久化

文本被索引后,现在已经准备好进行查询了!

但是,嵌入所有文本可能非常耗时,如果您使用的是 openaiLLM,那么成本也会很高。

我们也可以使用下列方式存储索引数据持久保存到磁盘,如果不指定,便会存储在内存中:

python 复制代码
index.storage_context.persist(persist_dir="<persist_dir>")

然后,我们可以通过像这样加载持久索引来避免重新加载和重新索引数据:

python 复制代码
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 视图文件,新增一个方法视图:

python 复制代码
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})

记得运行之前更新一下 LlamaIndexChroma ,由于 llamaIndex 随时在更新,所以我们需要随时关注官网的动态,还有库的更新。

shell 复制代码
pip install -U llama-index chromadb

LlamaIndex本地模型

打开 tetsite/members/views.py 视图文件,新增一个方法视图:

python 复制代码
def llamaIndexSearch(request):

加载文档

python 复制代码
documents = SimpleDirectoryReader("data").load_data()

设置嵌入模型

python 复制代码
 embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2")

设置llm模型

python 复制代码
   llm = HuggingFaceLLM(
            model_name="gpt2",
            tokenizer_name="gpt2",
            device_map="cpu",
            generate_kwargs={"temperature": 0.7, "do_sample": False}
        )

创建服务上下文

python 复制代码
service_context = ServiceContext.from_defaults(
           llm=llm,
           embed_model=embed_model
       )

创建索引

python 复制代码
index = VectorStoreIndex.from_documents(
          documents,
          service_context=service_context
      )

创建查询引擎

python 复制代码
query_engine = index.as_query_engine()

执行查询

python 复制代码
response = query_engine.query("钥匙说了什么")

运行过程中我们会看到python会自动帮我们下载 sentence-transformers/all-MiniLM-L6-v2gpt2 模型

由于这是用的 HuggingFace的方式,所以模型会下载我们设置的 HF_HOME 目录。

所以我们可以提前配置这个目录,更好的管理模型。

python 复制代码
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 集成过程,还提供了高度的灵活性和可扩展性,使其能够适应各种不同的用例和需求。

相关推荐
网硕互联的小客服11 分钟前
Centos系统如何更改root账户用户名?需要注意什么?
linux·运维·服务器·数据库·安全
lisanmengmeng24 分钟前
zentao的prod环境升级(一)
linux·运维·数据库·docker·容器·禅道
それども30 分钟前
insertOnDuplicateKey 和 upsert 区别
数据库·mysql
nbsaas-boot35 分钟前
SQL Server 存储过程设计规范(事务与异常处理)
linux·数据库·设计规范
洵有兮37 分钟前
python第四次作业
开发语言·python
kkoral38 分钟前
单机docker部署的redis sentinel,使用python调用redis,报错
redis·python·docker·sentinel
BoBoZz191 小时前
IterativeClosestPoints icp配准矩阵
python·vtk·图形渲染·图形处理
test管家1 小时前
PyTorch动态图编程与自定义网络层实战教程
python
laocooon5238578861 小时前
python 收发信的功能。
开发语言·python
清水白石0082 小时前
《Python 责任链模式实战指南:从设计思想到工程落地》
开发语言·python·责任链模式