集成:llamafile
使用 llamafile 在本地运行 LLM
目录
概述
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 模型交互的组件:OpenAITextEmbedder、OpenAIDocumentEmbedder、OpenAIGenerator 和 OpenAIChatGenerator。
让我们从一个使用嵌入模型的索引管道开始。您应该已经按照上述说明运行了 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-v1 和 Mistral-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 进行测验和冒险。
