0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLM開発のPydanticエラーを修正する

Posted at

こんにちは!
株式会社Parksでインターンをしている乾と申します。
普段はデータサイエンスを学んでいる大学2年生です。
本記事では、以前の記事で修正したPydanticのエラー修正について書いた後、LLMの開発中にPydanticを利用する時の注意点などについても記載しようとおもいます。

Pydanticについて

Pydanticは、データが設定した形式どうりになっているかを簡単に確認できたり、データをJSON、YAML、またはその他の形式に変換することができるライブラリです。

主な機能3つ

・ データバリデーション

データの型、必須フィールド、値の範囲、正規表現パターンなどの制約を定義でき、無効なデータが処理されることを防ぐことができます。

・ シリアライゼーション

データオブジェクトをJSONやその他の形式に変換するためのメソッドを提供し、簡単にデータを外部システムと交換したり、APIレスポンスとして返したりすることできます。

・ デシリアライゼーション

JSON、辞書、またはその他の形式からデータオブジェクトを作成することもでき、外部から受け取ったデータを簡単に解析し、バリデーションすることができます。

Pydanticの使い方

使い方については既に沢山の記事がかかれているので、ここでは簡単に記述します。
Pydanticを使用するには、まずBaseModelクラスを継承して新しいデータモデルを定義します。以下は、シンプルなモデルの例です。

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str
    age: int

このモデルでは、idnameemailageの4つのフィールドを定義し、それぞれのフィールドに期待するデータ型を指定しています。
データバリデーションは、モデルのインスタンスを作成する際に自動的に行われます。

user_data = {
    "id": 1,
    "name": "John Doe",
    "email": "john@example.com",
    "age": 30
}

user = User(**user_data)

シリアライゼーションとデシリアライゼーションは、dict()メソッドとparse_obj()メソッドを使用して行います。

# シリアライゼーション
user_dict = user.dict()

# デシリアライゼーション
user_obj = User.parse_obj(user_dict)

このような使い方により、Pythonでデータバリデーションとシリアライゼーションを直感的に行うことができます。

Pydanticの主なエラーと読み方

・ValidationError(バリデーションエラー)
エラーメッセージ例:
pydantic.error_wrappers.ValidationError: 1 validation error
原因:モデルのバリデーションが失敗した
修正:エラーメッセージに表示された失敗したフィールドとその値を確認し、モデルの定義に従って値を修正してください。
・MissingError(欠損エラー)
エラーメッセージ例:
pydantic.error_wrappers.ValidationError: field required (type=value_error.missing)
原因:必須フィールドが欠損している
修正:エラーメッセージに表示された欠損しているフィールド名を確認し、必要な値を入力してください。
・AssertionError(アサーションエラー)
エラーメッセージ例:
pydantic.error_wrappers.ValidationError: assertion failed
原因:カスタムバリデーションの際にアサーションが失敗した
修正:エラーメッセージに表示された失敗したアサーションを確認し、バリデーションロジックを修正してください。
・AnnotationError(アノテーションエラー)
エラーメッセージ例:
pydantic.errors.PydanticUserError:A non-annotated attribute was detected
原因:モデルの属性に型アノテーションが設定されていない
修正:型アノテーションが設定されていない属性に適切な型アノテーションを追加する。
このあたりがPydanticを利用していてよく遭遇するエラーです。

実際にコードを修正する

例えば、以前の記事で利用したリポジトリでは、データバリデーションがされておらず、アノテーションエラーが多く発生してしまいました。

以下に実際に修正した例をいくつか示します。

変更前
bidding_history = defaultdict(list)
変更後
bidding_history: DefaultDict[str, List[str]] = defaultdict(list)

・DefaultDictを利用して、変数にキーと値の型を指定する。

変更前
openai_cost = 0
変更後
openai_cost: int = 0

・型アノテーションとしてintを指定し、openai_costが整数型であることを明示する。

変更前
if num_bid == 0:
変更後
if isinstance(num_bid, int) and num_bid == 0:

・isinstance()を使用して、num_bidが整数型であることをチェックしつつプログラムを動作させる。

補足

この件についてissueを送ってみたところ反応があったため、そのうちリポジトリが修正させるかもしれません。
スクリーンショット 2024-04-29 16.16.58.png

LLMとPydanticの組み合わせ

Pydanticを用いることによって、可読性と保守性を向上させることが出来ます。
LLM開発時には、無効なデータの検出したり、LLMの入力や出力データをAPIを介して送受信する際に、データの変換を簡略化したり、モデルの変更や拡張が必要な場合、Pydanticのモデル定義を更新するだけで済む。などのメリットもあります。
管理のしやすいコードや、人に読ませるコードを作成することは簡単には出来ないので、このようなライブラリを利用することで、公開のしやすいコードになったり、今後の開発が効率的に行えるようになります。

参考文献

pydantic公式

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?