虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

LangServe で LLM アプリを楽々開発しよう!

本記事は虎の穴ラボ2024年夏の連載ブログ 6 日目の記事です。

次回は古賀さんによる「Vercel公式のNext.js向けのChatbotテンプレートを試してみた!」が投稿される予定です。

ご期待ください!

本記事のテーマは「LangServe で LLM アプリを楽々開発しよう!」です!

OGP
OGP

1. 導入

こんにちは。

虎の穴ラボ株式会社のiwadyです。

開発者の皆さん、Pythonしてますか?(二度目)

執筆時点(2024/6/13現在)で、Pythonの機械学習界隈でメジャーなパッケージのバージョンアップ・リリース告知が多数あり、胸熱な感じです。

例えば、あの Numpy が 2006 年以降で初のメジャーバージョンアップ(2.0.0)を直近に控えていますし、先月も LangChain が v0.1 から v0.2 へのバージョンアップによりコアパッケージとコミュニティパッケージが分離され、コミュニティの声をより反映した形へと進化を遂げています。

本日は、執筆時点(2024/6/13現在)の latest である LangChain v0.2.3 と LangServe v0.2.2 を使って、LLM を利用したアプリケーションを実装してみようかと思います。

2. 実行環境

筆者の実行環境は以下になります。

デバイス : MacBookPro(M2)

macOS : Ventura13.6.7

メモリ : 32GB

3. LangChain の紹介

LangChain は自然言語処理(NLP)タスクをお手軽に実装・統合できるフレームワークです。

github.com

チャットボットの構築、テキスト生成、ドキュメント解析など多様な領域で利用可能で、複雑な LLM を使ったアプリケーションの開発が容易になります。

2024/5 に v0.1 から v0.2 へとアップデートが行われ、公式から破壊的変更や移行の案内がありました。移行の詳細についてはこちらをご参照ください。

4. LangServe の紹介

LangServe は、その名の通り LLM アプリが簡単にサーブできるライブラリです。

github.com

チェインを利用した FastAPI との連携はシンプルで分かりやすく構築が容易です。

開発が LangChain なので LangChain の他のモジュールとの親和性も高く、目的に応じて関連モジュールを簡単に追加できます。

5. 実装

インストール

今回はプロジェクト管理ツール hatch を使って、構築してみたいと思います。

まずは、以下のコマンドでプロジェクトを作成します。

#tora_langserve_sample という名前でプロジェクト作成
hatch new tora_langserve_sample

hatch は pip install や poetry add に相当するパッケージ追加コマンドはありませんので、pyproject.toml の project > dependencies に手動で追加していきます。

[project]
name = "tora_langserve_sample"
requires-python = ">=3.10"
dependencies = [
# (省略)
"langchain>=0.2.3",
"langchain-openai",
"langserve[all]>=0.2.2",
"pydantic==1.10.13",
]

ここで、データバリデーションツール pydantic に 1 系を指定しているのは、 執筆時時点で LangServe の依存関係にある FastAPI が pydantic 2 系に完全に対応していないために、hatch が同期する際にエラーが発生するためです。

実装

以下がシンプルな LangServe の実装になります。

入力した日本語を指定した言語に翻訳するアプリです。

OpenAI の API キーは、OpenAI にてアカウント登録を行い、予め取得しておきます。

# main.py 

import getpass
import os
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langserve import add_routes
import uvicorn

# OpenAI の API キーを入力
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI の API キーを入力してください: ")

def main():
    # モデルを作成
    model = ChatOpenAI(model="gpt-4o")
    # プロンプトテンプレート作成
    prompt_template = ChatPromptTemplate.from_messages(
        [("system", "次の日本語を{language}へ翻訳してください:"), ("user", "{text}")]
    )
    # パーサーを作成
    parser = StrOutputParser()
    # チェインを作成
    chain = prompt_template | model | parser
    # サーバー作成
    app = FastAPI(
        title="LangServe Sample API Server",
        version="1.0.0",
        description="This is a sample Server",
    )
    # LangServe で chain と app を連携
    add_routes(
        app,
        chain,
        path="/chain",
    )
    serve(app)

def serve(app):
    uvicorn.run(app, host="localhost", port=8000)

if __name__ == "__main__":
    main()

ポイントは次の 3 点になります。

1. モデルを指定する

今回は、OpenAI の gpt-4o を指定しています。Claude の場合は、langchain_anthropic モジュールを利用する形になります。利用するモデルに応じてモジュールを変更してください。

2. チェインを作成する

チェインとは複数のタスクやモデルを連結して一連の処理を行う事を指します。チェインにより複雑なパイプラインを簡単に構築・実行することができます。

3. 作成したチェインを LangServe を用いて FastAPI と連携する

Chain を LangServe で FastAPI と連携します。uvicorn は ASGI 準拠の WebServer で、本アプリをサービングしています。

起動

以下のコマンドでアプリケーションを起動できます。

hatch run python -m main

結果

LangServe は、API ドキュメントである OpenAPI とアプリ機能を GUI でお試しできる Playground をデフォルトで提供していて、非常に有用です。

下記は本アプリの OpenAPI の画面になります。

LangServeのOpenAPI画面
LangServeのOpenAPI画面

下記は本アプリの Playground になります。分かりやすくて便利ですね。

LangServeのPlayground画面
LangServeのPlayground画面

それでは、API にアクセスしてみます。

以下は POST /invoke に対してリクエストボディの入力 (input) に日本語から翻訳したい言語 (language) と翻訳してほしい文章 (text) を指定しています。

# API にアクセス
curl -X 'POST' \
  'http://localhost:8000/chain/invoke' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "input": {
    "language": "フランス語",
    "text": "私の名前はiwadyです。"
  },
  "config": {},
  "kwargs": {}
}'

実行結果は以下になります。

レスポンスの output に翻訳されたテキストが格納されているのが分かりますね。

{"output":"Je m'appelle iwady.","metadata":{"run_id":"1f3a0b05-6372-4b43-9c3d-ed15f2dd383b","feedback_tokens":[]}}%

6. まとめ

本記事では、LLM を利用したアプリケーションをさくっと構築できる LangServe を使った実装例を紹介しました。

執筆時点ではバージョンこそ 0.2.2 ですが、FastAPI など優れた WAF をベースに簡単に LLM アプリを提供でき、LLM アプリの DevOps プラットフォームの LangSmith とも親和性が高いため、DevOps の要件にも依りますが本番運用も可能かもしれません。

また、今回は触れませんでしたが、マルチエージェント AI の構築を行う LangGraph もあります。

LangChain 関連モジュールとプラットフォーム は、これからもっと注目されるかと思いますので、要チェックですね。

採用情報

虎の穴では一緒に働く仲間を募集中です!

この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。

カジュアル面談やエンジニア向けイベントも随時開催中です。ぜひチェックしてみてください。 toranoana-lab.co.jp