使用LlamaIndex在本地运行Mixtral 8x7

2023年12月25日 由 alex 发表 422 0

8


你可能已经听说过欧洲人工智能领头羊Mistral AI最新发布的产品——它被称为Mixtral 8x7b,是一个“专家混合”模型——由八个专家组成,每个都经过了70亿参数的训练,因此得名。最初他们通过一条震撼推文发布了这个产品,几天后他们又发布了一篇博文,展示了它在多个基准测试上与GPT-3.5以及更大型的Llama2 70b不相上下甚至超越。


所以这篇文章在这里帮助你开始使用一个完全本地的模型。


第1步:安装Ollama


以前,要安装并运行一个本地模型是一件非常麻烦的事情,但是随着Ollama的发布,这一切突然变得简单了!Ollama支持MacOS和Linux操作系统(而且不久后将支持Windows,尽管你今天就可以通过Windows的Linux子系统来使用它),它本身是开源的且免费下载的。


下载后,你可以通过单一命令获取Mixtral。


ollama run mixtral


你第一次运行这个命令时,它需要下载模型,这可能需要很长时间。还要注意,它需要高达48GB的RAM才能顺利运行!如果这对你的机器来说太多了,考虑使用它较小但仍非常强大的表亲Mistral 7b,安装和运行方式相同:


ollama run mistral


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


一旦模型开始运行,Ollama会自动允许你与它聊天。这很有趣,但如果模型不能处理你的数据,那有什么意义呢?这就是LlamaIndex登场的地方。接下来的几步将带你逐行阅读代码。


第2步:安装你的依赖


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


pip install llama-index qdrant_client torch transformers


第3步:冒烟测试


如果你已经成功运行了Ollama并且正确安装了LlamaIndex,以下这个简短的脚本将通过向其提出一个快速的“冒烟测试”问题来确保一切都正常运行,这个测试将在一个独立的脚本中执行:


# Just runs .complete to make sure the LLM is listening
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并将其传递到我们稍后将使用的存储上下文中,为动作准备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)


现在设置我们的服务上下文。我们将会传递Mixtral作为LLM,以便我们可以测试一旦完成索引之后事情是否正常工作;索引本身并不需要Mixtral。通过传递embed_model="local",我们指定LlamaIndex将会在本地嵌入你的数据,这就是为什么你需要torch和transformers的原因。


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


现在将一切整合起来:使用你已经设置好的服务和存储上下文从你加载的文档中构建索引,并对它进行查询:


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)


构建一个小型的网络服务


仅仅作为一个脚本运行的索引是不够的!让我们把这个东西做成一个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'
# This is just so you can easily tell the app is running
@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?"'


这就完成了!

文章来源:https://blog.llamaindex.ai/running-mixtral-8x7-locally-with-llamaindex-e6cebeabe0ab
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消