ブラウザ上でローカルLLMと対話したい#4|対話履歴の追加

0 アクセス

はじめに

この記事はブラウザ上でローカルLLMと対話したい#3|HTTPリクエストの続き

前回、Ollamaにリクエストを送信して、その返答を表示できるようになった
しかし、対話履歴は保存されておらず、メッセージを送信するごとに新しい会話が始められたことになってしまうという問題が生じていた

このように、話題をすぐに忘れてしまう感じ

今回は、対話履歴ごと送信する機能を追加する

対話履歴の管理

対話履歴は配列(リスト)で管理する
下記はその例

[{role: "user", content: "こんにちは"}, {role: "assistant", content: "こんにちは。何かお手伝いできることはありますか?"}]
role発話者
今回はuser(ユーザ側)とassistant(LLM側)を用いる(他にはsystemを用いる場合もある)
content発話内容

メッセージを追加するには、push()メソッドを用いる
(dialogueは配列)

// dialogueに送信メッセージを追加
dialogue.push({ role: "user", content: message});

ソースコード

改良したjavascriptプログラム全体を示す
前回から変わったのはdialogueが増えた部分のみ

async function chat(dialogue) {
    const url = 'http://127.0.0.1:11434/api/chat';

    const data = {
        model: "Llama-3.1-Swallow-8B-Instruct-v0.2_Q4_K_M",
        messages: dialogue,
        stream: false
    };
    console.log(data)

    // 非同期なHTTPリクエストを送信
    const response = await fetch(url, {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(data)
    });

    const result = await response.json();
    return result.message;

}

const inputMsg = document.getElementById('inputmsg');
const sendBtn = document.getElementById('send');
const messagesDiv = document.getElementById('messages');

// 対話履歴を保持する配列
const dialogue = [];

sendBtn.addEventListener('click', async () => {
    const message = inputMsg.value.trim();
    
    // messagesに送信メッセージを追加
    const userMessageEl = document.createElement('div');
    userMessageEl.textContent = message;
    messagesDiv.appendChild(userMessageEl);

    // dialogueに送信メッセージを追加
    dialogue.push({ role: "user", content: message});

    // 入力をクリア
    inputMsg.value = '';

    // messagesに返信メッセージを追加
    // chat関数が完了するまで待つ
    const result = await chat(dialogue);
    
    const systemMessageEl = document.createElement('div');
    systemMessageEl.textContent = result.content;
    messagesDiv.appendChild(systemMessageEl);

    // dialogueに返信メッセージを追加
    dialogue.push({ role: "assistant", content: message});

});

実行結果例

5行目の「おすすめは何?」というメッセージに対して、ラーメンの話題を継続できていることがわかる

おわりに

このままでは、対話履歴をずっと追加していくことになる。
対話が長くなる場合は、古いメッセージから削除するなどの工夫が必要そう。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です