Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ollamaを使ったLocal Language Model活用法
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
masa-ita
November 23, 2024
Technology
220
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ollamaを使ったLocal Language Model活用法
masa-ita
November 23, 2024
More Decks by masa-ita
See All by masa-ita
Run Instant NeRF on Docker
itagakim
1
2.3k
3D Clustering and Metric Learning
itagakim
0
400
Cloud TPUの使い方〜BigBirdの日本語学習済みモデルを作る〜
itagakim
0
740
多言語学習済みモデルmT5とは?
itagakim
1
780
AWSのGPUを安く使ってTensorFlowモデルを訓練する方法
itagakim
0
410
最近の自然言語処理モデルの動向
itagakim
1
590
ディープラーニングで芸術はできるか?〜生成系ネットワークの進展〜
itagakim
0
380
AWSとTerraform初心者がやってみたこと
itagakim
1
520
IntroductionToTensorFlow2_0.pdf
itagakim
1
380
Other Decks in Technology
See All in Technology
Agile and AI Redmine Japan 2026
hiranabe
4
480
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
190
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.5k
自宅LLMの話
jacopen
1
720
AIチャット検索改善の3週間
kworkdev
PRO
2
170
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
310
【FinOps】データドリブンな意思決定を目指して
z63d
0
350
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
140
螺旋型キャリアの生存戦略 / kinoko-conf2026
rakus_dev
1
980
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
140
When Platform Engineering Meets GenAI
sucitw
0
170
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
130
Featured
See All Featured
Music & Morning Musume
bryan
47
7.2k
Evolving SEO for Evolving Search Engines
ryanjones
0
220
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Are puppies a ranking factor?
jonoalderson
1
3.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
620
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Fireside Chat
paigeccino
42
4k
Transcript
Ollamaを使った Local Language Model 活⽤法 板垣正敏 FROM PYTHON機械学習勉強会IN新潟 2024/11/23 JAWS-UG新潟#19
× PYTHON機械学習勉強会IN新潟#19 ⽣成AI開発ハンズオン
⽬次 • llama.cppとollama.app • チャットbotを作ってみた • OpenWebUIが便利 2
llama.cppとollama.app 3
llama.cpp • https://github.com/ggerganov/llama.cpp • Georgi Gerganov⽒が開発したGGMLを核とする⾔語モデル実⾏環境 • MetaのLlamaをはじめとする多種のモデルに対応 • Mac,
Windows, Linuxに対応 • Apple Silicon/NVIDIA/Intel/AMDなどのGPUとCPUに対応 • 1.5bitから8bitまでの量⼦化に対応しメモリ節約と推論速度向上を実現 4
量⼦化 • 深層学習モデルのパラメータはFP32が基本であるが、FP16あるいは 精度を犠牲にして表現範囲を拡⼤したBP16でも⼤きな性能低下がな いことが知られている • パラメータ数の⾮常に多いLLMにおいては、さらに浮動⼩数点数では なく整数に変換を⾏うことで、モデルの圧縮が⾏われるようになって いる •
INT8から1.5ビット(-1,0,1)まで様々な量⼦化⼿法が⽣まれている 5
ollama.app • https://ollama.com • llama.cpp + モデルリポジトリ + ダウンロード機能 •
わかりやすいコマンドラインインターフェイス • ⾃動アップデート • Web APIを持つサーバ搭載 6
ollama.appコマンドラインインターフェイス • ollama run <モデル名> • モデルを実⾏しテキスト⼊⼒を待つ • ollama pull
<モデル名> • リポジトリからモデルをダウンロード • ollama list • ダウンロード済み(登録済み)のモデル⼀覧を表⽰ • ollama rm <モデル名> • モデルを削除 7
リポジトリにないモデルの登録 • 必要なもの • GGUF形式の学習済みパラメータ • momonga⽒がHugging Faceに⽇本語対応モデルの量⼦化済みモデルをアップロード してくれている https://huggingface.co/mmnga
• llama.cppを使えばHugging Faceに公開されたモデルをGGUF形式にコンバートした り、量⼦化したりすることができる • Modelfile • モデルファイル、パラメータ、テンプレートなどを定義したテキストファイル • ollama show --modelfile <モデル名>で既存モデルのmodelfile出⼒可能 • ollama create <モデル名> -f <モデルファイル名> 8
ollama python API • https://github.com/ollama/ollama-python • 同期と⾮同期のAPIを提供 • ollama.chat(), ollama.generate(),
そしてollama.embed() • その他CLIの各コマンドをサポート 9
独⾃のチャットWebアプリを作る 10
発端は・・・ • Ruby on Rails 8.0リリース • WebSocketでの通信に対応するAction CableがRedisなし(SQLite)がデ フォルトに
• Chatアプリが気軽にできそう • Ruby版ollama-aiパッケージを使ってChatGPTもどきが出来る • [⽣成AI]共感型カウンセラーボットを作成する - Ruby on Rails7編 • https://note.com/creativival/n/n504dc24f79d6 • Rails 8.0でやってみる 11
やってみたが・・・ • Action Cable使ってなかった • 通常のControllerにロジックを実装 • LLMの応答が⽣成するまで画⾯がフリーズ • 対話履歴をセッション変数で管理
• Railsのデフォルトではセッション変数はCookieに保存→4096バイトの壁 • セッションストアをキャッシュに変更 • config.session_store :cache_store 12
Django + Channels • どんな⾔語・フレームワークでも構わないが、ここはPython機械学 習研究会の⽴場上Djangoを使⽤(Flaskでもいいのだけれど) • チャットアプリらしく⾒せるにはSPA • LLMからの応答は⾮同期で表⽰したい
• ChannelsはWebSocketやIoTで使われるMQTTなどのPub/Subモデ ルによる⾮同期通信をサポートするDjangoアドオンライブラリ 13
まずはChatアプリの例を検索 • Realtime chat app using Django • https://www.geeksforgeeks.org/realtime-chat-app-using-django/ •
ユーザー管理は不要なので削除 • CSSはRails版を転⽤ • 対話履歴はとりあえずクライアント側に持たせた • Ollamaのストリーミング出⼒に対応させた 14
WebSocketでChannelsを使う︓サーバー側 class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): await self.accept() async def
disconnect(self, close_code): pass async def receive(self, text_data): messages = json.loads(text_data) last_message = messages[-1] content = last_message["content"] role = last_message["role"] await self.send( text_data=json.dumps({ "content" : content, "role" : role, })) ollama_response = await self.get_ollama_response(messages) await self.send( text_data=json.dumps({ "content" : ollama_response, "role" : "assistant", })) async def get_ollama_response(self, messages): system_prompt = [{ 'content': SYSTEM_CONTENT, 'role': 'system’}] response = await AsyncClient().chat( model=MODEL_NAME, messages=system_prompt + messages) return response['message']['content'] 15
WebSocketでChannelsを使う︓クライアント const chatSocket = new WebSocket("ws://" + window.location.host + "/");
var messages = []; chatSocket.onopen = function (e) { console.log("The connection was setup successfully !"); }; chatSocket.onclose = function (e) { console.log("Something unexpected happened !"); }; … document.querySelector("#post_button").onclick = function (e) { var messageInput = document.querySelector("#message_input").value; messages.push({ content: messageInput, role : "user"}) chatSocket.send(JSON.stringify(messages)); }; document.querySelector("#clear_button").onclick = function (e) { messages = []; document.querySelector("#messages").innerHTML = ""; } chatSocket.onmessage = function (e) { const data = JSON.parse(e.data); messages.push(data); var div = document.createElement("div"); div.className = data.role == "user" ? "message user" : "message"; div.innerHTML = data.content; document.querySelector("#message_input").value = ""; document.querySelector("#messages").appendChild(div); document.querySelector("#messages").scrollTop = document.querySelector("#messages").scrollHeight; }; 16
demo 17
実⽤化するには・・・ • ユーザー管理はやっぱり必要 • 対話記録を残すためにDjangoモデルを導⼊ 18
OpenWebUI 19
OpenWebUI • https://openwebui.com • 以前はOllama WebUIと呼ばれていたらしい • OpenAI、ClaudeなどクラウドLLMや、ollamaなどのローカルLLM を使って独⾃のチャットインターフェイスを構築するためのツール •
Pythonパッケージとして配布されるが、Dockerでの環境構築を推奨 docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:main 20
Open-WebUIの特徴 • 設定が簡単 • OpenAI APIとの統合 • レスポンシブ・デザイン • プログレッシブ・ウェブアプリ
ケーション • マークダウンとLaTeXのサポート • モデルビルダー • ローカル⼜はリモートのRAG対応 • Web検索を利⽤したRAG • Webブラウンジング機能 • 画像⽣成との統合 • 同時に複数のモデルを使⽤可能 • ロールベースのアクセス制御 • 多⾔語対応 • 継続的アップデート 21
demo 22
参考 • llama.cpp の動かし⽅と量⼦化⼿法 • https://zenn.dev/turing_motors/articles/f5f19f875bd8ba • [⽣成AI]共感型カウンセラーボットを作成する - Ruby
on Rails7編 • https://note.com/creativival/n/n504dc24f79d6 • Realtime chat app using Django • https://www.geeksforgeeks.org/realtime-chat-app-using-django/ • Open-WebUI...LLMのハブ的ソフト • https://qiita.com/tamizzo/items/fae40a7171dc5661de6e • 加藤 智久🌻 Zuitt 代表 ITエンジニア育成フィリピン最⼤⼿ のプロンプト • https://x.com/kato_/status/1643470077738762242 34