跳到正文
北京时间
原文
LlamaIndex:产品、工程与评测·· 2023-12-21精选AI 评分71

LlamaIndex 教程:用 Ollama 本地运行 Mixtral 8x7b 并构建 RAG 应用

Running Mixtral 8x7 locally with LlamaIndex and Ollama

AI 导读

LlamaIndex 发布教程,讲解如何用 Ollama 在本地运行 Mixtral 8x7b 并结合 LlamaIndex 使用。Mixtral 是 Mistral AI 发布的八专家混合模型,各含 7B 参数,博客称其在多项基准上匹敌或超过 GPT-3.5 和 Llama2 70b。

推荐理由

原文提供从安装到建 API 的完整本地 Mixtral 流程,含代码和硬件要求,读者可以直接照做搭建本地 RAG。

正文 · AI 翻译

你可能已经听说了欧洲 AI 巨头 Mistral AI 最新发布的产品引发的热议:它叫 Mixtral 8x7b,是一个“专家混合”模型——由八个专家组成,每个专家都用 70 亿参数训练,因此得名。最初以一条重磅推文发布,几天后他们又发布了一篇博客文章,展示了它在多项基准测试中达到或超过 GPT-3.5 以及规模大得多的 Llama2 70b。

立即探索我们的免费和付费方案。

在 LlamaIndex,我们天生就是开源软件的粉丝,所以像 Mixtral 这样采用宽松许可证的开放模型正合我们心意。我们收到了一些关于如何让 Mixtral 与 LlamaIndex 配合使用的问题,所以这篇文章将帮助你用完全本地的模型快速上手。

第 1 步:安装 Ollama

以前安装并运行本地模型非常痛苦,但随着 Ollama 的发布,这件事突然变得轻而易举!它适用于 MacOS 和 Linux(很快也会支持 Windows,不过你现在就可以通过 Windows Subsystem For Linux 在 Windows 上使用它),它本身是开源的,并且可以免费下载。

下载完成后,只需一条命令即可获取 Mixtral:

ollama run mixtral

第一次运行此命令时,它需要下载模型,这可能需要很长时间,所以先去吃点零食吧。另请注意,要流畅运行它需要高达 48GB 的内存!如果你的机器达不到这个要求,可以考虑使用它更小但仍然非常能干的表亲 Mistral 7b,安装和运行方式相同:

ollama run mistral

在本教程的剩余部分,我们假设你使用的是 Mixtral,但 Mistral 也可以。

模型运行后,Ollama 会自动让你与它聊天。这很有趣,但如果模型不能处理你的数据,那又有什么意义呢?这就是 LlamaIndex 的用武之地。接下来的几步将逐行带你了解代码,但如果你不想复制粘贴,所有这些代码都可以在一个开源仓库中找到,你可以克隆下来跟着操作。

第 2 步:安装依赖项

显然,你需要安装 LlamaIndex!我们还会安装一些其他即将派上用场的依赖项:

pip install llama-index qdrant_client torch transformers

第 3 步:冒烟测试

如果你已经运行了 Ollama 并正确安装了 LlamaIndex,下面的快速脚本将通过在一个独立脚本中询问一个快速的“冒烟测试”问题来确保一切正常:


from llama_index.llms import Ollama

llm = Ollama(model="mixtral")
response = llm.complete("Who is Laurie Voss?")
print(response)

第 4 步:加载一些数据并建立索引

现在你可以加载一些真实数据了!你可以使用任何你想要的数据;在这个例子中,我使用的是我自己推文的一个小集合,你可以下载,或者使用你自己的!我们将把数据存储在一个精巧的开源 Qdrant 向量数据库中(这就是我们之前让你安装它的原因)。创建一个新的 Python 文件,并加载我们所有的依赖项:

from pathlib import Path
import qdrant_client
from llama_index import (
    VectorStoreIndex,
    ServiceContext,
    download_loader,
)
from llama_index.llms import Ollama
from llama_index.storage.storage_context import StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore

然后使用来自 LlamaHub 的精巧 JSONReader 从我们的 JSON 文件中加载推文,LlamaHub 是我们方便的开源数据连接器集合。这将为你提供一堆准备好被嵌入和索引的文档:

JSONReader = download_loader("JSONReader")
loader = JSONReader()
documents = loader.load_data(Path('./data/tinytweets.json'))

通过初始化 Qdrant 并将其传入我们稍后将使用的 Storage Context,让 Qdrant 准备好投入使用:

client = qdrant_client.QdrantClient(
    path="./qdrant_data"
)
vector_store = QdrantVectorStore(client=client, collection_name="tweets")
storage_context = StorageContext.from_defaults(vector_store=vector_store)

