🦁

OpenAIを少しだけ

2024/01/27に公開

LambdaでLangChain使いたいだけなのにハマりまくった

学習メモです。

やりたいこと

発生したエラー集

import os
os.environ["OPENAI_API_KEY"] = "APIKeyを入力"

◆発生したエラー

You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.\n\nYou can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. \n\nAlternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`

◆エラーの原因と対処方法

とのことなのでインストール時にopenaiのバージョンを指定する。

pip install -t ./python openai==0.28

これでうまくいった。

◆LambdaのTest実行時のエラー

Test Event Name
test

Response
{
  "errorMessage": "2024-01-23T10:31:27.209Z de3c8c01-4a5c-46a0-bee8-f979b732478e Task timed out after 3.01 seconds"
}

Function Logs
START RequestId: de3c8c01-4a5c-46a0-bee8-f979b732478e Version: $LATEST
2024-01-23T10:31:27.209Z de3c8c01-4a5c-46a0-bee8-f979b732478e Task timed out after 3.01 seconds

END RequestId: de3c8c01-4a5c-46a0-bee8-f979b732478e
REPORT RequestId: de3c8c01-4a5c-46a0-bee8-f979b732478e	Duration: 3014.74 ms	Billed Duration: 3000 ms	Memory Size: 128 MB	Max Memory Used: 27 MB

Request ID
de3c8c01-4a5c-46a0-bee8-f979b732478e

「openai.ChatCompletionにアクセスしようとしましたが、これはopenai>=1.0.0ではサポートされなくなりました」
となるため。

import openai

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Hello! I'm John."}
  ]
)

print(response)

◆LangChainのLambdaレイヤー設定

mkdir langchain
pip install -t ./langchain langchain
zip -r langchain.zip ./langchain 
10 MB より大きいファイルの場合は、Amazon S3 を使用したアップロードを検討してください。

とあるがアップロードできた

でも、これではlangchainがないってエラーが発生した。

openaiとlangchainを一緒に入れないと依存関係おかしくなるとか?やってみよう。

pip install -t ./python langchain openai==0.28
zip -r python.zip ./python 
pip install -t ./python openai langchain でいってみる?
エラー:”Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core'",

ECRを使ってやってみた

LangChainのライブラリは、Lambdaレイヤーから使うのではなく、
ECRにコンテナイメージを保存して、Lambdaをコンテナで実行する作戦。

手順:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-image.html#python-image-instructions

lambda_function.py
import os
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.document_loaders import S3DirectoryLoader

def handler(event, context):
    # OpenAIのモデルのインスタンスを作成
    chat = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key= os.environ['API_KEY'], temperature=0)

    # プロンプトのテンプレート文章を定義
    template = """
    次の文章に誤字がないか調べて。誤字があれば訂正してください。
    {sentences_before_check}
    """

    # テンプレート文章にあるチェック対象の単語を変数化
    prompt = PromptTemplate(
        input_variables=["sentences_before_check"],
        template=template,
    )

    # OpenAIのAPIにこのプロンプトを送信するためのチェーンを作成
    chain = LLMChain(llm=chat, prompt=prompt,verbose=True)

    # チェーンを実行し、結果を表示
    print(chain("こんんんちわ、本田です。")['text'])

    # S3の読み込みトライ
    loader = S3DirectoryLoader('langchain-display-test')
    print(loader.load())
requirements.txt
numpy # Numpyインポートエラー対策。無くても動くかも。
fastapi==0.99.0
openai==0.28
langchain==0.0.301
unstructured # ファイルローダー用
Dockerfile
FROM public.ecr.aws/lambda/python:3.11

# Copy requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}

# Install the specified packages
RUN pip install -r requirements.txt

# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.handler" ]

Discussion