ChatNVIDIA
这将帮助您开始使用 NVIDIA 聊天模型。有关所有 ChatNVIDIA
功能和配置的详细文档,请访问API 参考。
概述
langchain-nvidia-ai-endpoints
包包含使用 NVIDIA NIM 推理微服务上的模型构建应用程序的 LangChain 集成。NIM 支持来自社区以及 NVIDIA 的聊天、嵌入和重新排序模型等各个领域的模型。这些模型经过 NVIDIA 优化,可在 NVIDIA 加速基础设施上提供最佳性能,并作为 NIM 部署,NIM 是一种易于使用、预构建的容器,可在 NVIDIA 加速基础设施上使用单个命令部署到任何位置。
可以在NVIDIA API 目录上测试 NVIDIA 托管的 NIM 部署。测试后,可以使用 NVIDIA AI Enterprise 许可证从 NVIDIA 的 API 目录导出 NIM,并在本地或云中运行,使企业能够拥有和完全控制其 IP 和 AI 应用程序。
NIM 作为容器镜像打包,每个模型一个,并作为 NGC 容器镜像通过 NVIDIA NGC 目录分发。NIM 的核心是为在 AI 模型上运行推理提供简单、一致且熟悉的 API。
此示例介绍如何使用 LangChain 通过 ChatNVIDIA
类与 NVIDIA 支持的模型进行交互。
有关通过此 API 访问聊天模型的更多信息,请查看ChatNVIDIA 文档。
集成详细信息
类 | 包 | 本地 | 可序列化 | JS 支持 | 包下载 | 包最新版本 |
---|---|---|---|---|---|---|
ChatNVIDIA | langchain_nvidia_ai_endpoints | ✅ | 测试版 | ❌ |
模型功能
工具调用 | 结构化输出 | JSON 模式 | 图像输入 | 音频输入 | 视频输入 | 令牌级流 | 原生异步 | 令牌使用情况 | Logprobs |
---|---|---|---|---|---|---|---|---|---|
✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
设置
入门
-
在NVIDIA上创建一个免费帐户,该帐户托管 NVIDIA AI 基础模型。
-
点击您选择的模型。
-
在“输入”下选择“Python”选项卡,然后点击“获取 API 密钥”。然后点击“生成密钥”。
-
复制并保存生成的密钥作为
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 NIM
准备好部署时,您可以使用 NVIDIA AI Enterprise 软件许可证中包含的 NVIDIA NIM 自托管模型,并在任何地方运行它们,从而使您能够拥有自己的自定义项,并完全控制您的知识产权 (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/[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")
将图像作为 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 独特地接受作为内联在 <img/>
HTML 标签中的 Base64 图像。虽然这与其他 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
请参阅 如何使用聊天模型调用工具 获取更多示例。
链式调用
我们可以使用如下所示的提示模板对模型进行 链式调用
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