目的
Lambd関数内で以下のlangchain関連のパッケージを使っていたのですが、ある日を境に表題のエラーが発生するようになりました。
from langchain_aws import ChatBedrock
from langchain_core.messages import HumanMessage
from langchain.prompts import PromptTemplate
エラー内容の全貌
[ERROR] TypeError: ForwardRef._evaluate() missing 1 required keyword-only argument: 'recursive_guard'
Traceback (most recent call last):
File "/var/lang/lib/python3.12/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 995, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/var/task/lambda_function.py", line 12, in <module>
from langchain_aws import ChatBedrock
File "/opt/python/lib/python3.12/site-packages/langchain_aws/__init__.py", line 1, in <module>
from langchain_aws.chat_models import BedrockChat, ChatBedrock
File "/opt/python/lib/python3.12/site-packages/langchain_aws/chat_models/__init__.py", line 1, in <module>
from langchain_aws.chat_models.bedrock import BedrockChat, ChatBedrock
File "/opt/python/lib/python3.12/site-packages/langchain_aws/chat_models/bedrock.py", line 19, in <module>
from langchain_core.callbacks import (
File "/opt/python/lib/python3.12/site-packages/langchain_core/callbacks/__init__.py", line 22, in <module>
from langchain_core.callbacks.manager import (
File "/opt/python/lib/python3.12/site-packages/langchain_core/callbacks/manager.py", line 29, in <module>
from langsmith.run_helpers import get_run_tree_context
File "/opt/python/lib/python3.12/site-packages/langsmith/run_helpers.py", line 38, in <module>
from langsmith import client as ls_client
File "/opt/python/lib/python3.12/site-packages/langsmith/client.py", line 52, in <module>
from langsmith import env as ls_env
File "/opt/python/lib/python3.12/site-packages/langsmith/env/__init__.py", line 3, in <module>
from langsmith.env._runtime_env import (
File "/opt/python/lib/python3.12/site-packages/langsmith/env/_runtime_env.py", line 9, in <module>
from langsmith.utils import get_docker_compose_command
File "/opt/python/lib/python3.12/site-packages/langsmith/utils.py", line 29, in <module>
from langsmith import schemas as ls_schemas
File "/opt/python/lib/python3.12/site-packages/langsmith/schemas.py", line 69, in <module>
class Example(ExampleBase):
File "/opt/python/lib/python3.12/site-packages/pydantic/v1/main.py", line 286, in __new__
cls.__try_update_forward_refs__()
File "/opt/python/lib/python3.12/site-packages/pydantic/v1/main.py", line 807, in __try_update_forward_refs__
update_model_forward_refs(cls, cls.__fields__.values(), cls.__config__.json_encoders, localns, (NameError,))
File "/opt/python/lib/python3.12/site-packages/pydantic/v1/typing.py", line 554, in update_model_forward_refs
update_field_forward_refs(f, globalns=globalns, localns=localns)
File "/opt/python/lib/python3.12/site-packages/pydantic/v1/typing.py", line 520, in update_field_forward_refs
field.type_ = evaluate_forwardref(field.type_, globalns, localns or None)
File "/opt/python/lib/python3.12/site-packages/pydantic/v1/typing.py", line 66, in evaluate_forwardref
return cast(Any, type_)._evaluate(globalns, localns, set())
今回はその解決方法の備忘録になります。
原因
エラー名でググるとピンポイントでヒットしました。
https://artificialintelligencearticle.com/facing-forwardref-_evaluate-missing-1-required-keyword-only-argument-recursive_guard-by-aniket-bakre-jul-2024/
LambdaのPythonバージョンが3.12.4
にアップグレードされたのが原因のようです。
実際にLambdaで扱われているPythonのバージョンを見ると、確かに3.12.4
が使われていますね。
import sys
def lambda_handler(event, context):
print(f"Python version: {sys.version}")
# Python version: 3.12.4 (main, Jul 31 2024, 22:52:18) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)]
加えて、CloudWatch からLambdaの実行履歴を確認すると、8/30を境にPythonのバージョンが更新(v29 -> v30)されていることが確認できます。
解決策
今回はLambdaのランタイム設定より、Pythonのバージョンを固定する形で対応します。
・Lambdaのコンソール画面より「ランタイム管理設定を編集」を押下します。
・ランタイムバージョンの更新を「手動」に設定し、先ほどのCloudWatchから確認できたランタイムバージョンARNを記載します。
これで以前まで動いていたランタイムバージョンが使えるようになり、コードのエラーも出なくなりました。
まとめ
LangChain周りのパッケージはバージョンの相互依存が結構しつこいイメージでしたが、今回もそれに振り回された感じですね。
ランタイムバージョンの手動管理はセキュリティの面では推奨されないので、また時期見て調整は必要ですのでお気をつけください。