ChatNVIDIA
这将帮助您开始使用 NVIDIA 聊天模型。有关所有ChatNVIDIA
功能和配置的详细文档,请访问API 参考。
概述
langchain-nvidia-ai-endpoints
包包含使用 NVIDIA NIM 推理微服务上的模型构建应用程序的 LangChain 集成。NIM 支持来自社区以及 NVIDIA 的聊天、嵌入和重新排序模型等各个领域的模型。这些模型由 NVIDIA 优化,可在 NVIDIA 加速基础设施上提供最佳性能,并作为 NIM 部署,NIM 是一种易于使用、预构建的容器,可在 NVIDIA 加速基础设施上使用单个命令在任何地方部署。
NIM 的 NVIDIA 托管部署可在 NVIDIA API 目录 上进行测试。测试后,可以使用 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 | ✅ | beta | ❌ |
模型功能
工具调用 | 结构化输出 | 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 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")
流、批处理和异步
这些模型原生支持流,并且与所有 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 独特地接受以 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.pydantic_v1 import Field
from langchain_core.tools import tool
@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/v0.2/api_reference/nvidia_ai_endpoints/chat_models/langchain_nvidia_ai_endpoints.chat_models.ChatNVIDIA.html