🦁
OpenAIを少しだけ
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