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

相关推荐
Flynt10 小时前
Room 3.0 包名重构 + KMP 迁移:我把项目升级踩了个遍
android·数据库·kotlin
这个DBA有点耶1 天前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
用户8356290780511 天前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780511 天前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
这个DBA有点耶1 天前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技1 天前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend1 天前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence1 天前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python