ChatNVIDIA
这将帮助您开始使用 NVIDIA 聊天模型。有关所有ChatNVIDIA功能和配置可参考 API 参考。
概述
这langchain-nvidia-ai-endpointspackage 包含 LangChain 集成,使用 model 构建应用程序
NVIDIA NIM 推理微服务。NIM 支持跨域的模型,例如聊天、嵌入和重新排名模型
来自社区和 NVIDIA。这些模型由 NVIDIA 优化,可在 NVIDIA 上提供最佳性能
加速基础设施并部署为 NIM,NIM 是一种易于使用的预构建容器,可使用单个
命令。
NVIDIA 托管的 NIM 部署可在 NVIDIA API 目录中进行测试。测试后, 可以使用 NVIDIA AI Enterprise 许可证从 NVIDIA 的 API 目录中导出 NIM,并在本地或云中运行。 让企业拥有并完全控制其 IP 和 AI 应用程序。
NIM 按模型打包为容器映像,并通过 NVIDIA NGC 目录作为 NGC 容器映像分发。 NIM 的核心是提供简单、一致且熟悉的 API,用于在 AI 模型上运行推理。
此示例介绍了如何使用 LangChain 与 NVIDIA 交互,通过ChatNVIDIA类。
有关通过此 API 访问聊天模型的更多信息,请查看 ChatNVIDIA 文档。
集成详细信息
| 类 | 包 | 本地化 | 序列 化 | JS 支持 | 软件包下载 | 最新包装 |
|---|---|---|---|---|---|---|
| ChatNVIDIA | langchain_nvidia_ai_endpoints | ✅ | beta | ❌ |
模型特点
| 工具调用 | 结构化输出 | JSON 模式 | 图像输入 | 音频输入 | 视频输入 | 令牌级流式处理 | 本机异步 | Token 使用情况 | 日志 |
|---|---|---|---|---|---|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ |
设置
要开始使用,请执行以下作:
-
在托管 NVIDIA AI Foundation 模型的 NVIDIA 上创建一个免费帐户。
-
单击您选择的型号。
-
下
Input选择Python选项卡,然后单击Get API Key.然后单击Generate Key. -
将生成的密钥复制并另存为
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 端点集成位于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")
调用
result = llm.invoke("Write a ballad about LangChain.")
print(result.content)
使用 NVIDIA NIM
准备好部署后,您可以使用 NVIDIA NIM(包含在 NVIDIA AI Enterprise 软件许可证中)自托管模型,并在任何地方运行它们,从而获得自定义的所有权,并完全控制您的知识产权 (IP) 和 AI 应用程序。
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")
Stream、Batch 和 Async
这些模型原生支持流式处理,并且与所有 LangChain LLM 一样,它们公开了用于处理并发请求的批处理方法,以及用于 invoke、stream 和 batch 的异步方法。以下是一些示例。
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_prefix 是可选的。
ChatNVIDIA.get_available_models()
# llm.get_available_models()
模型类型
上述所有这些模型均受支持,并且可以通过以下方式访问ChatNVIDIA.
某些模型类型支持独特的提示技术和聊天消息。我们将在下面回顾一些重要的。
要了解有关特定模型的更多信息,请导航到 AI Foundation 模型的 API 部分,如此处链接。
一般聊天
模型如meta/llama3-8b-instruct和mistralai/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")
将图像作为 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}},
]
)
]
)
将图像作为 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}"},
},
]
)
]
)
直接在字符串中
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型。
%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
有关其他示例,请参阅如何使用聊天模型调用工具。
链接
我们可以用 prompt 模板链接我们的模型,如下所示:
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.com/api_reference/nvidia_ai_endpoints/chat_models/langchain_nvidia_ai_endpoints.chat_models.ChatNVIDIA.html