Ollama

概要
「Ollama」は、LLMをローカル環境で実行するためのツール。
導入
インストールや使い方はollamaのGitHubリポジトリに書いてある。
試用
モデルはGemma 3で試す。僕の環境だと「12b」は重かったので「4b」で試す。
同じ名前のモデルにも4b
や12b
のような種類があり、これらはモデルが持つパラメータ数を指す。多いほど複雑な処理が可能になるらしい。
対話モード
ollama run gemma3:4b
初めて使用するモデルの場合、まずダウンロードが実行される。
pulling manifestpulling 377655e65351... 100% ▕████████████████████▏ 3.3 GBpulling e0a42594d802... 100% ▕████████████████████▏ 358 Bpulling dd084c7d92a3... 100% ▕████████████████████▏ 8.4 KBpulling 0a74a8735bf3... 100% ▕████████████████████▏ 55 Bpulling ffae984acbea... 100% ▕████████████████████▏ 489 Bverifying sha256 digestwriting manifestsuccess>>> Send a message (/? for help)
Ollamaのバージョンが古い場合はエラーが出るので、その場合は常駐アプリからアップデートできる。
Error: llama runner process has terminated: this model is not supported by your version of Ollama. You may need to upgrade
質問を入力すると答えてくれる。
海はなぜ青いのでしょうか?日本語で100文字程度で教えてください。
海が青く見えるのは、水分子が赤い光よりも青い光をより多く反射・散乱させるからです。太陽光が海に当たると、青い光は深く散らばり、私たちの目に入ってくるため、海は青く見えるのです。
/bye
と入力すれば、対話を終了できる。
非対話モード
非対話モードは、プロンプトごと実行して、それに対する応答のみが出力される。
ollama run gemma3:4b "海はなぜ青いのでしょうか?日本語で100文字程度で教えてください。"
また、コマンドの実行結果をプロンプトに流し込むことが可能。
ollama run gemma3:4b "$(pwd)から最後のディレクトリ名だけを示してください。"
CSVを読ませて、データを並べ替えてもらった
たとえば適当なCSVを用意して、ソートをお願いする。
サンプルデータを用意
id,name,score1,AlphaCentauri,822,BetaOrion,953,GammaAndromeda,784,DeltaSirius,895,EpsilonCassiopeia,676,ZetaDraco,927,EtaLyra,858,ThetaPegasus,719,IotaCygnus,9810,KappaLeo,80
質問
$(cat sample-data.csv)は、あるテストの成績に関するCSVデータです。idは連番、nameは受験者名、scoreはテストの点数を意味します。このテストデータを点数が高い順に並び替えて、結果だけを出力してください。
回答
9,IotaCygnus,98
2,BetaOron,95
6,ZetaDraco,92
4,DeltaSirius,89
7,EtaLyra,85
1,AlphaCentauri,82
10,KappaLeo,80
3,GammaAndromeda,78
8,ThetaPegasus,71
5,EpsilonCassiopeia,67
同じことをllama3.2:3b
、gemma2:9b
、deepseek-r1:14b
でも試してみたが、いずれも間違った解答を示した。聞き方やデータにもよるかもしれない。
PHPを読ませて、コードの代替案を出してもらった
サンプルデータを用意
PHPのmysqli()
を使用してDBからデータを取得するコードを書いた。
<?php
$host = 'localhost';$user = 'sample_user';$password = 'sample_password';$db = 'sample_db';
$conn = mysqli_connect($host, $user, $password, $db);if (!$conn) { echo '接続失敗'; exit;}
$sql = "SELECT * FROM sample_table WHERE id='aaaaa'";
$result = mysqli_query($conn, $sql);if (!$result) { echo '取得失敗'; exit;}
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
print_r($data);
質問
$(cat sample.php)は、mysqliを利用したデータの取得コードです。PDOを使用する形に書き換 えたコードを示してください。
回答
コードと、それに関する解説を示してくれた。プリペアドステートメントなどにも触れており、なかなか良い気がする。
<?php
$host = 'localhost';$user = 'sample_user';$password = 'sample_password';$db = 'sample_db';
try { $conn = new PDO("mysql:host=$host;dbname=$db", $user, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーモードを例外に設定} catch (PDOException $e) { echo '接続失敗: ' . $e->getMessage(); exit;}
$sql = "SELECT * FROM sample_table WHERE id='aaaaa'";
$stmt = $conn->prepare($sql);$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
?>
変更点と説明:
PDO
の使用:
mysqli_connect()
の代わりにnew PDO()
を使用してPDO
オブジェクトを作成します。PDO
は、データベース接続を抽象化し、さまざまなデータベースシステム (MySQL, PostgreSQL, SQLite など) を統一した方法で操作できます。- エラー処理:
PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
を設定することで、PDO
はエラーが発生した場合にPDOException
例外をスローします。try...catch
ブロックを使用して、例外をキャッチし、エラーメッセージを表示してプログラムを終了します。 これにより、エラーが発生した場合にプログラムがクラッシュするのを防ぎ、より堅牢なコードになります。- プリペアドステートメント:
mysqli_query()
の代わりにprepare()
とexecute()
を使用してプリペアドステートメントを使用します。- プリペアドステートメントは、SQL インジェクション攻撃を防ぐために非常に重要です。
execute()
を呼び出す前に、SQL ステートメントを準備するため、データベースサーバーはSQLを解釈する前に、パラメータを安全に処理できます。fetchAll(PDO::FETCH_ASSOC)
を使用して、結果セットを連想配列として取得します。なぜ
PDO
を使うのか?
- 移植性:
PDO
は、さまざまなデータベースシステムを統一した方法で操作できるため、異なるデータベースシステム間でコードを移植するのが容易です。- セキュリティ: プリペアドステートメントを使用することで、SQL インジェクション攻撃を防ぐことができます。
- 機能:
PDO
は、mysqli
よりも多くの機能を提供します (例: データベース接続プーリング、トランザクション管理など)。- 現代的なPHPの推奨:
PDO
は、PHP の最新のバージョンで推奨されるデータベース接続方法です。補足:
sample_table
が実際に存在し、id
カラムが正しく定義されていることを確認してください。aaaaa
は、id
カラムに存在する値に置き換えてください。- データベース接続情報 (
$host
,$user
,$password
,$db
) を実際の環境に合わせて変更してください。- データベースの文字コードがUTF-8であることを確認してください。 そうでない場合、文字化けが発生する可能性があります。
続く...かもね