LlamaIndex 教程:用 Ollama 本地运行 Mixtral 8x7b 并构建 RAG 应用
Running Mixtral 8x7 locally with LlamaIndex and Ollama
LlamaIndex 发布教程,讲解如何用 Ollama 在本地运行 Mixtral 8x7b 并结合 LlamaIndex 使用。Mixtral 是 Mistral AI 发布的八专家混合模型,各含 7B 参数,博客称其在多项基准上匹敌或超过 GPT-3.5 和 Llama2 70b。
原文提供从安装到建 API 的完整本地 Mixtral 流程,含代码和硬件要求,读者可以直接照做搭建本地 RAG。
你可能已经听说了欧洲 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.pyAPI 启动并运行后,你可以使用 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