📘 **TELUS Agriculture & Consumer Goods** 如何通过 **Haystack Agents** 转变促销交易
由 deepset 维护

集成:llamafile

使用 llamafile 在本地运行 LLM

作者
deepset

目录

概述

llamafile 是 Mozilla 的一个项目,旨在使开放式 LLM 对开发者和用户更加易于访问。

要本地运行 LLM,只需下载一个包含模型和推理引擎的单文件可执行文件(“llamafile”),即可在大多数计算机上本地运行。

llamafile 本身可以用于与这些模型进行聊天,但下面我们将看到如何将其与 Haystack 集成,以构建 LLM 应用程序。

下载并运行模型

生成模型

有多种模型可供选择。您可以在 llamafile 仓库 中找到一些,或在 Hugging Face Hub 中搜索它们。

例如,让我们看看如何下载 Mistral-7B-Instruct 模型并启动一个兼容 OpenAI 的服务器

wget https://hugging-face.cn/Mozilla/Mistral-7B-Instruct-v0.2-llamafile/resolve/main/mistral-7b-instruct-v0.2.Q4_0.llamafile

chmod +x mistral-7b-instruct-v0.2.Q4_0.llamafile

./mistral-7b-instruct-v0.2.Q4_0.llamafile --server --nobrowser

这将启动一个服务器,地址为 https://:8000,可用于与模型进行交互。

如果您遇到问题或需要有关 GPU 支持的信息,请参阅 llamafile 仓库

嵌入模型

也提供了一些嵌入模型。

例如,要下载并运行 mxbai-embed-large-v1 模型

wget https://hugging-face.cn/Mozilla/mxbai-embed-large-v1-llamafile/resolve/main/mxbai-embed-large-v1-f16.llamafile

chmod +x mxbai-embed-large-v1-f16.llamafile

./mxbai-embed-large-v1-f16.llamafile --server --nobrowser --embedding --port 8081

这将启动一个兼容 OpenAI 的服务器,地址为 https://:8081

与 Haystack 的用法

由于 llamafile 运行的是兼容 OpenAI 的服务器,您可以使用 Haystack 中与 OpenAI 模型交互的组件:OpenAITextEmbedderOpenAIDocumentEmbedderOpenAIGeneratorOpenAIChatGenerator

让我们从一个使用嵌入模型的索引管道开始。您应该已经按照上述说明运行了 mxbai-embed-large-v1 模型。

from haystack import Pipeline, Document
from haystack.utils import Secret
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.writers import DocumentWriter
from haystack.components.embedders import OpenAIDocumentEmbedder

document_store = InMemoryDocumentStore()

documents = [Document(content="The best food in the world is pizza"),
             Document(content="I saw a black horse running"),
             Document(content="The capital of Sweden is Stockholm"),]

indexing_pipeline = Pipeline()
indexing_pipeline.add_component("embedder",
                                OpenAIDocumentEmbedder(
                                    api_key=Secret.from_token("sk-no-key-required"),  # for compatibility with the OpenAI API
                                    model="LLaMA_CPP",
                                    api_base_url="https://:8081/v1")
                                )
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("embedder", "writer")

indexing_pipeline.run({"embedder": {"documents": documents}})

现在让我们构建一个RAG 管道,它同时使用嵌入模型和生成模型。您应该已经按照上述说明运行了 mxbai-embed-large-v1Mistral-7B-Instruct 模型。

from haystack import Pipeline, Document
from haystack.utils import Secret
from haystack.components.writers import DocumentWriter
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.components.embedders import OpenAITextEmbedder
from haystack.components.generators import OpenAIGenerator
from haystack.components.builders import PromptBuilder


prompt_template = """<s>[INST]
Given these documents, answer the question.
Documents:
{% for doc in documents %}
    {{ doc.content }}
{% endfor %}
Question: {{question}} [/INST]
Answer:
"""

rag_pipe = Pipeline()
rag_pipe.add_component("text_embedder", 
                        OpenAITextEmbedder(
                            api_key=Secret.from_token("sk-no-key-required"),  # for compatibility with the OpenAI API
                            model="LLaMA_CPP",
                            api_base_url="https://:8081/v1")
                        )
rag_pipe.add_component("retriever", InMemoryEmbeddingRetriever(document_store=document_store))
rag_pipe.add_component("prompt_builder", PromptBuilder(template=prompt_template))
rag_pipe.add_component("generator",
                        OpenAIGenerator(
                            api_key=Secret.from_token("sk-no-key-required"),  # for compatibility with the OpenAI API
                            model="LLaMA_CPP",
                            api_base_url="https://:8080/v1")
                        )

rag_pipe.connect("text_embedder.embedding", "retriever.query_embedding")
rag_pipe.connect("retriever.documents", "prompt_builder.documents")
rag_pipe.connect("prompt_builder", "generator")

query = "What is the best food in the world?"

result = rag_pipe.run({"text_embedder":{"text": query},
                       "prompt_builder": {"question": query}})

print(result["generator"]["replies"][0])

# According to the documents, the best food in the world is pizza.

为了获得有趣的用例,请探索此笔记本:使用 Character Codex 和 llamafile 进行测验和冒险