ChatNVIDIA
这将帮助您开始使用NVIDIA的聊天模型。有关所有ChatNVIDIA
功能和配置的详细文档,请访问API参考。
概述
langchain-nvidia-ai-endpoints
包包含 LangChain 集成,用于在 NVIDIA NIM 推理微服务上构建应用程序。NIM 支持跨领域的模型,如聊天、嵌入和重新排序模型,这些模型来自社区以及 NVIDIA。这些模型由 NVIDIA 优化,以在 NVIDIA 加速基础设施上提供最佳性能,并作为 NIM 部署,NIM 是一个易于使用的预构建容器,可以在 NVIDIA 加速基础设施上使用单个命令部署到任何地方。
NVIDIA 托管的 NIM 部署可在 NVIDIA API 目录 上进行测试。测试完成后,可以使用 NVIDIA AI Enterprise 许可证从 NVIDIA 的 API 目录中导出 NIM,并在本地或云端运行,使企业拥有并完全控制其知识产权和 AI 应用程序。
NIMs 以每个模型为基础打包为容器镜像,并通过 NVIDIA NGC 目录作为 NGC 容器镜像分发。 NIMs 的核心是提供简单、一致且熟悉的 API,用于在 AI 模型上运行推理。
本示例介绍了如何使用LangChain通过ChatNVIDIA
类与NVIDIA进行交互。
有关通过此API访问聊天模型的更多信息,请查看ChatNVIDIA文档。
集成详情
类 | 包 | 本地 | 可序列化 | JS支持 | 包下载 | 包最新 |
---|---|---|---|---|---|---|
ChatNVIDIA | langchain_nvidia_ai_endpoints | ✅ | 测试版 | ❌ |
模型特性
工具调用 | 结构化输出 | JSON模式 | 图像输入 | 音频输入 | 视频输入 | 令牌级流式传输 | 原生异步 | 令牌使用 | Logprobs |
---|---|---|---|---|---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ |
设置
开始使用:
-
创建一个免费账户,使用NVIDIA,该平台托管NVIDIA AI基础模型。
-
点击您选择的模型。
-
在
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["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_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 NIMs合作
准备部署时,您可以使用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")
流、批处理和异步
这些模型原生支持流式处理,并且与所有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-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 图像内联在 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 上的各种模型以及本地 NIMs 的集成。并非所有这些模型都经过工具调用的训练。请确保选择一个确实具有工具调用功能的模型用于您的实验和应用。
你可以获取已知支持工具调用的模型列表,
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
请参阅如何使用聊天模型调用工具以获取更多示例。
链式调用
我们可以链式我们的模型与一个提示模板,如下所示:
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