L@eb bmX K"Y^ҚTy"a"*z0uN(x`X@\NRyԣ)JHjVI <~:,(ƪנO`rh s0Ybid,ddates2023-11-25T23:55:00etitlex`8GB RTX3060TiでOK、PythonでローカルLLMのCORS対応APIサーバー&JSクライアントdtagso#AI #python #jscurlxhttps://fukuno.jig.jp/4140dbodyyq LLM、大規模言語モデルを使った文章生成系AIは大掛かりなコンピューターが必要ですが、VRAMが8GBと比較的コンパクトなGPUでもそこそこ動作するモノもあります!
rinna、Llama 2の日本語継続事前学習モデル「Youri 7B」を公開|rinna株式会社

Meta社が2023年7月に公開した大規模言語モデル「Llama 2」をベースに日本語に特化させ学習させた「Youri 7B」が登場。

PythonのWebフレームワークFlaskを使ってAPIサーバーにして、JavaScriptから簡単に使えるようにしました。 import { llm } from "./llm.js"; const prompt = `ユーザー: 神はいますか?\nシステム: `; const res = await llm(prompt); console.log(res); 回答が数秒で、短い回答だと1秒程度で返ってきます。

それは素晴らしい質問です。神は存在するという考え方をする人もいれば、神は存在しないという考え方をする人もいます。私は、これらの考え方を説明し、どちらが正しいかを考えることができます。

API使用料や使用制限を気にせず使えるのはステキ!

先日購入したGPU、VRAMが8GBのNVIDIA RTX 3060Ti on Windows 10。Pythonが入った環境で、下記のコマンドで「rinna/youri-7b-gptq」をダウンロード。(参考、rinnaの新AI「youri-7b-chat-gptq」の魅力 | ジコログ

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/


「llm_server」

llm_serverをcloneして、サーバーを起動。

py llm_server.py 5050

APIサーバーのコード llm_server.py はこのようにシンプル!
(with プロンプトから回答生成する generate_reply

import sys from flask import Flask, request from generate_reply import generate_reply port = 5050 if len(sys.argv) &gt; 1: port = sys.argv[1] app = Flask(__name__) @app.after_request def after_request(response): response.headers.add('Access-Control-Allow-Origin', '*') return response @app.route('/', methods=['GET']) def get(): prompt = request.args.get('p') reply = generate_reply(prompt) return reply if __name__ == '__main__': app.run(debug=False, host='::', port=port)

あとはこのホストとポート番号に対してリクエストを送ればOK!

http://[::]:5050/?p=who


「llm_client」

JavaScriptによるクライアントAPI ESモジュール llm.js を作成。冒頭のサンプルのように、promptを投げて、返答を受け取れます。(importを使って、endpoint.jsを使って任意のホスト&ポートをエンドポイントとして設定できるようにしてあります)

簡単なWebアプリにしてみました。

HTML1つで1問1答するWebアプリの例です。 &lt;h1&gt;llm_client for llm_server&lt;/h1&gt; &lt;input id="comment" type="text" size=50&gt;&lt;button id="btn"&gt;send&lt;/button&gt; &lt;div id="response"&gt;&lt;/div&gt; &lt;hr&gt; &lt;a href=http://github.com/code4fukui/llm_client&gt;src on GitHub&lt;/a&gt;&lt;br&gt; &lt;script type="module"&gt; import { llm } from "./llm.js"; const add = (p, s) =&gt; { const div = document.createElement("div"); div.textContent = p + ": " + s; response.appendChild(div); }; btn.onclick = async () =&gt; { const s = comment.value; comment.value = ""; const prompt = `ユーザー: ${s}\nシステム: `; add("ユーザー", s); const text = await llm(prompt); add("システム", text); }; &lt;/script&gt;

有料APIと違って、気軽に使い放題なのはうれしい!
cimgxGhttps://img.sabae.cc/data/2060/8c913600-2986-451f-b1f7-fa9ac30cda50.jpg