跳到主要內容

ChatOpenAI

本筆記本提供快速概觀,協助您開始使用 OpenAI 聊天模型。如需所有 ChatOpenAI 功能和組態的詳細文件,請前往 API 參考

OpenAI 有數種聊天模型。您可以在 OpenAI 文件中找到關於其最新模型及其成本、上下文視窗和支援的輸入類型資訊。

Azure OpenAI

請注意,某些 OpenAI 模型也可以透過 Microsoft Azure 平台存取。若要使用 Azure OpenAI 服務,請使用 AzureChatOpenAI 整合

概觀

整合詳細資訊

類別套件本地可序列化JS 支援套件下載套件最新版
ChatOpenAIlangchain-openaibetaPyPI - DownloadsPyPI - Version

模型功能

工具呼叫結構化輸出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...
)
API 參考:ChatOpenAI

調用

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.",
}
)
API 參考:ChatPromptTemplate
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-4ogpt-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
API 參考:ChatOpenAI
"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-4ogpt-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"),
]
)
API 參考:ChatOpenAI

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


此頁面是否實用?