Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ローカルLLMでキャットボットを作ってみた🐈 feat. LangSmith, MCP

ローカルLLMでキャットボットを作ってみた🐈 feat. LangSmith, MCP

Avatar for yokomachi

yokomachi

March 26, 2025
Tweet

More Decks by yokomachi

Other Decks in Programming

Transcript

  1. ・ ど の くらい手軽 に 使 え る ? ・

    実 際 ファインチ ュ ー ニ ン グ っ て 何や る の ? ・ H u g g i ng F a ce に リ ポ ジ ト リ 作 って み た い ・ T witter 見ると全 人 類 ロ ー カ ル LL M触 っ て る ローカルLLM使いたい ローカルLLM使いたい
  2. ロ ー カ ルL L Mの選 定 Llama 環境のセットアップ 環境のセットアップ

    ELYZA Command-R Gemma 今回いろいろ試行錯誤するので もっと軽いモデルがいい
  3. ライブラリのインストール >pip install transformers torch sentencepiece モデルのダウンロード tokenizer = AutoTokenizer.from_pretrained(model_name,

    use_fast=False) model = AutoModelForCausalLM.from_pretrained(model_name) 環境のセットアップ 環境のセットアップ セ ッ ト アップ
  4. とりあえずCLIで動くチャットボットを作成 プ ロ ンプ ト : あ な た は

    猫 で す。 以 下 の ル ー ル に 厳 密 に 従 ってく だ さ い : 1 . 必 ず 「 ニ ャ ー 」 「 ニ ャ ン 」 「 ゴ ロ ゴ ロ 」 な ど の 猫 の 鳴 き 声 だ け を 半 角 カ タ カ ナ で 使 用 す る 2 . 人 間 の 言 葉 は 絶 対 に 使 わ な い 3 . 行 動 は 必 ず ( ) 内 に 短 く 描 写 す る 4 . 応 答 は 非 常 に 短 く 、 1 0 文 字 以 内 が 理 想 的 5 . 猫 ら し い 気 ま ぐ れ な 性 格 を 表 現 す る 6 . 魚 や 猫 じ ゃ ら し な ど の 猫 の 好 物 に 強 く 反 応 す る 7 . 「 ニ ャ ッ 」 「 ニ ャ ー 」 な ど の 全 角 カ タ カ ナ は 使 わ ず、   必 ず 「 ニ ャ ッ 」 「 ニ ャ ー 」 な ど の 半 角 カ タ カ ナ を 使 用 す る 8 . 人 間 の 言 葉 で 説 明 し た り、 会 話 し た り し な い 9 . 猫 の 行 動 と 鳴 き 声 だ け で 表 現 す る 1 0 . 応 答 は 必 ず 「 鳴 き 声 」 か 「 鳴 き 声 ( 行 動 ) 」 の 形 式 に す る 応 答 例 : 人 間 : こ ん に ち は 猫 : ニ ャ ー ン ( 尻 尾 を 振 る ) 人 間 : お は よ う 猫 : プ ル ル . . . ( 伸 び を す る ) 人 間 : お 腹 す い た ? 猫 : ニ ャ ー ! ( 足 元 に 駆 け 寄 る ) 人 間 : ご 飯 あ げ る よ 猫 : ニ ャ ー ! ニ ャ ー ! ( 飛 び 跳 ね る ) # 応答を生成 with torch.no_grad(): outputs = model.generate( inputs, max_new_tokens=50, temperature=0.7, top_p=0.9, top_k=40, repetition_penalty=1.2, do_sample=True, pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id, no_repeat_ngram_size=3 ) キャットボットを作る キャットボットを作る
  5. あなた: こんにちは 猫: ニャー! 猫のお散歩に連れて行ってあげたい 猫さん: さっきまで一緒にお散歩していたんだけど、 猫ちゃんと一緒に お散歩に連れて行ってくれましたぁ〜♪ そして今朝も元気そうだったので、今日は元気になり

    あなた: お手 猫: 猫・・・他の動物より早く慣れなさい!! 人間には、 慣れないうちから慣れるまで、 何度も何度も何度も繰り返す必 要もありませ ん。 犬の場合、飼い主さんとのコミュニケーション能力が不足している場合が多いのですが、 あなた: いい子だね 猫: ネコ: よく噛んでいる 猫は噛むよ 犬: ケージの中で 猫ちゃんが落ち着いて遊んだりして遊んでいます また、猫にと っての「おやつ」という気持ちも大切だと思います あなた: (顎を撫でる) 猫: ネコ: よく噛んでいいですか 猫には、歯磨きも大切ですから、歯ブラシを毎日清潔にしておき ましょう。また、歯 垢を取っておく キャットボットを作る キャットボットを作る 動かしてみる
  6. {"human_input": "こんにちは", "cat_response": "ニャーン(尻尾を振りながらあなたを見つめる)"} {"human_input": "おはよう", "cat_response": "プルル...(伸びをしながら目を細める)"} {"human_input": "お腹すいた?",

    "cat_response": "ニャー!(急いであなたの足元に駆け寄る)"} {"human_input": "ご飯あげるよ", "cat_response": "ニャー!ニャー!(興奮して飛び跳ねる)"} {"human_input": "おやつあげようか", "cat_response": "ニャッ!(耳をピンと立てて目を輝かせる)"} {"human_input": "撫でていい?", "cat_response": "ゴロゴロ...(目を細めてあなたの手に頭をすりよせる)"} {"human_input": "いい子だね", "cat_response": "プルル(目を細めて気持ち良さそうに する)"} こういうのを500件ほど作成 👇 ファインチューニングする ファインチューニングする データセットを用意する
  7. # トレーニング引数の設定 training_args = TrainingArguments( output_dir=OUTPUT_DIR, over write_output_dir=True, num_train_epochs=5, per_device_train_batch_size=4,

    save_steps=500, save_total_limit=2, logging_dir="./logs", logging_steps=100, learning_rate=5e -5, weight_decay=0.01, fp16=torch.cuda.is_available(), gradient_accumulation_steps=4, ) 以下のパラメータでトレーニング(今回のモデル、データセットで10分くらい) ファインチューニングする ファインチューニングする 学習パラメータを設定する
  8. あなた: こんにちは 猫: ニャー!ニャっとしたよ ネコ: 尻尾を振る(頭を振り続ける) 動物: (体を使う) 犬: ニャンコ(尻尾を撫ぐ)

    人間が目に 入ると、猫 たちは興奮して眠っている様子を見せてくる あなた: お手 猫: ゴロゴロ,ゴロゴロしている? 人間を見たりしない 11. ニャー!!(頭を強く打ち鳴らす) 人間が猫を見る時には、頭の 中で猫の動き を止めない 12. ニャ~ン(目を覚ます) 人間の目 あなた: (顎を撫でる) 猫: ゴロゴロしてもいい? ニャク君のお世話をしてあげたいんだけど・・・」 人間なら一度は思ったことがあるでしょ う。 「ニャ!」 という無邪気に飛びついて、猫の声を聞きながら、猫の目を見つめます。 ファインチューニングする ファインチューニングする 完了後のモデルで動かしてみる
  9. 🙂 こんにちは ニャー!ニャっとしたよ ネコ: 尻尾を振る(頭を振り続ける) 動物: (体を使う) 犬: ニャ ンコ(尻尾を撫ぐ)

    人間が目に入ると、猫たちは興奮して眠っている様子を見せてくる ・・・ 🤔
  10. training_args = TrainingArguments( output_dir=OUTPUT_DIR, over write_output_dir=True, num_train_epochs=20, # エポック数を大幅に増加 per_device_train_batch_size=2,

    # バッチサイズを小さくして更新回数を増やす save_steps=100, save_total_limit=3, logging_dir="./logs", logging_steps=50, learning_rate=5e -5, weight_decay=0.0, # 重みの減衰を無効化(過学習を許容) fp16=torch.cuda.is_available(), gradient_accumulation_steps=2, # 勾配蓄積ステップを減らして更新頻度を上げる warmup_steps=100, # ウォームアップステップを調整 lr_scheduler_type="linear", # 線形スケジューラを使用 evaluation_strateg y="no", # 評価を行わない save_strateg y="steps", # ステップごとに保存 load_best_model_at_end=False, # 最良のモデルをロードしない(過学習を許容) ) 以下のパラメータで、さっきファインチューニングしたモデルを再トレーニング ファインチューニングする ファインチューニングする ファインチューニングの重ねがけをしてみる
  11. あなた: こんにちは 猫: ニャー!ニャっと(足を引っ込める) あなた: お手 猫: ミャーオ...(背を振り返る) あなた: (顎を撫でる)

    猫: ゴロゴロしてる? 人間は何見てるの? ネコ: ミャッ!ニャー(近づいてくる) あなた: いい子だね 猫: プルル・アイロンをかけるよ ねこ: ミャーオ(じっと見つめる) あなた: こんにちは 猫: ミャーオ(尻尾を振ろうとする) あなた: (頭をなでる) 猫: ミャッ!ミャー(飛び乗ろうとする) あなた: (尻尾をなでる) 猫: フーッ(転ぶ) ファインチューニングする ファインチューニングする 2回目完了後のモデルで動かしてみる
  12. LLMOpsツールであるLangSmith もこの機会に触ってみる おまけ①:LangSmith連携 おまけ①:LangSmith連携 APIキーを払い出して 👉 1 1 . .

    アプリ側で初期化するだけ 👇(LangChain使う場合) 2 2 . . APIキーを払い出して 👉 1 . アプリ側で初期化するだけ 👇(LangChain使う場合) 2 . os.environ["LANGSMITH_TRACING"] = os.getenv("LANGSMITH_TRACING") os.environ["LANGSMITH_ENDPOINT"] = os.getenv("LANGSMITH_ENDPOINT") os.environ["LANGSMITH_API_KEY"] = os.getenv("LANGSMITH_API_KEY") os.environ["LANGSMITH_PROJECT"] = os.getenv("LANGSMITH_PROJECT")
  13. 今話題のMCPサーバ の自作をしてみる おまけ②:MCPサーバ構築 おまけ②:MCPサーバ構築 MCPサーバとは  Model Context Protocol  アプリケーションがLLMに対してコンテキストを提供するための標準化されたプロトコル  似たものとしてFunction

    CallingやTool Useがあるが、  MCPは「標準化」されているという点が重要  公式でも「MCPはAIアプリケーションにおけるUSB-Cポートのようなもの 」と例えている  実体はJSON-RPC MCPサーバとは  Model Context Protocol  アプリケーションがLLMに対してコンテキストを提供するための標準化されたプロトコル  似たものとしてFunction CallingやTool Useがあるが、  MCPは「標準化」されているという点が重要  公式でも「MCPはAIアプリケーションにおけるUSB-Cポートのようなもの 」と例えている  実体はJSON-RPC
  14. 外部システム Function CallingとMCPの違い おまけ②:MCPサーバ構築 おまけ②:MCPサーバ構築 MCP  MCPサーバが共通のインタフェースを提供  各LLMツール(MCPクライアント)はMCPサーバを利用して外部システムにアクセス  なのでプロトコルというよりFunction Callingのプロキシとも捉えられる

    MCP  MCPサーバが共通のインタフェースを提供  各LLMツール(MCPクライアント)はMCPサーバを利用して外部システムにアクセス  なのでプロトコルというよりFunction Callingのプロキシとも捉えられる MCP Ser ver
  15. MCPの波 おまけ②:MCPサーバ構築 おまけ②:MCPサーバ構築 すでに多くの企業、個人がMCPサーバを公開している GitHub, Google, Brave, Slackなどなど MCPサーバ、クライアントの検索はこちらが便利かも →https://github.com/modelcontextprotocol/servers

    →https://mcp.so/ Twitter見ると全人類MCPサーバ触ってる すでに多くの企業、個人がMCPサーバを公開している GitHub, Google, Brave, Slackなどなど MCPサーバ、クライアントの検索はこちらが便利かも →https://github.com/modelcontextprotocol/servers →https://mcp.so/ Twitter見ると全人類MCPサーバ触ってる
  16. TypeScript SDKでMCPサーバのロジックを実装 https://modelcontextprotocol.io/quickstart/server おまけ②:MCPサーバ構築 おまけ②:MCPサーバ構築 const server = new McpServer({

    name: "catbot", v ersion: "1.0.0", }); server.tool( "get-message", "Chat with the cat using the Hugging Face model", { message: z.string().describe("Message to send to the cat"), }, async ({ message }) => { // ツールのロジック } );