Ollama

更新:2025-03-19
AI

概要

Ollama」は、LLMをローカル環境で実行するためのツール。

導入

インストールや使い方はollamaのGitHubリポジトリに書いてある。

試用

モデルはGemma 3で試す。僕の環境だと「12b」は重かったので「4b」で試す。

同じ名前のモデルにも4b12bのような種類があり、これらはモデルが持つパラメータ数を指す。多いほど複雑な処理が可能になるらしい。

対話モード

/some/directory
ollama run gemma3:4b

初めて使用するモデルの場合、まずダウンロードが実行される。

/some/directory
pulling manifest
pulling 377655e65351... 100% ▕████████████████████▏ 3.3 GB
pulling e0a42594d802... 100% ▕████████████████████▏ 358 B
pulling dd084c7d92a3... 100% ▕████████████████████▏ 8.4 KB
pulling 0a74a8735bf3... 100% ▕████████████████████▏ 55 B
pulling ffae984acbea... 100% ▕████████████████████▏ 489 B
verifying sha256 digest
writing manifest
success
>>> 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と入力すれば、対話を終了できる。

非対話モード

非対話モードは、プロンプトごと実行して、それに対する応答のみが出力される。

sample
ollama run gemma3:4b "海はなぜ青いのでしょうか?日本語で100文字程度で教えてください。"

また、コマンドの実行結果をプロンプトに流し込むことが可能。

sample
ollama run gemma3:4b "$(pwd)から最後のディレクトリ名だけを示してください。"

CSVを読ませて、データを並べ替えてもらった

たとえば適当なCSVを用意して、ソートをお願いする。

サンプルデータを用意

/some/directory/sample-data.csv
id,name,score
1,AlphaCentauri,82
2,BetaOrion,95
3,GammaAndromeda,78
4,DeltaSirius,89
5,EpsilonCassiopeia,67
6,ZetaDraco,92
7,EtaLyra,85
8,ThetaPegasus,71
9,IotaCygnus,98
10,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:3bgemma2:9bdeepseek-r1:14bでも試してみたが、いずれも間違った解答を示した。聞き方やデータにもよるかもしれない。

PHPを読ませて、コードの代替案を出してもらった

サンプルデータを用意

PHPのmysqli()を使用してDBからデータを取得するコードを書いた。

/some/directory/sample.php
<?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を使用する形に書き換 えたコードを示してください。

回答

コードと、それに関する解説を示してくれた。プリペアドステートメントなどにも触れており、なかなか良い気がする。

Gemmaが示したコード
<?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);
?>

変更点と説明:

  1. PDO の使用:
    • mysqli_connect() の代わりに new PDO() を使用して PDO オブジェクトを作成します。
    • PDO は、データベース接続を抽象化し、さまざまなデータベースシステム (MySQL, PostgreSQL, SQLite など) を統一した方法で操作できます。
  2. エラー処理:
    • PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION を設定することで、PDO はエラーが発生した場合に PDOException 例外をスローします。
    • try...catch ブロックを使用して、例外をキャッチし、エラーメッセージを表示してプログラムを終了します。 これにより、エラーが発生した場合にプログラムがクラッシュするのを防ぎ、より堅牢なコードになります。
  3. プリペアドステートメント:
    • 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であることを確認してください。 そうでない場合、文字化けが発生する可能性があります。

続く...かもね