Skip to content
LlamaIndex 文档版本 跟随上游 源快照 822c8430 更新于 2026-10-18

llama-index-llms-nvidia 包包含 LlamaIndex 集成,用于由 NVIDIA AI Foundation Models 提供支持并托管在 NVIDIA API Catalog 上的聊天模型和嵌入。NVIDIA AI Foundation 模型是由社区和 NVIDIA 构建的模型,经过优化可在 NVIDIA 加速基础设施上提供最佳性能。你可以使用该 API 查询 NVIDIA API Catalog 上可用的实时端点,从 DGX 托管的云计算环境快速获得结果;也可以使用 NVIDIA NIM 从 NVIDIA 的 API 目录下载模型,NVIDIA NIM 随 NVIDIA AI Enterprise 许可证提供。在本地运行模型的能力使企业能够拥有其定制内容的所有权,并完全控制其 IP 和 AI 应用。

可以使用 NVIDIA AI Enterprise 许可证从 NVIDIA 的 API 目录导出 NIM,并在本地或云端运行,

NIM 按模型打包为容器镜像,并通过 NVIDIA NGC Catalog 以 NGC 容器镜像的形式分发。NIM 的核心是提供简单、一致且熟悉的 API,用于在 AI 模型上运行推理。

NVIDIA 的 LLM 连接器

本示例介绍如何使用 LlamaIndex 通过可公开访问的 AI Foundation 端点进行交互并开发由 LLM 驱动的系统。

借助此连接器,你可以连接并生成来自可用的托管 NVIDIA NIMs 的兼容模型,例如:

安装

%pip install --upgrade --quiet llama-index-llms-nvidia llama-index-embeddings-nvidia llama-index-readers-file

设置

开始使用:

  1. 在 NVIDIA 创建免费账户,该平台托管 NVIDIA AI Foundation 模型。

  2. 点击你选择的模型。

  3. 在 Input 下选择 Python 选项卡,然后点击 Get API Key。接着点击 Generate Key。

  4. 复制生成的密钥并保存为 NVIDIA_API_KEY。然后,你应该就可以访问这些端点了。

import getpass
import os

# del os.environ['NVIDIA_API_KEY']  ## delete key and reset
if os.environ.get("NVIDIA_API_KEY", "").startswith("nvapi-"):
    print("Valid NVIDIA_API_KEY already in environment. Delete to reset")
else:
    nvapi_key = getpass.getpass("NVAPI Key (starts with nvapi-): ")
    assert nvapi_key.startswith(
        "nvapi-"
    ), f"{nvapi_key[:5]}... is not a valid key"
    os.environ["NVIDIA_API_KEY"] = nvapi_key
# llama-parse is async-first, running the async code in a notebook requires the use of nest_asyncio
import nest_asyncio

nest_asyncio.apply()

使用 NVIDIA API Catalog

from llama_index.llms.nvidia import NVIDIA
from llama_index.core.llms import ChatMessage, MessageRole

llm = NVIDIA()

messages = [
    ChatMessage(
        role=MessageRole.SYSTEM, content=("You are a helpful assistant.")
    ),
    ChatMessage(
        role=MessageRole.USER,
        content=("What are the most popular house pets in North America?"),
    ),
]

llm.chat(messages)

使用 NVIDIA NIM

除了连接到托管的 NVIDIA NIMs,此连接器还可用于连接本地微服务实例。这有助于你在必要时将应用本地化。

有关如何设置本地微服务实例的说明,请参阅 https://developer.nvidia.com/blog/nvidia-nim-offers-optimized-inference-microservices-for-deploying-ai-models-at-scale/

from llama_index.llms.nvidia import NVIDIA

# connect to an chat NIM running at localhost:8080, spcecifying a specific model
llm = NVIDIA(
    base_url="http://localhost:8080/v1", model="meta/llama3-8b-instruct"
)

加载特定模型

现在,我们可以通过传入模型名称来加载 NVIDIA LLM,模型名称可在文档中找到——位于此处

注意:默认模型是 meta/llama3-8b-instruct。

# default model
llm = NVIDIA()
llm.model

我们可以通过 .model 属性查看当前 llm 对象关联的模型。

llm = NVIDIA(model="mistralai/mistral-7b-instruct-v0.2")
llm.model

基本功能

现在,我们可以探索在 LlamaIndex 生态系统中使用该连接器的不同方式!

在开始之前,让我们设置一个 ChatMessage 对象列表——这是某些方法所期望的输入。

每个示例我们都遵循相同的基本模式:

  1. 将我们的 NVIDIA LLM 指向所需模型
  2. 研究如何使用端点完成所需任务!

补全:.complete()

我们可以使用 .complete()/.acomplete()(接受字符串)来提示所选模型给出响应。

让我们使用默认模型来完成此任务。

completion_llm = NVIDIA()

我们可以通过检查 .model 属性来验证这是预期的默认模型。

