Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
OpenAI wydało nową wersję biblioteki OpenAI Python API. Ten przewodnik jest uzupełnieniem przewodnika OpenAI po migracji i pomoże ci nadrobić wiedzę na temat zmian dotyczących platformy Azure OpenAI.
Aktualizacje
- Jest to nowa wersja biblioteki interfejsu API języka Python openAI.
- Począwszy od 6 listopada 2023 r.,
pip install openai
ipip install openai --upgrade
zainstalują bibliotekę OpenAI dla języka Pythonversion 1.x
. - Przejście z
version 0.28.1
doversion 1.x
to zmiana wymagająca aktualizacji, należy przetestować i zaktualizować swój kod. - Automatyczne ponawianie próby z wycofywaniem w przypadku wystąpienia błędu
- Odpowiednie typy (dla mypy/pyright/editors)
- Teraz można utworzyć instancję klienta zamiast używać domyślnej wartości globalnej.
- Przełącz się na jawne tworzenie instancji klienta
- Zmiany nazw
Znane problemy
-
DALL-E3
jest w pełni obsługiwana w najnowszej wersji 1.x.DALL-E2
można używać z programem 1.x, wprowadzając następujące modyfikacje w kodzie. -
embeddings_utils.py
która została użyta do zapewnienia funkcjonalności, takiej jak podobieństwo cosinusowe do semantycznego wyszukiwania tekstu, nie jest już częścią biblioteki interfejsu API języka Python OpenAI. - Należy również sprawdzić aktywne problemy z usługą GitHub dla biblioteki openAI języka Python.
Testowanie przed migracją
Ważne
Automatyczna migracja kodu przy użyciu openai migrate
nie jest obsługiwana w usłudze Azure OpenAI.
Ponieważ jest to nowa wersja biblioteki z niekompatybilnymi zmianami, przed przeniesieniem jakichkolwiek aplikacji produkcyjnych do korzystania z wersji 1.x, powinieneś dokładnie przetestować swój kod pod kątem nowego wydania. Należy również przejrzeć kod i procesy wewnętrzne, aby upewnić się, że przestrzegasz najlepszych rozwiązań i przypinasz kod produkcyjny tylko do wersji, które zostały w pełni przetestowane.
Aby ułatwić proces migracji, aktualizujemy istniejące przykłady kodu w naszej dokumentacji dla języka Python do formatu z kartami.
pip install openai --upgrade
Zapewnia to kontekst tego, co uległo zmianie i umożliwia równoległe testowanie nowej biblioteki przy jednoczesnym zachowaniu obsługi wersji 0.28.1
. Jeśli uaktualnisz 1.x
i zauważysz, że musisz tymczasowo cofnąć do poprzedniej wersji, zawsze możesz pip uninstall openai
, a następnie ponownie zainstalować docelowy 0.28.1
za pomocą pip install openai==0.28.1
.
Ukończenie czatu
Należy ustawić zmienną model
na nazwę wdrożenia wybraną podczas wdrażania modeli GPT-3.5-Turbo lub GPT-4. Wprowadzenie nazwy modelu powoduje błąd, chyba że wybrano nazwę wdrożenia identyczną z bazową nazwą modelu.
import os
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-02-01"
)
response = client.chat.completions.create(
model="gpt-35-turbo", # model = "deployment_name"
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
{"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},
{"role": "user", "content": "Do other Azure services support this too?"}
]
)
print(response.choices[0].message.content)
Dodatkowe przykłady można znaleźć w naszym szczegółowym artykule Dotyczącym uzupełniania czatów.
Uzupełnienia
import os
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-02-01",
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)
deployment_name='REPLACE_WITH_YOUR_DEPLOYMENT_NAME' #This will correspond to the custom name you chose for your deployment when you deployed a model.
# Send a completion call to generate an answer
print('Sending a test completion job')
start_phrase = 'Write a tagline for an ice cream shop. '
response = client.completions.create(model=deployment_name, prompt=start_phrase, max_tokens=10) # model = "deployment_name"
print(response.choices[0].text)
Osadzanie
import os
from openai import AzureOpenAI
client = AzureOpenAI(
api_key = os.getenv("AZURE_OPENAI_API_KEY"),
api_version = "2024-02-01",
azure_endpoint =os.getenv("AZURE_OPENAI_ENDPOINT")
)
response = client.embeddings.create(
input = "Your text string goes here",
model= "text-embedding-ada-002" # model = "deployment_name".
)
print(response.model_dump_json(indent=2))
Dodatkowe przykłady, w tym sposób obsługi wyszukiwania tekstu semantycznego bez embeddings_utils.py
, można znaleźć w naszym samouczku dotyczącym osadzania.
Async
OpenAI nie obsługuje wywoływania metod asynchronicznych w kliencie na poziomie modułu; zamiast tego powinieneś stworzyć instancję klienta asynchronicznego.
import os
import asyncio
from openai import AsyncAzureOpenAI
async def main():
client = AsyncAzureOpenAI(
api_key = os.getenv("AZURE_OPENAI_API_KEY"),
api_version = "2024-02-01",
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)
response = await client.chat.completions.create(model="gpt-35-turbo", messages=[{"role": "user", "content": "Hello world"}]) # model = model deployment name
print(response.model_dump_json(indent=2))
asyncio.run(main())
Uwierzytelnianie
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI
token_provider = get_bearer_token_provider(DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default")
api_version = "2024-02-01"
endpoint = "https://my-resource.openai.azure.com"
client = AzureOpenAI(
api_version=api_version,
azure_endpoint=endpoint,
azure_ad_token_provider=token_provider,
)
completion = client.chat.completions.create(
model="deployment-name", # model = "deployment_name"
messages=[
{
"role": "user",
"content": "How do I output all files in a directory using Python?",
},
],
)
print(completion.model_dump_json(indent=2))
Korzystanie z danych
Aby zapoznać się z pełnymi krokami konfiguracji wymaganymi do wykonania tych przykładów kodu, skonsultuj się z szybkim startem użycia danych.
import os
import openai
import dotenv
dotenv.load_dotenv()
endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPEN_AI_DEPLOYMENT_ID")
client = openai.AzureOpenAI(
base_url=f"{endpoint}/openai/deployments/{deployment}/extensions",
api_key=api_key,
api_version="2023-08-01-preview",
)
completion = client.chat.completions.create(
model=deployment, # model = "deployment_name"
messages=[
{
"role": "user",
"content": "How is Azure machine learning different than Azure OpenAI?",
},
],
extra_body={
"dataSources": [
{
"type": "AzureCognitiveSearch",
"parameters": {
"endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
"key": os.environ["AZURE_AI_SEARCH_API_KEY"],
"indexName": os.environ["AZURE_AI_SEARCH_INDEX"]
}
}
]
}
)
print(completion.model_dump_json(indent=2))
Naprawa DALL-E
import time
import json
import httpx
import openai
class CustomHTTPTransport(httpx.HTTPTransport):
def handle_request(
self,
request: httpx.Request,
) -> httpx.Response:
if "images/generations" in request.url.path and request.url.params[
"api-version"
] in [
"2023-06-01-preview",
"2023-07-01-preview",
"2023-08-01-preview",
"2023-09-01-preview",
"2023-10-01-preview",
]:
request.url = request.url.copy_with(path="/openai/images/generations:submit")
response = super().handle_request(request)
operation_location_url = response.headers["operation-location"]
request.url = httpx.URL(operation_location_url)
request.method = "GET"
response = super().handle_request(request)
response.read()
timeout_secs: int = 120
start_time = time.time()
while response.json()["status"] not in ["succeeded", "failed"]:
if time.time() - start_time > timeout_secs:
timeout = {"error": {"code": "Timeout", "message": "Operation polling timed out."}}
return httpx.Response(
status_code=400,
headers=response.headers,
content=json.dumps(timeout).encode("utf-8"),
request=request,
)
time.sleep(int(response.headers.get("retry-after")) or 10)
response = super().handle_request(request)
response.read()
if response.json()["status"] == "failed":
error_data = response.json()
return httpx.Response(
status_code=400,
headers=response.headers,
content=json.dumps(error_data).encode("utf-8"),
request=request,
)
result = response.json()["result"]
return httpx.Response(
status_code=200,
headers=response.headers,
content=json.dumps(result).encode("utf-8"),
request=request,
)
return super().handle_request(request)
client = openai.AzureOpenAI(
azure_endpoint="<azure_endpoint>",
api_key="<api_key>",
api_version="<api_version>",
http_client=httpx.Client(
transport=CustomHTTPTransport(),
),
)
image = client.images.generate(prompt="a cute baby seal")
print(image.data[0].url)
Zmiany nazw
Uwaga / Notatka
Wszystkie metody a* zostały usunięte; Zamiast tego należy użyć klienta asynchronicznego.
OpenAI Python 0.28.1 | OpenAI Python 1.x |
---|---|
openai.api_base |
openai.base_url |
openai.proxy |
openai.proxies |
openai.InvalidRequestError |
openai.BadRequestError |
openai.Audio.transcribe() |
client.audio.transcriptions.create() |
openai.Audio.translate() |
client.audio.translations.create() |
openai.ChatCompletion.create() |
client.chat.completions.create() |
openai.Completion.create() |
client.completions.create() |
openai.Edit.create() |
client.edits.create() |
openai.Embedding.create() |
client.embeddings.create() |
openai.File.create() |
client.files.create() |
openai.File.list() |
client.files.list() |
openai.File.retrieve() |
client.files.retrieve() |
openai.File.download() |
client.files.retrieve_content() |
openai.FineTune.cancel() |
client.fine_tunes.cancel() |
openai.FineTune.list() |
client.fine_tunes.list() |
openai.FineTune.list_events() |
client.fine_tunes.list_events() |
openai.FineTune.stream_events() |
client.fine_tunes.list_events(stream=True) |
openai.FineTune.retrieve() |
client.fine_tunes.retrieve() |
openai.FineTune.delete() |
client.fine_tunes.delete() |
openai.FineTune.create() |
client.fine_tunes.create() |
openai.FineTuningJob.create() |
client.fine_tuning.jobs.create() |
openai.FineTuningJob.cancel() |
client.fine_tuning.jobs.cancel() |
openai.FineTuningJob.delete() |
client.fine_tuning.jobs.create() |
openai.FineTuningJob.retrieve() |
client.fine_tuning.jobs.retrieve() |
openai.FineTuningJob.list() |
client.fine_tuning.jobs.list() |
openai.FineTuningJob.list_events() |
client.fine_tuning.jobs.list_events() |
openai.Image.create() |
client.images.generate() |
openai.Image.create_variation() |
client.images.create_variation() |
openai.Image.create_edit() |
client.images.edit() |
openai.Model.list() |
client.models.list() |
openai.Model.delete() |
client.models.delete() |
openai.Model.retrieve() |
client.models.retrieve() |
openai.Moderation.create() |
client.moderations.create() |
openai.api_resources |
openai.resources |
Usunięte
openai.api_key_path
openai.app_info
openai.debug
openai.log
openai.OpenAIError
openai.Audio.transcribe_raw()
openai.Audio.translate_raw()
openai.ErrorObject
openai.Customer
openai.api_version
openai.verify_ssl_certs
openai.api_type
openai.enable_telemetry
openai.ca_bundle_path
-
openai.requestssession
(OpenAI teraz używahttpx
) -
openai.aiosession
(OpenAI teraz używahttpx
) -
openai.Deployment
(Wcześniej używane w usłudze Azure OpenAI) openai.Engine
openai.File.find_matching_files()