Azure OpenAI で LangChain を使う場合、"Azure"用に。openai==0.28 ⇒1.0 の移行はMS-Learnで

# 背景

Azure ML Studio の Notebooks で LangChain を試してみようとしたところ、
サンプルコードがそのままでは動かないってのがあったので、修正点について備忘録

# 概要

- LangChain で、OpenAI 系が、Azure 用に分離したので、その対応が必要
- OpenAI Python API ライブラリ 1.x への移行

# LangChain 移行例

例なので、実際はここに表現している変更点以外もあるので、
usage example を確認しつつ行おう。


## LLMs: OpenAI ⇒ AzureOpenAI

```python: 変更前
from langchain.llms import OpenAI

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_KEY"] = "..."
os.environ["OPENAI_API_BASE"] = "https://<your-endpoint>.openai.azure.com/"

llm = OpenAI(
    model_name='<model name>', 
    model_kwargs={"deployment_id":"<deployment name>"}
)
```

```python: 変更後
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_VERSION"] = "2023-05-15"
os.environ["OPENAI_API_BASE"] = "..."
os.environ["OPENAI_API_KEY"] = "..."

# Import Azure OpenAI
from langchain.llms import AzureOpenAI

# Create an instance of Azure OpenAI
# Replace the deployment name with your own
llm = AzureOpenAI(
    deployment_name="td2",
    model_name="gpt-3.5-turbo-instruct",
)
```

https://python.langchain.com/docs/integrations/llms/azure_openai

## Chat models: ChatOpenAI ⇒ AzureChatOpenAI

```python: 変更前
from langchain.chat_models import ChatOpenAI

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_KEY"] = "..."
os.environ["OPENAI_API_BASE"] = "https://<your-endpoint>.openai.azure.com/"

chat = ChatOpenAI(
    model_name='gpt-35-turbo',
    model_kwargs={"deployment_id":"your-deployment-name"}
)
```

```python: 変更後
from langchain.chat_models import AzureChatOpenAI

os.environ["AZURE_OPENAI_API_KEY"] = "..."
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://<your-endpoint>.openai.azure.com/"

model = AzureChatOpenAI(
    openai_api_version="2023-05-15",
    azure_deployment="your-deployment-name",
)
```

https://python.langchain.com/docs/integrations/chat/azure_chat_openai




## embeddings: OpenAIEmbeddings ⇒ AzureOpenAIEmbeddings

これに関しては、LangChain 公式でも、まだ記載が古いので間違えやすそう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2e2ab475-9c82-85b2-4492-005f103d9688.png)

https://python.langchain.com/docs/integrations/platforms/openai#text-embedding-model

```python: 変更前
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_KEY"] = "..."
os.environ["OPENAI_API_BASE"] = "https://<your-endpoint>.openai.azure.com/"


from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(
    model='text-embedding-ada-002',
    deployment="test-embedding-ada"
)
```

```python: 変更後
os.environ["AZURE_OPENAI_API_KEY"] = "..."
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://<your-endpoint>.openai.azure.com/"


from langchain.embeddings import AzureOpenAIEmbeddings

embeddings = AzureOpenAIEmbeddings(
    azure_deployment="<your-embeddings-deployment-name>",
    openai_api_version="2023-05-15",
)
```

https://python.langchain.com/docs/integrations/text_embedding/azureopenai

# openai Python 0.28 ⇒ 1.x

Azure ML Notebooks で openai を install すると最新バージョンである 1.x 系となる。
で、そうなると呼び出し方も色々と変わるので、それぞれ確認しながらやるしかなさそう

まぁ、そうはいっても使い方に大きな変更はなさそうなので、
Qiita 上のサンプルも簡単に動かせる感じです。

以下、変更例の一部

```python: 変更前
import openai

completion = openai.ChatCompletion.create(
    engine=deployment,
```

```python: 変更後
from openai import AzureOpenAI

client = AzureOpenAI(
    api_version=api_version,
    azure_endpoint=endpoint,
    azure_ad_token_provider=token_provider,
)

completion = client.chat.completions.create(
    model=deployment,   # 引数名変更
```

ってことで、Microsoft さんの情報を確認しながら移行しましょう。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/migration?tabs=python%2Cdalle-fix#use-your-data

# あとがき

環境変数といい、引数名といい統一されていないので、
これらの統合も今後来るんだろうなぁ・・という気はするので、
そのうちまた破壊的変更になりますな :sweat: 

とはいえ、LangChain 触ると、開発してる人達はほんとに素晴らしいなぁと感じますね。 :laughing: