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

托管还是自托管 RAG?通过 Haystack 集成 NVIDIA NIM 实现完全灵活性

设计选项的迭代速度很重要

检索增强生成(RAG)是当今构建 LLM 应用程序最常见的架构之一。通过 RAG,您可以通过将 LLM 连接到相关数据源,快速构建一个针对您用例定制的原型。

一旦您的第一个原型运行起来,您通常会在上线生产之前对管道设计进行大量迭代:切换嵌入模型或生成式 LLM,添加重排序器,或利用文档的元数据。

在确定满足用户需求的设计之前,我们经常看到用户进行五十次甚至更多的迭代。除了优化答案质量外,用户通常还有其他要求,如成本、延迟或数据隐私,这些都决定了他们的目标架构和上线生产的部署策略。

在 RAG 开发过程中,快速原型设计需要两个关键功能:实验许多不同模型和功能的能力,以及快速切换它们的能力。

这两点都是我们 Haystack 2.0 设计的核心。与 NVIDIA AI Enterprise 软件平台中的微服务(包括 NVIDIA NIM 和 NeMo Retriever)的新集成,现在可以让您在 RAG 开发周期中更快地进行迭代,并为您提供完整的部署选项灵活性:- 访问 NVIDIA API Catalog,快速尝试 NVIDIA 托管 API 端点上最新的 GPU 加速生成式 AI 模型。然后可以轻松切换到自托管的 NVIDIA NIM 微服务容器,这些容器可以在您自己的 VPC 或自托管云中运行。在此 NVIDIA 博客中了解有关将 RAG 应用从试点带入生产的更多信息

什么是 NVIDIA NIM?

NVIDIA NIM 是一套易于使用的微服务,旨在加速企业中的生成式 AI 部署。NIM 支持广泛的领先社区和专有 AI 模型,托管在 NVIDIA API 目录上,无论是在本地还是在云端,NIM 都能确保无缝、可扩展的 AI 推理,并利用行业标准 API。

要开始使用,开发人员可以访问 NVIDIA API 目录,直接从 Web 浏览器与 GPU 加速的生成式 AI 模型进行交互。API 目录界面为每次交互生成应用程序代码。开发人员可以将此代码粘贴到自己的应用程序中以编程方式与模型端点进行交互。准备好部署时,NVIDIA AI Enterprise 订阅者可以将模型导出到可下载的 NVIDIA NIM 容器并在任何地方运行。这使开发人员能够拥有自己的自定义,并完全控制其 IP 和 AI 应用程序。

在 Haystack 中使用 NVIDIA AI

现在,我们将逐步介绍使用 Haystack 和托管 NVIDIA API 构建 RAG 管道的详细信息。您将构建两个 Haystack 管道:一个用于创建和存储文档的索引管道,以及一个用于查询这些文档的 RAG 管道。

为了使此代码正常工作,您需要一个 NVIDIA API 密钥。将其设置为环境变量 NVIDIA_API_KEY

第一步:安装 Haystack NVIDIA 连接器

pip install nvidia-haystack

接下来,构建一个索引管道。此示例使用 NVIDIA 的其中一个嵌入模型将文档转换为向量,并将其添加到 document_store

from haystack_integrations.components.generators.nvidia import NvidiaGenerator
from haystack_integrations.components.embedders.nvidia import NvidiaEmbeddingModel, NvidiaDocumentEmbedder

from haystack import Pipeline
from haystack.dataclasses import Document
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore

documents = [
    Document(content="My name is Jean and I live in Paris."),
    Document(content="My name is Mark and I live in Berlin."),
    Document(content="My name is Giorgio and I live in Rome.")]

document_store = InMemoryDocumentStore()

document_embedder = NvidiaDocumentEmbedder(model="nvolveqa_40k")
writer = DocumentWriter(document_store=document_store)

indexing_pipeline = Pipeline()
indexing_pipeline.add_component(instance=document_embedder, name="document_embedder")
indexing_pipeline.add_component(instance=writer, name="writer")

indexing_pipeline.connect("document_embedder.documents", "writer.documents")
indexing_pipeline.run(data={"document_embedder":{"documents": documents}})

# Calling filter with no arguments will print the contents of the document store
document_store.filter_documents({})

创建一个 RAG 管道来查询数据。

from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.components.builders import PromptBuilder
from haystack_integrations.components.generators.nvidia import NvidiaGenerator
from haystack_integrations.components.embedders.nvidia import NvidiaEmbeddingModel, NvidiaTextEmbedder

prompt = """ Answer the query, based on the
content in the documents.
If you can't answer based on the given documents, say so.


Documents:
{% for doc in documents %}
 {{doc.content}}
{% endfor %}


Query: {{query}}
"""

text_embedder = NvidiaTextEmbedder(model="playground_nvolveqa_40k")
retriever = InMemoryEmbeddingRetriever(document_store=document_store)
prompt_builder = PromptBuilder(template=prompt)
generator = NvidiaGenerator(model="playground_nv_llama2_rlhf_70b")

rag_pipeline = Pipeline()

rag_pipeline.add_component(instance=text_embedder, name="text_embedder")
rag_pipeline.add_component(instance=retriever, name="retriever")
rag_pipeline.add_component(instance=prompt_builder, name="prompt_builder")
rag_pipeline.add_component(instance=generator, name="generator")

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

question = "Who lives in Rome?"
result = rag_pipeline.run(data={"text_embedder":{"text": question},
                           	                                      "prompt_builder":{"query": question}})
print(result)
# {'text_embedder': {'meta': {'usage': {'prompt_tokens': 10, 'total_tokens': 10}}}, 'generator': {'replies': [Giorgio], 'meta': [{'role': 'assistant', 'finish_reason': 'stop'}], 'usage': {'completion_tokens': 3, 'prompt_tokens': 101, 'total_tokens': 104}}}

上面的管道示例使用 LLM 推理和嵌入的 API 目录端点。从 API 目录端点切换到自托管的 NIM 微服务,只需要在 embedder 和 generator 中添加一个 api_url 初始化参数即可。

document_embedder = NvidiaDocumentEmbedder(model="nvolveqa_40k", api_url="<container_endpoint_url>")

text_embedder = NvidiaTextEmbedder(model="nvolveqa_40k", api_url="<container_endpoint_url>")

generator = NvidiaGenerator(model="mixtral_8x7b", api_url="<container_endpoint_url>")


generator.warm_up()

result = generator.run(prompt="When was the Golden Gate Bridge built?")
# The Golden Gate Bridge was built in 1937 and was completed and opened to the public on May 28, 1937... 

通过使用 NVIDIA Haystack 连接器,Deepset 客户可以快速轻松地将 GPU 加速的优势应用于他们的 RAG 应用程序。

总结