跳到主要内容

ChatNVIDIA

这将帮助您开始使用 NVIDIA 聊天模型。有关所有 ChatNVIDIA 功能和配置的详细文档,请访问API 参考

概述

langchain-nvidia-ai-endpoints 包包含 LangChain 集成,用于构建使用 NVIDIA NIM 推理微服务上的模型的应用程序。NIM 支持来自社区以及 NVIDIA 的跨域模型,如聊天、嵌入和重排序模型。这些模型经过 NVIDIA 优化,可在 NVIDIA 加速基础设施上提供最佳性能,并部署为 NIM,这是一个易于使用、预构建的容器,可使用 NVIDIA 加速基础设施上的单个命令部署到任何地方。

NIM 的 NVIDIA 托管部署可在 NVIDIA API 目录上进行测试。测试后,可以使用 NVIDIA AI Enterprise 许可证从 NVIDIA 的 API 目录中导出 NIM,并在本地或云端运行,从而使企业拥有对其知识产权和 AI 应用程序的所有权和完全控制权。

NIM 以每个模型为基础打包为容器镜像,并通过 NVIDIA NGC 目录作为 NGC 容器镜像分发。NIM 的核心是为在 AI 模型上运行推理提供简单、一致和熟悉的 API。

本示例介绍了如何使用 LangChain 通过 ChatNVIDIA 类与 NVIDIA 支持的 API 进行交互。

有关通过此 API 访问聊天模型的更多信息,请查看 ChatNVIDIA 文档。

集成详情

本地可序列化JS 支持包下载包最新版本
ChatNVIDIAlangchain_nvidia_ai_endpointsbetaPyPI - DownloadsPyPI - Version

模型功能

工具调用结构化输出JSON 模式图像输入音频输入视频输入令牌级流式传输原生异步令牌使用情况Logprobs

设置

开始使用

  1. NVIDIA 创建一个免费帐户,该帐户托管 NVIDIA AI 基础模型。

  2. 单击您选择的模型。

  3. Input 下,选择Python 选项卡,然后单击Get API Key。然后单击Generate Key

  4. 复制生成的密钥并将其保存为 NVIDIA_API_KEY。从那里,您应该可以访问这些端点。

凭据

import getpass
import os

if not os.getenv("NVIDIA_API_KEY"):
# Note: the API key should start with "nvapi-"
os.environ["NVIDIA_API_KEY"] = getpass.getpass("Enter your NVIDIA API key: ")

如果您希望获得模型调用的自动跟踪,您还可以通过取消注释下方的内容来设置您的 LangSmith API 密钥

# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")

安装

LangChain NVIDIA AI Endpoints 集成存在于 langchain_nvidia_ai_endpoints 包中

%pip install --upgrade --quiet langchain-nvidia-ai-endpoints

实例化

现在我们可以访问 NVIDIA API 目录中的模型

## Core LC Chat Interface
from langchain_nvidia_ai_endpoints import ChatNVIDIA

llm = ChatNVIDIA(model="mistralai/mixtral-8x7b-instruct-v0.1")
API 参考:ChatNVIDIA

调用

result = llm.invoke("Write a ballad about LangChain.")
print(result.content)

使用 NVIDIA NIM

准备好部署时,您可以使用 NVIDIA NIM(包含在 NVIDIA AI Enterprise 软件许可中)自行托管模型,并在任何地方运行它们,从而使您可以拥有对您的自定义和知识产权 (IP) 以及 AI 应用程序的完全控制权。

了解有关 NIM 的更多信息

from langchain_nvidia_ai_endpoints import ChatNVIDIA

# connect to an embedding NIM running at localhost:8000, specifying a specific model
llm = ChatNVIDIA(base_url="https://127.0.0.1:8000/v1", model="meta/llama3-8b-instruct")
API 参考:ChatNVIDIA

流式传输、批处理和异步

这些模型原生支持流式传输,并且与所有 LangChain LLM 一样,它们公开了一个批处理方法来处理并发请求,以及用于调用、流式传输和批处理的异步方法。以下是一些示例。

print(llm.batch(["What's 2*3?", "What's 2*6?"]))
# Or via the async API
# await llm.abatch(["What's 2*3?", "What's 2*6?"])
for chunk in llm.stream("How far can a seagull fly in one day?"):
# Show the token separations
print(chunk.content, end="|")
async for chunk in llm.astream(
"How long does it take for monarch butterflies to migrate?"
):
print(chunk.content, end="|")

支持的模型

查询 available_models 仍然会为您提供 API 凭据提供的所有其他模型。

playground_ 前缀是可选的。

ChatNVIDIA.get_available_models()
# llm.get_available_models()

模型类型

以上所有这些模型都受支持,并且可以通过 ChatNVIDIA 访问。

某些模型类型支持独特的提示技术和聊天消息。我们将在下面回顾一些重要的模型类型。

要了解有关特定模型的更多信息,请导航到 AI 基础模型的 API 部分 如此处链接

通用聊天

诸如 meta/llama3-8b-instructmistralai/mixtral-8x22b-instruct-v0.1 之类的模型是通用的优秀模型,您可以将其用于任何 LangChain 聊天消息。示例如下。

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_nvidia_ai_endpoints import ChatNVIDIA

prompt = ChatPromptTemplate.from_messages(
[("system", "You are a helpful AI assistant named Fred."), ("user", "{input}")]
)
chain = prompt | ChatNVIDIA(model="meta/llama3-8b-instruct") | StrOutputParser()

