主题
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 的兼容模型,例如:
- Google 的 gemma-7b
- Mistal AI 的 mistral-7b-instruct-v0.2
- 以及更多!
安装
%pip install --upgrade --quiet llama-index-llms-nvidia llama-index-embeddings-nvidia llama-index-readers-file设置
开始使用:
在 NVIDIA 创建免费账户,该平台托管 NVIDIA AI Foundation 模型。
点击你选择的模型。
在 Input 下选择 Python 选项卡,然后点击
Get API Key。接着点击Generate Key。复制生成的密钥并保存为 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 对象列表——这是某些方法所期望的输入。
每个示例我们都遵循相同的基本模式:
- 将我们的
NVIDIALLM 指向所需模型 - 研究如何使用端点完成所需任务!
补全:.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_responselast_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))