山羊の午後

研究関係の備忘録。

バックエンド実装と周辺知識のお勉強

https://yaginogogo.hatenablog.jp/entry/2025/07/08/061503

3日目はバックエンドの実装。
バックエンドは経験のあるPythonなので、書こうと思えば書けるけど、企画の趣旨に従って生成AIに出力させる。
作ろうとしているのは、2日目に作ったフロント側でユーザーが入力した情報を受け取り、その内容をOpenAI APIに送って小説を書かせる、という処理になる。
自分で書けるなーと思いながら、LangChainの最新ドキュメントを参照しながらOpenAI APIをコールする関数を書かせる。LangChainは仕様がころころ変わるので、Web検索機能をつかって最新のドキュメントを参照するように指示しないと古い書き方を引っ張ってきてしまい詰む。(これは人間もそう。。。)
MVPではバックエンドでやる処理はこれひとつなので、さくっと出力して完成。

from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from backend.models import GenerateRequest
from backend.generate_service import generate_novel
import logging
logging.basicConfig(level=logging.INFO)
from dotenv import load_dotenv
import os

load_dotenv()  # .envファイル読み込み

allowed_origins = os.getenv("ALLOWED_ORIGINS", "")
origins = [origin.strip() for origin in allowed_origins.split(",") if origin.strip()]


app = FastAPI()

# CORS設定(Reactとの接続用)
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # フロントのReactのURL
    allow_credentials= False, #True, #
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.post("/generate")
async def generate(request: GenerateRequest):
    logging.info(f"リクエスト受信: {request}")
    try:
        result = await generate_novel(request)
        return {"result": result}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))



@app.get("/")
def read_root():
    return {"Hello": "World"}


出してもらったコードの挙動を確認しながら、APIとは何か、HTTPリクエストとは何か、と言う様な基礎的なことを質問して教えてもらう。
そのままCORSの設定についても教えてもらう。
気になるところを順序関係なく深掘りして聞けるのは生成AIラーニングのいいところだなぁ。

さらにFastAPIの公式のドキュメントを読んでAPIについて概要をみる。
FastAPI
読みながらGETとPOSTって本質的になにが違うの、ということが解らなくなりGPTに聞いて整理する。
ChatGPTの説明は読めばわかるのだけれど、本質的な部分がふわふわしているのでさらにWebで適当な記事を探して読み込む。
なんとなく納得できたところで今日はここまで。

新しい知識をこういうこと?とChatGPT相手に壁打ちしながら理解を進めるのは思った以上に効率的だな、という実感。
ついでに思いついたことをその場でコードにつけたさせて試せるのも楽しい。

バックエンドの実装が終わったので、明日はフロントとバックを連動させて動かそう。