现在设置我们的 Service Context。我们将把 Mixtral 作为 LLM 传递给它,这样在完成索引后我们可以测试一切是否正常;索引本身不需要 Mixtral。通过传递 embed_model="local",我们指定 LlamaIndex 将在本地嵌入你的数据,这就是为什么你需要 torch 和 transformers。

llm = Ollama(model="mixtral")
service_context = ServiceContext.from_defaults(llm=llm,embed_model="local")

现在把所有内容整合起来:使用你已经设置好的 service 和 storage 上下文,从加载的文档构建索引,并给它一个查询:

index = VectorStoreIndex.from_documents(documents,service_context=service_context,storage_context=storage_context)

query_engine = index.as_query_engine()
response = query_engine.query("What does the author think about Star Trek? Give details.")
print(response)

Ollama 需要启动 Mixtral 来回答查询,这可能需要一点时间,所以请耐心等待!你应该会得到类似这样的输出(但包含更多细节):

Based on the provided context information, the author has a mixed opinion about Star Trek.

验证我们的索引

现在为了证明这不是烟雾和镜子,让我们使用预先构建的索引。新建一个 Python 文件并再次加载依赖项:

import qdrant_client
from llama_index import (
    VectorStoreIndex,
    ServiceContext,
)
from llama_index.llms import Ollama
from llama_index.vector_stores.qdrant import QdrantVectorStore

这次我们不需要加载数据,那已经完成了!我们需要 Qdrant 客户端,当然还需要 Mixtral:

client = qdrant_client.QdrantClient(
    path="./qdrant_data"
)
vector_store = QdrantVectorStore(client=client, collection_name="tweets")

llm = Ollama(model="mixtral")
service_context = ServiceContext.from_defaults(llm=llm,embed_model="local")

这次不是从加载的文档创建索引,而是使用 from_vector_store 直接从向量存储中加载它。我们还向查询引擎传递了 similarity_top_k=20;这意味着它将一次获取 20 条推文(默认是 2 条),以获得更多上下文并更好地回答问题。

index = VectorStoreIndex.from_vector_store(vector_store=vector_store,service_context=service_context)
query_engine = index.as_query_engine(similarity_top_k=20)
response = query_engine.query("Does the author like SQL? Give details.")
print(response)

构建一个小型 Web 服务

只有一个作为脚本运行的索引可不行!让我们把它做成一个 API。我们需要两个新的依赖项:

pip install flask flask-cors

像之前一样将依赖项加载到一个新文件中:

from flask import Flask, request, jsonify
from flask_cors import CORS, cross_origin
import qdrant_client
from llama_index.llms import Ollama
from llama_index import (
    VectorStoreIndex,
    ServiceContext,
)
from llama_index.vector_stores.qdrant import QdrantVectorStore

获取向量存储、LLM 和索引并加载:

# re-initialize the vector store
client = qdrant_client.QdrantClient(
    path="./qdrant_data"
)
vector_store = QdrantVectorStore(client=client, collection_name="tweets")

# get the LLM again
llm = Ollama(model="mixtral")
service_context = ServiceContext.from_defaults(llm=llm,embed_model="local")
# load the index from the vector store
index = VectorStoreIndex.from_vector_store(vector_store=vector_store,service_context=service_context)

设置一个非常基础的 Flask 服务器:

app = Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'


@app.route('/')
def hello_world():
    return 'Hello, World!'

并添加一个接受查询(作为表单数据)、查询 LLM 并返回响应的路由:

@app.route('/process_form', methods=['POST'])
@cross_origin()
def process_form():
    query = request.form.get('query')
    if query is not None:
        query_engine = index.as_query_engine(similarity_top_k=20)
        response = query_engine.query(query)
        return jsonify({"response": str(response)})
    else:
        return jsonify({"error": "query field is missing"}), 400

if __name__ == '__main__':
    app.run()

注意最后两行,它们很重要!flask run 与 LlamaIndex 加载依赖项的方式不兼容,因此你需要像这样直接运行此 API(假设你的文件名为 app.py)

python app.py

API 启动并运行后,你可以使用 cURL 发送请求并验证它:

curl --location '<http://127.0.0.1:5000/process_form>' \\
--form 'query="What does the author think about Star Trek?"'

你完成了!

我们在这里涵盖了几件事:

  • 让 Ollama 在本地运行 Mixtral
  • 使用 LlamaIndex 查询 Mixtral 8x7b
  • 使用 Qdrant 向量存储构建并查询数据索引
  • 将你的索引包装成一个非常简单的 Web API
  • 全部开源、免费,并在本地运行!

我希望这是一个有趣、快速的 LlamaIndex 本地模型入门介绍!

来源:LlamaIndex:产品、工程与评测 · llamaindex.ai