for txt in chain.stream({"input": "What's your name?"}):
print(txt, end="")

代码生成

这些模型接受与常规聊天模型相同的参数和输入结构,但它们在代码生成和结构化代码任务方面往往表现更好。一个例子是 meta/codellama-70b

prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are an expert coding AI. Respond only in valid python; no narration whatsoever.",
),
("user", "{input}"),
]
)
chain = prompt | ChatNVIDIA(model="meta/codellama-70b") | StrOutputParser()

for txt in chain.stream({"input": "How do I solve this fizz buzz problem?"}):
print(txt, end="")

多模态

NVIDIA 还支持多模态输入,这意味着您可以为模型提供图像和文本进行推理。支持多模态输入的示例模型是 nvidia/neva-22b

以下是一个示例用法

import IPython
import requests

image_url = "https://www.nvidia.com/content/dam/en-zz/Solutions/research/ai-playground/[email protected]" ## Large Image
image_content = requests.get(image_url).content

IPython.display.Image(image_content)
from langchain_nvidia_ai_endpoints import ChatNVIDIA

llm = ChatNVIDIA(model="nvidia/neva-22b")
API 参考:ChatNVIDIA

以 URL 形式传递图像

from langchain_core.messages import HumanMessage

llm.invoke(
[
HumanMessage(
content=[
{"type": "text", "text": "Describe this image:"},
{"type": "image_url", "image_url": {"url": image_url}},
]
)
]
)
API 参考:HumanMessage

以 base64 编码字符串形式传递图像

目前,为了支持像上面那样较大的图像,客户端会进行一些额外的处理。但是对于较小的图像(为了更好地说明底层的处理过程),我们可以像下面这样直接传递图像

import IPython
import requests

image_url = "https://picsum.photos/seed/kitten/300/200"
image_content = requests.get(image_url).content

IPython.display.Image(image_content)
import base64

from langchain_core.messages import HumanMessage

## Works for simpler images. For larger images, see actual implementation
b64_string = base64.b64encode(image_content).decode("utf-8")

llm.invoke(
[
HumanMessage(
content=[
{"type": "text", "text": "Describe this image:"},
{
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{b64_string}"},
},
]
)
]
)
API 参考:HumanMessage

直接在字符串中

NVIDIA API 独特地接受以 base64 编码的图像,并将其内联在 <img/> HTML 标签中。虽然这与其他 LLM 不兼容,但您可以相应地直接提示模型。

base64_with_mime_type = f"data:image/png;base64,{b64_string}"
llm.invoke(f'What\'s in this image?\n<img src="{base64_with_mime_type}" />')

在 RunnableWithMessageHistory 中的示例用法

像任何其他集成一样,ChatNVIDIA 可以很好地支持像 RunnableWithMessageHistory 这样的聊天实用程序,这类似于使用 ConversationChain。下面,我们展示了应用于 mistralai/mixtral-8x22b-instruct-v0.1 模型的 LangChain RunnableWithMessageHistory 示例。

%pip install --upgrade --quiet langchain
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# store is a dictionary that maps session IDs to their corresponding chat histories.
store = {} # memory is maintained outside the chain


# A function that returns the chat history for a given session ID.
def get_session_history(session_id: str) -> InMemoryChatMessageHistory:
if session_id not in store:
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]


chat = ChatNVIDIA(
model="mistralai/mixtral-8x22b-instruct-v0.1",
temperature=0.1,
max_tokens=100,
top_p=1.0,
)

# Define a RunnableConfig object, with a `configurable` key. session_id determines thread
config = {"configurable": {"session_id": "1"}}

conversation = RunnableWithMessageHistory(
chat,
get_session_history,
)

conversation.invoke(
"Hi I'm Srijan Dubey.", # input or query
config=config,
)
conversation.invoke(
"I'm doing well! Just having a conversation with an AI.",
config=config,
)
conversation.invoke(
"Tell me about yourself.",
config=config,
)

工具调用

从 v0.2 开始,ChatNVIDIA 支持 bind_tools

ChatNVIDIA 提供了与 build.nvidia.com 上的各种模型以及本地 NIM 的集成。并非所有这些模型都经过工具调用训练。请务必选择一个具有工具调用的模型用于您的实验和应用程序。

您可以使用以下方法获取已知支持工具调用的模型列表:

tool_models = [
model for model in ChatNVIDIA.get_available_models() if model.supports_tools
]
tool_models

对于具有工具功能的模型,

from langchain_core.tools import tool
from pydantic import Field


@tool
def get_current_weather(
location: str = Field(..., description="The location to get the weather for."),
):
"""Get the current weather for a location."""
...


llm = ChatNVIDIA(model=tool_models[0].id).bind_tools(tools=[get_current_weather])
response = llm.invoke("What is the weather in Boston?")
response.tool_calls
API 参考:tool

有关更多示例,请参阅 如何使用聊天模型调用工具

链式调用

我们可以像这样使用提示模板链式调用我们的模型

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate(
[
(
"system",
"You are a helpful assistant that translates {input_language} to {output_language}.",
),
("human", "{input}"),
]
)

chain = prompt | llm
chain.invoke(
{
"input_language": "English",
"output_language": "German",
"input": "I love programming.",
}
)

API 参考

有关所有 ChatNVIDIA 功能和配置的详细文档,请访问 API 参考:https://python.langchain.ac.cn/api_reference/nvidia_ai_endpoints/chat_models/langchain_nvidia_ai_endpoints.chat_models.ChatNVIDIA.html


此页面是否有帮助?