Skip to main content
Open In ColabOpen on GitHub

ChatNVIDIA

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

概览

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

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

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

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

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

集成详情

本地可序列化的JS 支持软件包下载最新包裹
ChatNVIDIAlangchain_nvidia_ai_endpointsbetaPyPI - DownloadsPyPI - Version

模型特性

工具调用结构化输出JSON模式图像输入音频输入视频输入令牌级流式传输原生异步令牌使用量对数概率

设置

开始使用:

  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["LANGSMITH_TRACING"] = "true"
# os.environ["LANGSMITH_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 NIMs

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

了解更多关于NIMs的信息

from langchain_nvidia_ai_endpoints import ChatNVIDIA

# connect to an embedding NIM running at localhost:8000, specifying a specific model
llm = ChatNVIDIA(base_url="http://localhost: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 Foundation模型的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/nvidia-picasso-3c33-p@2x.jpg" ## 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标签中。尽管这与其他大型语言模型不兼容,但您可以直接相应地提示模型。

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 参考:工具

参见如何使用聊天模型调用工具以获取更多示例。

链式调用

我们可以像这样将我们的模型与提示模板链接

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 参考:ChatPromptTemplate

API 参考

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