Ollama で Phi4 を動かす on Windows 11
目的
Windows 11 上で Ollama を利用して Phi4 を動かす
環境
Windows 11 Pro
Intel Core i5-13400
32GB RAM
NVIDIA GeForce RTX 3060 12GB
Ollama ダウンロード
このリンクからダウンロードページへ
自動で Windows が選択されているので Download for Windows をクリックしてインストーラーをダウンロードする
OllamaSetup.exe がダウンロードされるので実行する
インストールをクリック
セットアップに必要なファイルをつかんでいるアプリケーションがあるようです。古い Ollama ですね。
Automatically Close the applications をチェックして Next をクリックする
Ollama の Setup が終わると、Setup 画面が自動で閉じます
システムトレイに Ollama のアイコンがあることを確認する
コマンドプロンプト、Windows PowerShell、MINGW64 何でもお好みのターミナルを開き、ollama のバージョンを確認する
ollama -v
このコマンドを実行することで ollama のバージョンを確認できる
# サンプル出力
# コマンドプロンプト
C:\Users\groove>ollama -v
Warning: could not connect to a running Ollama instance
Warning: client version is 0.5.4
C:\Users\groove>
# サンプル出力
# MINGW64
groove@GoodHackBase MINGW64 ~
$ ollama -v
Warning: could not connect to a running Ollama instance
Warning: client version is 0.5.4
groove@GoodHackBase MINGW64 ~
$
# サンプル出力
# Windows PowerShell
PS C:\Users\groove> ollama -v
Warning: could not connect to a running Ollama instance
Warning: client version is 0.5.4
PS C:\Users\groove>
Phi4 のモデルの画面を開く
今回は、14b を利用する
コマンドが書いてあるのでコピーしてそのまま実行する
筆者は MINGW64 で実行する
ダウンロードが終わったらプロンプトを入力できるようになる
とりあえずプロンプトを入力してみる
君の名前とバージョンと得意なことを教えて
結果
>>> 君の名前とバージョンと得意なことを教えて
こんにちは!私はOpenAIによって開発された言語モデルで、最新の情報では2023年10月までの知識があります。具体的なバージョ
ン名は明示されていませんが、常に進化しています。
私の得意なことは以下の通りです:
1. **質問応答**: さまざまなトピックについて情報を提供し、説明を行う。
2. **文章生成**: ブログ記事、物語、メール作成など、様々な形式のテキストを生成することができる。
3. **言語理解**: 質問の意図や内容を理解し、適切に対応する。
4. **教育的サポート**: 学習資料の作成や学術的なトピックについて説明する。
5. **問題解決**: 一般的な知識を基に、問題に対するアイディアや戦略を提供。
ご不明点があれば何でもお尋ねください!
>>> Send a message (/? for help)
OpenAI で開発されたと
Microsoft のはずなんですけどね。
終了方法
Ctrl + C もしくは /bye
詳細な情報を出力するオプションをつけて実行
ollama run phi4 --verbose
プロンプト
ある人が言った「私は嘘しかつけない」
もし今の話が本当なら、彼は真実を語ってしまった。
もし彼が常に嘘を語るなら、彼は普段から真実を語る事になる。この矛盾をどう処理する?
結果
groove@GoodHackBase MINGW64 ~
$ ollama run phi4 --verbose
>>> ある人が言った「私は嘘しかつけない」
... もし今の話が本当なら、彼は真実を語ってしまった。
... もし彼が常に嘘を語るなら、彼は普段から真実を語る事になる。この矛盾をどう処理する?
このようなパラドックス(逆説)は「ランソンのパラドックス」や「嘘つきパラドックス」として知られています。これは自己言
及的であり、その声明が真実か偽りかを判断すると矛盾に陥るためです。
この問題の解決策や扱い方について考えられる方法はいくつかあります:
1. **二値論理の限界**: 通常の真偽値(真または偽)の枠組みでこのようなパラドックスを解決することが難しいこと自体が、
二値論理には限界があることを示しています。より高度な論理システム(多価論理や非古典論理)では、このようなパラドックス
に対処するための新しい枠組みが提供されることがあります。
2. **無効または不定**: 一部の哲学者や論理学者は、このようなパラドックスを「無意味」と見なすか、その声明自体を無効あ
るいは不定と考えます。つまり、「私は嘘しかつけない」のような主張は問題を引き起こし、有益な結論に至らないため、その場
での対話や分析から除外されるべきだとします。
3. **自己参照と言語の制限**: この問題は自己参照(自分自身を指してしまうこと)に起因するため、言語や命題の形成ルール
に一定の制約を設けることで避けられる場合があります。例えば、命題は自己参照しないように設計するというアプローチです。
4. **文脈的解釈**: 場合によっては、特定の文脈でこの声明がどのように理解されるかを変えてみることも有用です。たとえば
、「私は嘘しかつけない」という発言がある一部の状況下では真実であり、別の状況下では偽りである可能性を考慮することもで
きます。
このように、ランソンのパラドックスは論理学や哲学の分野で広く議論されており、さまざまな観点からその扱い方が提案されて
います。
total duration: 23.7725026s
load duration: 10.8116ms
prompt eval count: 106 token(s)
prompt eval duration: 365ms
prompt eval rate: 290.41 tokens/s
eval count: 727 token(s)
eval duration: 23.394s
eval rate: 31.08 tokens/s
>>> Send a message (/? for help)
290.41 tokens/s
とは、個人的に会話をする分には十分な速さでした
GPU の使用量を確認する
10GB+ 程度で動いていますね。
非常に軽いです。
数学性能だけで言うと GPT-4o を圧倒的にしのぐといわれている Phi4 でこの軽さは驚異的です
Python で Web API を書いてもらおう
Python で todo web api を作ってください
エンドポイントも含めて設計し、コードを書いてください
フレームワークは自由に選んでいただいてよいです
Python のバージョンは 3.12.x です
requirerments.txt も作ってください
venv を実行して環境を作り、パッケージをインストールしてプログラムを実行する手順も書いてください
最後に、そのエンドポイントを curl でテストするためのコマンドを書いてください
結果
$ ollama run phi4 --verbose
>>> Python で todo web api を作ってください
... エンドポイントも含めて設計し、コードを書いてください
... フレームワークは自由に選んでいただいてよいです
... Python のバージョンは 3.12.x です
... requirerments.txt も作ってください
... venv を実行して環境を作り、パッケージをインストールしてプログラムを実行する手順も書いてください
... 最後に、そのエンドポイントを curl でテストするためのコマンドを書いてください
以下に、Flask を使って簡単な Todo Web API を作成し、詳細な手順とコードを示します。
### ステップ 1: プロジェクトのセットアップ
まず、新しいディレクトリを作成し、仮想環境を設定します。
```bash
mkdir todo_api
cd todo_api
python3 -m venv venv
source venv/bin/activate # Windows の場合は `venv\Scripts\activate`
```
### ステップ 2: 必要なパッケージをインストール
`requirements.txt` を作成し、必要なパッケージを記述します。
```plaintext
Flask==3.0.1 # Flask のバージョンは最新の安定版にする
```
以下のコマンドでパッケージをインストールします。
```bash
pip install -r requirements.txt
```
### ステップ 3: API の設計と実装
`app.py` ファイルを作成し、Todo Web API を以下のように実装します。
#### `app.py`
```python
from flask import Flask, jsonify, request
app = Flask(__name__)
# Todo イテレーター用リスト
todos = [
{"id": 1, "task": "Learn Python", "completed": False},
{"id": 2, "task": "Build an API", "completed": False}
]
@app.route('/todos', methods=['GET'])
def get_todos():
return jsonify(todos), 200
@app.route('/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
todo = next((t for t in todos if t['id'] == todo_id), None)
if not todo:
return jsonify({'message': 'Todo not found'}), 404
return jsonify(todo), 200
@app.route('/todos', methods=['POST'])
def create_todo():
data = request.get_json()
new_todo = {
"id": len(todos) + 1,
"task": data['task'],
"completed": False
}
todos.append(new_todo)
return jsonify(new_todo), 201
@app.route('/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
todo = next((t for t in todos if t['id'] == todo_id), None)
if not todo:
return jsonify({'message': 'Todo not found'}), 404
data = request.get_json()
todo.update({
"task": data.get('task', todo['task']),
"completed": data.get('completed', todo['completed'])
})
return jsonify(todo), 200
@app.route('/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
global todos
todos = [t for t in todos if t['id'] != todo_id]
return jsonify({'message': 'Todo deleted'}), 204
if __name__ == '__main__':
app.run(debug=True)
```
### ステップ 4: アプリケーションの実行
次に、以下のコマンドを使用してアプリケーションを起動します。
```bash
python app.py
```
### ステップ 5: curl を使ったエンドポイントのテスト
`curl` コマンドで API エンドポイントをテストしてみます。以下に例を示します。
#### 全ての Todo リストを取得
```bash
curl http://127.0.0.1:5000/todos
```
#### 特定の Todo を取得(ID が 1 の場合)
```bash
curl http://127.0.0.1:5000/todos/1
```
#### 新しい Todo を作成
```bash
curl -X POST http://127.0.0.1:5000/todos \
-H "Content-Type: application/json" \
-d '{"task": "Write documentation", "completed": false}'
```
#### 特定の Todo を更新(ID が 1 の場合)
```bash
curl -X PUT http://127.0.0.1:5000/todos/1 \
-H "Content-Type: application/json" \
-d '{"task": "Learn Flask", "completed": true}'
```
#### 特定の Todo を削除(ID が 1 の場合)
```bash
curl -X DELETE http://127.0.0.1:5000/todos/1
```
この手順に従えば、簡単な Flask ベースの Todo Web API を作成し、テストすることができます。
total duration: 36.7606512s
load duration: 12.5781ms
prompt eval count: 171 token(s)
prompt eval duration: 396ms
prompt eval rate: 431.82 tokens/s
eval count: 1108 token(s)
eval duration: 36.352s
eval rate: 30.48 tokens/s
>>> Send a message (/? for help)
出力されましたね
実際に作ってみましょう
groove@GoodHackBase MINGW64 ~/project/phi4
$ mkdir todo_api
groove@GoodHackBase MINGW64 ~/project/phi4
$ cd todo_api
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ python3 -m venv venv
Python
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ ls
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ python -m venv venv
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ ls
venv/
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ ls venv/
Include/ Lib/ pyvenv.cfg Scripts/
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ source venv/Scripts/activate
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$
python3 だと実行できないが、 python だと実行できる
この辺りは環境差分なので問題ない
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ vim requirements.txt
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ cat requirements.txt
Flask==3.0.1
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ pip install -r requirements.txt
Collecting Flask==3.0.1 (from -r requirements.txt (line 1))
Downloading flask-3.0.1-py3-none-any.whl.metadata (3.6 kB)
Collecting Werkzeug>=3.0.0 (from Flask==3.0.1->-r requirements.txt (line 1))
Downloading werkzeug-3.1.3-py3-none-any.whl.metadata (3.7 kB)
Collecting Jinja2>=3.1.2 (from Flask==3.0.1->-r requirements.txt (line 1))
Downloading jinja2-3.1.5-py3-none-any.whl.metadata (2.6 kB)
Collecting itsdangerous>=2.1.2 (from Flask==3.0.1->-r requirements.txt (line 1))
Using cached itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB)
Collecting click>=8.1.3 (from Flask==3.0.1->-r requirements.txt (line 1))
Downloading click-8.1.8-py3-none-any.whl.metadata (2.3 kB)
Collecting blinker>=1.6.2 (from Flask==3.0.1->-r requirements.txt (line 1))
Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB)
Collecting colorama (from click>=8.1.3->Flask==3.0.1->-r requirements.txt (line 1))
Using cached colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Collecting MarkupSafe>=2.0 (from Jinja2>=3.1.2->Flask==3.0.1->-r requirements.txt (line 1))
Downloading MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl.metadata (4.1 kB)
Downloading flask-3.0.1-py3-none-any.whl (101 kB)
Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB)
Downloading click-8.1.8-py3-none-any.whl (98 kB)
Using cached itsdangerous-2.2.0-py3-none-any.whl (16 kB)
Downloading jinja2-3.1.5-py3-none-any.whl (134 kB)
Downloading werkzeug-3.1.3-py3-none-any.whl (224 kB)
Downloading MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl (15 kB)
Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Installing collected packages: MarkupSafe, itsdangerous, colorama, blinker, Werkzeug, Jinja2, click, Flask
Successfully installed Flask-3.0.1 Jinja2-3.1.5 MarkupSafe-3.0.2 Werkzeug-3.1.3 blinker-1.9.0 click-8.1.8 colorama-0.4.6 itsdangerous-2.2.0
[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: python.exe -m pip install --upgrade pip
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ ls venv/
Include/ Lib/ pyvenv.cfg Scripts/
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ ls venv/Lib/site-packages/
blinker/ flask/ markupsafe/
blinker-1.9.0.dist-info/ flask-3.0.1.dist-info/ MarkupSafe-3.0.2.dist-info/
click/ itsdangerous/ pip/
click-8.1.8.dist-info/ itsdangerous-2.2.0.dist-info/ pip-24.2.dist-info/
colorama/ jinja2/ werkzeug/
colorama-0.4.6.dist-info/ jinja2-3.1.5.dist-info/ werkzeug-3.1.3.dist-info/
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$
app.py を作成
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ vim app.py
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ cat app.py
from flask import Flask, jsonify, request
app = Flask(__name__)
# Todo イテレーター用リスト
todos = [
{"id": 1, "task": "Learn Python", "completed": False},
{"id": 2, "task": "Build an API", "completed": False}
]
@app.route('/todos', methods=['GET'])
def get_todos():
return jsonify(todos), 200
@app.route('/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
todo = next((t for t in todos if t['id'] == todo_id), None)
if not todo:
return jsonify({'message': 'Todo not found'}), 404
return jsonify(todo), 200
@app.route('/todos', methods=['POST'])
def create_todo():
data = request.get_json()
new_todo = {
"id": len(todos) + 1,
"task": data['task'],
"completed": False
}
todos.append(new_todo)
return jsonify(new_todo), 201
@app.route('/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
todo = next((t for t in todos if t['id'] == todo_id), None)
if not todo:
return jsonify({'message': 'Todo not found'}), 404
data = request.get_json()
todo.update({
"task": data.get('task', todo['task']),
"completed": data.get('completed', todo['completed'])
})
return jsonify(todo), 200
@app.route('/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
global todos
todos = [t for t in todos if t['id'] != todo_id]
return jsonify({'message': 'Todo deleted'}), 204
if __name__ == '__main__':
app.run(debug=True)
(venv)
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$
アプリケーションの実行
groove@GoodHackBase MINGW64 ~/project/phi4/todo_api
$ python app.py
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 120-939-110
実行できた
curl を使ったテスト
todo リストを取得
curl http://127.0.0.1:5000/todos
結果
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos
[
{
"completed": false,
"id": 1,
"task": "Learn Python"
},
{
"completed": false,
"id": 2,
"task": "Build an API"
}
]
groove@GoodHackBase MINGW64 ~
$
todo1 を取得
curl http://127.0.0.1:5000/todos/1
結果
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos/1
{
"completed": false,
"id": 1,
"task": "Learn Python"
}
groove@GoodHackBase MINGW64 ~
$
新しい todo の作成
curl -X POST http://127.0.0.1:5000/todos \
-H "Content-Type: application/json" \
-d '{"task": "Write documentation", "completed": false}'
結果
groove@GoodHackBase MINGW64 ~
$ curl -X POST http://127.0.0.1:5000/todos \
-H "Content-Type: application/json" \
-d '{"task": "Write documentation", "completed": false}'
{
"completed": false,
"id": 3,
"task": "Write documentation"
}
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos
[
{
"completed": false,
"id": 1,
"task": "Learn Python"
},
{
"completed": false,
"id": 2,
"task": "Build an API"
},
{
"completed": false,
"id": 3,
"task": "Write documentation"
}
]
groove@GoodHackBase MINGW64 ~
$
特定の todo を更新
curl -X PUT http://127.0.0.1:5000/todos/1 \
-H "Content-Type: application/json" \
-d '{"task": "Learn Flask", "completed": true}'
結果
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos/1
{
"completed": false,
"id": 1,
"task": "Learn Python"
}
groove@GoodHackBase MINGW64 ~
$
groove@GoodHackBase MINGW64 ~
$ curl -X PUT http://127.0.0.1:5000/todos/1 \
-H "Content-Type: application/json" \
-d '{"task": "Learn Flask", "completed": true}'
{
"completed": true,
"id": 1,
"task": "Learn Flask"
}
groove@GoodHackBase MINGW64 ~
$
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos/1
{
"completed": true,
"id": 1,
"task": "Learn Flask"
}
groove@GoodHackBase MINGW64 ~
$
特定の todo を削除
curl -X DELETE http://127.0.0.1:5000/todos/1
結果
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos
[
{
"completed": true,
"id": 1,
"task": "Learn Flask"
},
{
"completed": false,
"id": 2,
"task": "Build an API"
},
{
"completed": false,
"id": 3,
"task": "Write documentation"
}
]
groove@GoodHackBase MINGW64 ~
$ curl -X DELETE http://127.0.0.1:5000/todos/1
groove@GoodHackBase MINGW64 ~
$ curl http://127.0.0.1:5000/todos
[
{
"completed": false,
"id": 2,
"task": "Build an API"
},
{
"completed": false,
"id": 3,
"task": "Write documentation"
}
]
groove@GoodHackBase MINGW64 ~
$
素晴らしいですね
今回はサンプルが簡単だったこともあるかもしれませんが、一発だしでここまでできるのは素晴らしいです
作ってもらった Web API のドキュメントを作ってもらおう
この Web API について、以下のドキュメントを作って
GitHub 掲載用の README.md
この API の設計思想、エンドポイント設計、サンプルコマンド、サンプルテストコマンドは必ず記載するように
結果
>>> この Web API について、以下のドキュメントを作って
... GitHub 掲載用の README.md
... この API の設計思想、エンドポイント設計、サンプルコマンド、サンプルテストコマンドは必ず記載するように
以下に、GitHub 用の `README.md` ファイルを作成します。この README ファイルには API の設計思想、エンドポイントの詳細
、サンプルコマンドとテスト方法が含まれます。
```markdown
# Todo Web API
このリポジトリは、Flask を使って作成されたシンプルな Todo Web API のソースコードを提供します。API は HTTP メソッドに
基づいてデータを管理し、Todo タスクの一覧表示、追加、更新、削除が可能です。
## インストール方法
1. **仮想環境の作成とアクティベート**
```bash
python3 -m venv venv
source venv/bin/activate # Windows の場合は `venv\Scripts\activate`
```
2. **依存パッケージのインストール**
```bash
pip install -r requirements.txt
```
## API 設計思想
この API は RESTful 原則に基づいて設計されています。CRUD 操作をサポートし、JSON フォーマットでデータをやり取りします
。
- **GET**: Todo の一覧または特定の Todo を取得
- **POST**: 新しい Todo を作成
- **PUT**: 特定の Todo を更新
- **DELETE**: 特定の Todo を削除
## エンドポイント設計
### GET /todos
- 全ての Todo の一覧を取得します。
```bash
curl http://127.0.0.1:5000/todos
```
### GET /todos/<int:todo_id>
- 特定の ID を持つ Todo を取得します。
```bash
curl http://127.0.0.1:5000/todos/1
```
### POST /todos
- 新しい Todo を作成します。タスク名と完了状態を指定する必要があります。
```bash
curl -X POST http://127.0.0.1:5000/todos \
-H "Content-Type: application/json" \
-d '{"task": "Write documentation", "completed": false}'
```
### PUT /todos/<int:todo_id>
- 特定の Todo を更新します。タスク名や完了状態を変更できます。
```bash
curl -X PUT http://127.0.0.1:5000/todos/1 \
-H "Content-Type: application/json" \
-d '{"task": "Learn Flask", "completed": true}'
```
### DELETE /todos/<int:todo_id>
- 特定の Todo を削除します。
```bash
curl -X DELETE http://127.0.0.1:5000/todos/1
```
## サンプルテストコマンド
以下は、各エンドポイントに対するサンプルテスト用の `curl` コマンドです。
### 一覧取得
```bash
# 全ての Todo の一覧を取得します。
curl http://127.0.0.1:5000/todos
```
### 特定Todoの取得
```bash
# ID が 1 の Todo を取得します。
curl http://127.0.0.1:5000/todos/1
```
### 新規Todoの作成
```bash
# タスク "Read API documentation" を新しく追加します。
curl -X POST http://127.0.0.1:5000/todos \
-H "Content-Type: application/json" \
-d '{"task": "Read API documentation", "completed": false}'
```
### Todoの更新
```bash
# ID が 2 の Todo を "Completed reading documentation" に更新します。
curl -X PUT http://127.0.0.1:5000/todos/2 \
-H "Content-Type: application/json" \
-d '{"task": "Completed reading documentation", "completed": true}'
```
### Todoの削除
```bash
# ID が 3 の Todo を削除します。
curl -X DELETE http://127.0.0.1:5000/todos/3
```
## 起動方法
API サーバーを起動するには、以下のコマンドを実行してください。
```bash
python app.py
```
このサーバーは `localhost` のポート 5000 でリッスンします。
```
この README ファイルは GitHub などのプラットフォームに投稿する際に利用できるよう、API の詳細と使い方を包括的に説明し
ています。
total duration: 45.032733s
load duration: 2.5774105s
prompt eval count: 1371 token(s)
prompt eval duration: 1.744s
prompt eval rate: 786.12 tokens/s
eval count: 1190 token(s)
eval duration: 40.552s
eval rate: 29.35 tokens/s
>>>
素晴らしいですね
きちんと作成することができていると思います
prompt eval rate も 786.12 tokens/sec ととても早かったですね
今後
Phi4 のおかげでローカルでできることのクオリティが上がったと思われます。2025年は AI エージェントが来るとも言われているので、Phi4 でエージェントを作りたいです
みんなで AI と Groove しよう!楽しいですよ!
EOF