ChatOpenAI
本筆記本提供快速概觀,協助您開始使用 OpenAI 聊天模型。如需所有 ChatOpenAI 功能和組態的詳細文件,請前往 API 參考。
OpenAI 有數種聊天模型。您可以在 OpenAI 文件中找到關於其最新模型及其成本、上下文視窗和支援的輸入類型資訊。
請注意,某些 OpenAI 模型也可以透過 Microsoft Azure 平台存取。若要使用 Azure OpenAI 服務,請使用 AzureChatOpenAI 整合。
概觀
整合詳細資訊
類別 | 套件 | 本地 | 可序列化 | JS 支援 | 套件下載 | 套件最新版 |
---|---|---|---|---|---|---|
ChatOpenAI | langchain-openai | ❌ | beta | ✅ |
模型功能
工具呼叫 | 結構化輸出 | JSON 模式 | 影像輸入 | 音訊輸入 | 視訊輸入 | Token 層級串流 | 原生非同步 | Token 用量 | Logprobs |
---|---|---|---|---|---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
設定
若要存取 OpenAI 模型,您需要建立 OpenAI 帳戶、取得 API 金鑰,並安裝 langchain-openai
整合套件。
憑證
前往 https://platform.openai.com 註冊 OpenAI 並產生 API 金鑰。完成後,設定 OPENAI_API_KEY 環境變數
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ")
如果您想要取得模型呼叫的自動追蹤,您也可以設定您的 LangSmith API 金鑰,方法是取消註解下方內容
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"
安裝
LangChain OpenAI 整合存在於 langchain-openai
套件中
%pip install -qU langchain-openai
例項化
現在我們可以例項化我們的模型物件並產生聊天完成
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
# api_key="...", # if you prefer to pass api key in directly instaed of using env vars
# base_url="...",
# organization="...",
# other params...
)
調用
messages = [
(
"system",
"You are a helpful assistant that translates English to French. Translate the user sentence.",
),
("human", "I love programming."),
]
ai_msg = llm.invoke(messages)
ai_msg
AIMessage(content="J'adore la programmation.", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 5, 'prompt_tokens': 31, 'total_tokens': 36}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_3aa7262c27', 'finish_reason': 'stop', 'logprobs': None}, id='run-63219b22-03e3-4561-8cc4-78b7c7c3a3ca-0', usage_metadata={'input_tokens': 31, 'output_tokens': 5, 'total_tokens': 36})
print(ai_msg.content)
J'adore la programmation.
串鏈
我們可以像這樣使用提示範本串鏈我們的模型
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages(
[
(
"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.",
}
)
AIMessage(content='Ich liebe das Programmieren.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 6, 'prompt_tokens': 26, 'total_tokens': 32}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_3aa7262c27', 'finish_reason': 'stop', 'logprobs': None}, id='run-350585e1-16ca-4dad-9460-3d9e7e49aaf1-0', usage_metadata={'input_tokens': 26, 'output_tokens': 6, 'total_tokens': 32})
工具呼叫
OpenAI 有一個工具呼叫 (我們在這裡交替使用「工具呼叫」和「函數呼叫」) API,可讓您描述工具及其引數,並讓模型傳回 JSON 物件,其中包含要調用的工具以及該工具的輸入。工具呼叫對於建置工具使用鏈和代理程式,以及更廣泛地從模型取得結構化輸出非常有用。
ChatOpenAI.bind_tools()
透過 ChatOpenAI.bind_tools
,我們可以輕鬆地將 Pydantic 類別、dict 結構描述、LangChain 工具,甚至是函數作為工具傳遞至模型。在底層,這些會轉換為 OpenAI 工具結構描述,如下所示
{
"name": "...",
"description": "...",
"parameters": {...} # JSONSchema
}
並在每次模型調用中傳遞。
from pydantic import BaseModel, Field
class GetWeather(BaseModel):
"""Get the current weather in a given location"""
location: str = Field(..., description="The city and state, e.g. San Francisco, CA")
llm_with_tools = llm.bind_tools([GetWeather])
ai_msg = llm_with_tools.invoke(
"what is the weather like in San Francisco",
)
ai_msg
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_o9udf3EVOWiV4Iupktpbpofk', 'function': {'arguments': '{"location":"San Francisco, CA"}', 'name': 'GetWeather'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 68, 'total_tokens': 85}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_3aa7262c27', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-1617c9b2-dda5-4120-996b-0333ed5992e2-0', tool_calls=[{'name': 'GetWeather', 'args': {'location': 'San Francisco, CA'}, 'id': 'call_o9udf3EVOWiV4Iupktpbpofk', 'type': 'tool_call'}], usage_metadata={'input_tokens': 68, 'output_tokens': 17, 'total_tokens': 85})
strict=True
langchain-openai>=0.1.21rc1
截至 2024 年 8 月 6 日,OpenAI 在呼叫工具時支援 strict
引數,這將強制模型遵守工具引數結構描述。請在此處查看更多資訊:https://platform.openai.com/docs/guides/function-calling
注意:如果 strict=True
,工具定義也將經過驗證,並且接受 JSON 結構描述的子集。至關重要的是,結構描述不能有選擇性引數 (具有預設值的引數)。請在此處閱讀關於支援哪些類型結構描述的完整文件:https://platform.openai.com/docs/guides/structured-outputs/supported-schemas。
llm_with_tools = llm.bind_tools([GetWeather], strict=True)
ai_msg = llm_with_tools.invoke(
"what is the weather like in San Francisco",
)
ai_msg
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_jUqhd8wzAIzInTJl72Rla8ht', 'function': {'arguments': '{"location":"San Francisco, CA"}', 'name': 'GetWeather'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 68, 'total_tokens': 85}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_3aa7262c27', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-5e3356a9-132d-4623-8e73-dd5a898cf4a6-0', tool_calls=[{'name': 'GetWeather', 'args': {'location': 'San Francisco, CA'}, 'id': 'call_jUqhd8wzAIzInTJl72Rla8ht', 'type': 'tool_call'}], usage_metadata={'input_tokens': 68, 'output_tokens': 17, 'total_tokens': 85})
AIMessage.tool_calls
請注意,AIMessage 具有 tool_calls
屬性。這包含模型供應商不可知的標準化 ToolCall 格式。
ai_msg.tool_calls
[{'name': 'GetWeather',
'args': {'location': 'San Francisco, CA'},
'id': 'call_jUqhd8wzAIzInTJl72Rla8ht',
'type': 'tool_call'}]
如需關於繫結工具和工具呼叫輸出的詳細資訊,請前往工具呼叫文件。
微調
您可以透過傳遞對應的 modelName
參數來呼叫微調的 OpenAI 模型。
這通常採用 ft:{OPENAI_MODEL_NAME}:{ORG_NAME}::{MODEL_ID}
的形式。例如
fine_tuned_model = ChatOpenAI(
temperature=0, model_name="ft:gpt-3.5-turbo-0613:langchain::7qTVM5AR"
)
fine_tuned_model.invoke(messages)
AIMessage(content="J'adore la programmation.", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 8, 'prompt_tokens': 31, 'total_tokens': 39}, 'model_name': 'ft:gpt-3.5-turbo-0613:langchain::7qTVM5AR', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-0f39b30e-c56e-4f3b-af99-5c948c984146-0', usage_metadata={'input_tokens': 31, 'output_tokens': 8, 'total_tokens': 39})
多模態輸入
OpenAI 具有支援多模態輸入的模型。您可以將圖片或音訊傳遞至這些模型。如需關於如何在 LangChain 中執行此操作的詳細資訊,請前往多模態輸入文件。
您可以在 OpenAI 的文件中查看支援不同模態的模型清單。
在本文件撰寫時,您會使用的主要 OpenAI 模型為
- 影像輸入:
gpt-4o
、gpt-4o-mini
- 音訊輸入:
gpt-4o-audio-preview
如需傳遞影像輸入的範例,請參閱多模態輸入操作指南。
以下是將音訊輸入傳遞至 gpt-4o-audio-preview
的範例
import base64
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o-audio-preview",
temperature=0,
)
with open(
"../../../../libs/partners/openai/tests/integration_tests/chat_models/audio_input.wav",
"rb",
) as f:
# b64 encode it
audio = f.read()
audio_b64 = base64.b64encode(audio).decode()
output_message = llm.invoke(
[
(
"human",
[
{"type": "text", "text": "Transcribe the following:"},
# the audio clip says "I'm sorry, but I can't create..."
{
"type": "input_audio",
"input_audio": {"data": audio_b64, "format": "wav"},
},
],
),
]
)
output_message.content
"I'm sorry, but I can't create audio content that involves yelling. Is there anything else I can help you with?"
預測輸出
需要 langchain-openai>=0.2.6
某些 OpenAI 模型 (例如其 gpt-4o
和 gpt-4o-mini
系列) 支援預測輸出,可讓您預先傳遞 LLM 預期輸出的已知部分,以減少延遲。這對於編輯文字或程式碼等情況很有用,在這些情況下,只有模型輸出的一小部分會變更。
以下範例
code = """
/// <summary>
/// Represents a user with a first name, last name, and username.
/// </summary>
public class User
{
/// <summary>
/// Gets or sets the user's first name.
/// </summary>
public string FirstName { get; set; }
/// <summary>
/// Gets or sets the user's last name.
/// </summary>
public string LastName { get; set; }
/// <summary>
/// Gets or sets the user's username.
/// </summary>
public string Username { get; set; }
}
"""
llm = ChatOpenAI(model="gpt-4o")
query = (
"Replace the Username property with an Email property. "
"Respond only with code, and with no markdown formatting."
)
response = llm.invoke(
[{"role": "user", "content": query}, {"role": "user", "content": code}],
prediction={"type": "content", "content": code},
)
print(response.content)
print(response.response_metadata)
/// <summary>
/// Represents a user with a first name, last name, and email.
/// </summary>
public class User
{
/// <summary>
/// Gets or sets the user's first name.
/// </summary>
public string FirstName { get; set; }
/// <summary>
/// Gets or sets the user's last name.
/// </summary>
public string LastName { get; set; }
/// <summary>
/// Gets or sets the user's email.
/// </summary>
public string Email { get; set; }
}
{'token_usage': {'completion_tokens': 226, 'prompt_tokens': 166, 'total_tokens': 392, 'completion_tokens_details': {'accepted_prediction_tokens': 49, 'audio_tokens': None, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 107}, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_45cf54deae', 'finish_reason': 'stop', 'logprobs': None}
請注意,目前預測會作為額外 token 計費,並可能增加您的用量和成本,以換取這種減少的延遲。
音訊生成 (預覽)
需要 langchain-openai>=0.2.3
OpenAI 有一個新的音訊生成功能,可讓您將音訊輸入和輸出與 gpt-4o-audio-preview
模型搭配使用。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o-audio-preview",
temperature=0,
model_kwargs={
"modalities": ["text", "audio"],
"audio": {"voice": "alloy", "format": "wav"},
},
)
output_message = llm.invoke(
[
("human", "Are you made by OpenAI? Just answer yes or no"),
]
)
output_message.additional_kwargs['audio']
將包含類似以下的字典
{
'data': '<audio data b64-encoded',
'expires_at': 1729268602,
'id': 'audio_67127d6a44348190af62c1530ef0955a',
'transcript': 'Yes.'
}
格式將會是 model_kwargs['audio']['format']
中傳遞的格式。
我們也可以在 openai expires_at
到達之前,將此包含音訊資料的訊息作為訊息歷史記錄的一部分傳回模型。
輸出音訊儲存在 AIMessage.additional_kwargs
中的 audio
鍵下,但輸入內容區塊會使用 HumanMessage.content
清單中的 input_audio
類型和鍵來輸入。
如需更多資訊,請參閱 OpenAI 的音訊文件。
history = [
("human", "Are you made by OpenAI? Just answer yes or no"),
output_message,
("human", "And what is your name? Just give your name."),
]
second_output_message = llm.invoke(history)
API 參考
如需所有 ChatOpenAI 功能和組態的詳細文件,請前往 API 參考:https://langchain-python.dev.org.tw/api_reference/openai/chat_models/langchain_openai.chat_models.base.ChatOpenAI.html