2023年3月、langchain-practice で LangChain を Python から触った。OpenAI API を直叩きするのにも慣れてきたので、もう一段抽象度の高いやつを試したくなった回。

試したこと

Flask で薄い API を立てて、/chat に POST されたメッセージを LangChain 経由で OpenAI に投げる、という構成。

from flask import Flask, request
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain

app = Flask(__name__)

@app.route('/chat', methods=['POST'])
def chat_post():
    message = request.get_json()['message']
    res = chatCompletions(message)
    ...
  • ChatOpenAI でモデルを包む
  • PromptTemplate / LLMChain でプロンプトの組み立て
  • SystemMessage / HumanMessage / AIMessage のロール分け

最後に Dockerfile と docker-compose も足して、docker compose up で動くようにした。コミットは initlangchainからopenaiのapiをたたくDocker化 の3つ。1日でここまで、という勢い。

ハマったところ

API 直叩きより書く量は減るんだけど、中で何が起きているか追いづらいのが最初の戸惑いだった。プロンプトがどう組み立てられて、どのメッセージで投げられているのか、ライブラリの内側に隠れる。便利な反面、デバッグは直叩きの方が楽だな、と感じた。

学び

2023年時点の LangChain は、プロトタイプを速く立てるには便利。ただ本番に入れる前に「何を LangChain に任せて、何を自分で持つか」を決めないと、後で剥がしづらくなりそうだった。

このときの「抽象に全部預けると追えなくなる」感覚が、のちに AI エージェントを役割ごとに分割する設計を考えるときの原体験になった。今なら、薄く自前で持つ部分を多めにする気がする。