completion_llm.model

让我们用字符串(本例中为 "Hello!")对模型调用 .complete(),并观察响应。

completion_llm.complete("Hello!")

正如 LlamaIndex 所预期的那样,我们得到了一个 CompletionResponse 响应。

异步补全:.acomplete()

也有异步实现,可以用同样的方式使用!

await completion_llm.acomplete("Hello!")

聊天:.chat()

现在我们可以使用 .chat() 方法尝试同样的事情。此方法期望一个聊天消息列表——因此我们将使用上面创建的那个列表。

本示例我们将使用 mistralai/mixtral-8x7b-instruct-v0.1 模型。

chat_llm = NVIDIA(model="mistralai/mixtral-8x7b-instruct-v0.1")

现在我们需要做的就是对 ChatMessages 列表调用 .chat() 并观察响应。

你还会注意到,我们可以传入一些额外的关键字参数来影响生成——在本例中,我们使用 seed 参数影响生成,使用 stop 参数表示希望模型在到达某个 token 时停止生成!

注意:你可以参考所选模型的 API 文档,了解其端点支持哪些额外 kwargs。以 Mixtral 为例,其文档位于此处!

chat_llm.chat(messages, seed=4, stop=["cat", "cats", "Cat", "Cats"])

正如预期,我们收到了一个 ChatResponse 响应。

异步聊天:(achat)

我们还有 .chat() 方法的异步实现,可以通过以下方式调用。

await chat_llm.achat(messages)

流式输出:.stream_chat()

我们还可以将 build.nvidia.com 上的模型用于流式输出用例!

让我们选择另一个模型并观察其行为。本任务我们将使用 Google 的 gemma-7b 模型。

stream_llm = NVIDIA(model="google/gemma-7b")

让我们用 .stream_chat() 调用模型,它同样期望一个 ChatMessage 对象列表,并捕获响应。

streamed_response = stream_llm.stream_chat(messages)
streamed_response

如我们所见,响应是一个包含流式输出的生成器。

让我们看看生成完成后的最终响应。

last_element = None
for last_element in streamed_response:
    pass

print(last_element)

异步流式输出:.astream_chat()

我们也有用于流式输出的等效异步方法,其用法与同步实现类似。

streamed_response = await stream_llm.astream_chat(messages)
streamed_response
last_element = None
async for last_element in streamed_response:
    pass

print(last_element)

流式输出查询引擎响应

让我们看一个稍复杂的使用查询引擎的示例!

我们首先加载一些数据(我们将使用《银河系漫游指南》)。

加载数据

首先,让我们创建一个存放数据的目录。

!mkdir -p 'data/hhgttg'

我们将从上述来源下载数据。

!wget 'https://web.eecs.utk.edu/~hqi/deeplearning/project/hhgttg.txt' -O 'data/hhgttg/hhgttg.txt'

此步骤需要一个嵌入模型!我们将使用 NVIDIA NV-Embed-QA 模型来实现,并将其保存在 Settings 中。

from llama_index.embeddings.nvidia import NVIDIAEmbedding
from llama_index.core import Settings

embedder = NVIDIAEmbedding(model="NV-Embed-QA", truncate="END")
Settings.embed_model = embedder

现在我们可以加载文档,并利用上述内容创建索引

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data/hhgttg").load_data()
index = VectorStoreIndex.from_documents(documents)

现在我们可以创建一个简单的查询引擎,并将 streaming 参数设置为 True。

streaming_qe = index.as_query_engine(streaming=True)

让我们向查询引擎发送查询,然后流式输出响应。

streaming_response = streaming_qe.query(
    "What is the significance of the number 42?",
)
streaming_response.print_response_stream()

工具调用

从 v0.2.1 开始,NVIDIA 支持工具调用。

NVIDIA 提供与 build.nvidia.com 上各种模型以及本地 NIM 的集成。并非所有这些模型都经过工具调用训练。请务必为你的实验和应用选择支持工具调用的模型。

你可以通过以下方式获取已知支持工具调用的模型列表,

注意: 更多示例请参阅:nvidia_agent.ipynb

tool_models = [
    model
    for model in NVIDIA().available_models
    if model.is_function_calling_model
]

使用支持工具的模型时,

from llama_index.core.tools import FunctionTool

def multiply(a: int, b: int) -> int:
    """Multiple two integers and returns the result integer"""
    return a * b

multiply_tool = FunctionTool.from_defaults(fn=multiply)

def add(a: int, b: int) -> int:
    """Add two integers and returns the result integer"""
    return a + b

add_tool = FunctionTool.from_defaults(fn=add)

llm = NVIDIA("meta/llama-3.1-70b-instruct")
from llama_index.core.agent import FunctionAgent

agent_worker = FunctionAgent(
    tools=[multiply_tool, add_tool],
    llm=llm,
)

response = await agent.run("What is (121 * 3) + 42?")
print(str(response))

BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。