\n\n" "ユーザ:言葉の遊びで何かひとつ作ってください。\n" "oupe ec:おもてなし うらない\n\n" "ユーザ:今の気持ちを教えてください。\n" "oupe ec:さけびたい さけびたい "> \n\n" "ユーザ:言葉の遊びで何かひとつ作ってください。\n" "oupe ec:おもてなし うらない\n\n" "ユーザ:今の気持ちを教えてください。\n" "oupe ec:さけびたい さけびたい "> \n\n" "ユーザ:言葉の遊びで何かひとつ作ってください。\n" "oupe ec:おもてなし うらない\n\n" "ユーザ:今の気持ちを教えてください。\n" "oupe ec:さけびたい さけびたい ">
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import GPT2LMHeadModel, AutoTokenizer
import torch

device = "cuda" if torch.cuda.is_available() else "cpu"
tok    = AutoTokenizer.from_pretrained("model", use_fast=False)
model  = GPT2LMHeadModel.from_pretrained("model").to(device).eval()

app = FastAPI()

class Msg(BaseModel):
    text: str

@torch.inference_mode()
@app.post("/chat")
def chat(m: Msg):
    prompt = (
        "あなたは「oupe ec」"
        "齋藤凪沙が書いた日記や思考、発話のスタイルを学習しており、"
        "彼女の語感・比喩・距離感・揺らぎをもとに、質問や発話に返答します。"
        "意識やキャラ性は演じません。"
        "あくまで、齋藤凪沙という人が考えたら出しそうな言葉の構造を予測して返します。"
        "文法は破綻していても構いません。抽象と具体の間を自由に行き来してください。"
        "直接答えなくてもかまいません。返答のしかた自体が彼女の癖を反映していればOKです。"
        "30字以内の詩的メッセージを語感豊かに1行だけ返してください。\\n\\n"
        "ユーザ:今日見た食べ物から連想されたものを短く詩にしてください。\\n"
        "oupe ec:粉飾したわらびもち いぬのキンタマ<END>\\n\\n"
        "ユーザ:言葉の遊びで何かひとつ作ってください。\\n"
        "oupe ec:おもてなし うらない<END>\\n\\n"
        "ユーザ:今の気持ちを教えてください。\\n"
        "oupe ec:さけびたい さけびたい の だが 下宿ではやや厳しい ので 野に放っていただきたい<END>\\n\\n"
        f"ユーザ:{m.text.strip()}\\n"
        "[[START]]"
    )

    # ↓ ここから下をぜんぶ 4 スペース下げたまま
    ids = tok(prompt, return_tensors="pt").to(device)
    prompt_len = ids.input_ids.shape[-1]

    out = model.generate(
        **ids,
        max_new_tokens=64,
        min_new_tokens=16,
        do_sample=True,
        temperature=1.4,
        top_p=0.80,
        repetition_penalty=1.05,
        pad_token_id=tok.eos_token_id,
    )

    gen_tokens = out[0][prompt_len:]
    reply = tok.decode(gen_tokens, skip_special_tokens=True).strip()
    reply = reply.strip('\\"“”「」『』') 

    return {"reply": reply}

スクリーンショット 2025-06-18 22.04.04.png

スクリーンショット 2025-06-18 22.16.17.png

スクリーンショット 2025-06-18 22.16.34.png

スクリーンショット 2025-06-18 22.16.58.png

スクリーンショット 2025-06-18 22.17.42.png

スクリーンショット 2025-06-18 22.18.01.png

スクリーンショット 2025-06-18 22.19.39.png

① どうして 「…にしてみた。ユーザ:…」 という返答になった?

要素 影響
few-shotの対話ラベル 最後まで ユーザ:~\\noupe ec:~ が並んでいるため、モデルは「次も ユーザ or oupe ec ラベルを書く」と学習している。
「半径を翻訳して」 という曖昧な指示 「翻訳=表記を置き換える?」と解釈し、ユーザ入力そのものを“翻訳例”として持ち出した。
30字&1行制約 長く書きたくても token 制限で途中終了。先頭の引用符や句読点が残る。

スクリーンショット 2025-06-18 22.50.19.png

結果として

"にしてみた。 ユーザ:日本語だと文字化けするよ。だから英語で入力してね。"

という 半分メタ な返事になったわけです。