ガジェット・サービス

Claude CodeなしでAI社員は作れる? プログラミング未経験でローカルAI「ボブ」を作ってみた【PROJECT BOB #1】

zenzen

1994年北海道出身、福岡在住。会社員をしながら副業で美容師。映画・ゲーム・ガジェット・暮らしについて、実際に使った・観た・経験したことを中心に書いています。
プロフィールを見る | Xを見る

最近、「AI社員」という言葉をやたらと見かける。

AIに仕事を任せたり、複数のAIを社員のように動かしたり。
そういう話には、だいたいClaude Codeの名前が出てくる。

でも、そもそもAI社員って何なんだ?
Claude Codeじゃないと作れないのか?

そんな疑問から、今、自分専用のローカルAIを作っている。
名前はボブ。1991年の映画『ゼイラム』に登場するAIが名前の由来だ。

ちなみに、俺はプログラミングがほとんど分からない。
主にChatGPTにコードを書いてもらい、Macのターミナルに貼り付ける。
エラーが出たら、またChatGPTに見せる。基本はその繰り返し。

それでも、ボブは記事ファイルを読めるようになり、Wikipediaを調べられるようになり、ついには前の会話を思い出せるようになった。

ただし、AI社員が完成したわけではない。

今は複数の試作プログラムを動かしている段階だ。

今回は、実際に使ったコードも見ながら、どこまでできたのか、何がうまくいかなかったのかをまとめたい。

始まりは、仕事用動画の自動カットだった

実は最初からAI社員を作るつもりだったわけじゃない。

始まりは、仕事用のインタビュー動画を自動でカットする仕組みだった。

話の内容を確認し、使う部分を選び、不要な無音を削る。
ショート動画の編集では、こういう判断にけっこう時間がかかるんだよね。
そこで「AIに任せられないか」と試してみた。

結果は微妙。
冒頭の無音が残っていたり、途中の笑い声がブツッと切れていたり。
人間が見ればおかしいと分かる編集でも、仕組みに任せると平気で起きる。

けど、そこで考えた。

これ、動画編集だけじゃなくて、ブログの執筆や情報整理にも応用できるんじゃないか?

毎回ChatGPTに事情を説明するより、自分の仕事をある程度理解して、道具を使いながら手伝ってくれるAIが欲しい。

そんなときに気になったのが「AI社員」という言葉だった。だったら、自分で試してみよう。
これがPROJECT BOBの始まりだ。

今回の「AI社員」は、何を目指しているのか

俺が欲しいのは、質問に答えるだけのチャットボットじゃない。

「この記事を読んで改善案を考えて」「前に決めたことを覚えてる?」「出典を調べて」といった作業を、必要な道具を使って進めてほしい。

そこで、AIが文章を考える部分と、ファイル・検索・記憶を扱う部分を分けて作ることにした。

今回の開発環境

項目使っているもの
PCM4 MacBook Air/メモリ16GB
AIの実行Ollama
AIモデルGemma 3 4B
ファイル操作・処理Python
記憶の保存SQLite
コードの作成・修正ChatGPT

OllamaはローカルでAIモデルを動かすために使っている。
Gemma 3が文章を考え、Pythonがその前後の仕事を担当する。
記憶はSQLiteというデータベースに保存する。

ここで大事なのは、PythonもSQLiteも、Gemmaそのものの能力ではないということ。
Gemmaに道具を使わせたり、過去の情報を渡したりする仕組みを、周りに作っている。

実際のフォルダ構成

今回のコードを確認すると、主要ファイルはこんな状態だった。

AI-Projects/
└── Bob/
    ├── Modelfile        # ボブの性格や使用モデル
    ├── bob_v05.py       # ファイル・Wikipedia・回答作成
    ├── bob_v06.py       # 会話・重要メモの保存
    ├── bob_v07.py       # 関連する記憶の検索
    ├── bob_memory.db    # SQLiteの記憶データ
    └── tests/
        └── article.txt  # 架空のテスト記事

※主要ファイルだけを抜き出した構成。ほかにも開発途中のファイルがある。

最初はボブという名前と性格を設定した

まずはGemmaを、俺の仕事用AI「ボブ」として動かすところから。

Modelfileという設定ファイルには、実際にこう書いてある。

FROM gemma3:4b

PARAMETER temperature 0.7
PARAMETER num_ctx 4096

FROMは使うモデルの指定。その下は回答の出方や、会話で扱う情報量に関する設定らしい。

さらに、性格の指示にはこんな文章を入れている。

あなたの名前はボブ。

あなたはユーザー専用のローカルAI社員であり、仕事の相棒。

一人称は「俺」。日本語の自然なタメ口で話す。

そのほか「少し理屈っぽい」「理由があれば反論する」「見ていないWebサイトを見たと言わない」「ファイル変更などの重要操作は事前に確認する」といったルールも設定した。

実際に使ってきた起動コマンドはこちら。

ollama create bob -f ~/AI-Projects/Bob/Modelfile
ollama run bob

ただし、これだけでは記事を読んだり、記憶を検索したりはできない。そこから先はPythonの出番だ。

Ver.0.5|ボブにファイルを読ませ、Wikipediaを調べさせる

ボブに最初に任せたのは、架空の中古ゲーム機の記事を分析することだった。

本体の状態、バッテリー、ボタンの不具合について書いた短いテスト記事を用意して、「改善案を3つ出して」と頼む。

ここで必要なのは、まずファイルを実際に読むこと。

bob_v05.pyでは、AIが使える道具を次の4つに絞っている。

"enum": ["list_files", "read_file", "search_wikipedia", "finish"]

「ファイル一覧を見る」「ファイルを読む」「Wikipediaを検索する」「終える」という4択。Gemmaがどれを使うか決め、実際の操作はPythonが行う仕組みだ。

例えば読み込み可能なファイルには、こういう制限を付けた。

def available_files():
    return sorted(
        p.name for p in BASE.iterdir()
        if p.is_file()
        and not p.is_symlink()
        and p.suffix == ".txt"
    )

指定フォルダの中にある、通常の.txtファイルだけを候補にする。read_file()側には、ファイル名と大きさを確認する処理もある。

何でも好き勝手に読ませるのではなく、まずテスト用の小さな範囲で動かすことにした。

調べたふりをするボブ

ところが、最初のボブは結構いい加減だった。

中古ゲーム機のバッテリーについて怪しい説明をしたので指摘したら、逆に「間違いだと言うなら根拠を提示しろ」と言ってくる。

しかも、ネットで調べたかのようなことまで言い出した。そのときはまだ検索機能を接続していなかったのに。

だったら、実際に資料を取得できるようにしよう。

Ver.0.5では、Pythonから日本語WikipediaのAPIへ問い合わせ、記事の概要やURLをボブに渡せるようにした。

以前のPS Vitaの確認テストでは、取得した資料に答えがないことを「未確認」と扱う回答もできた。

とはいえ、Wikipediaの検索結果が質問とずれる場合もある。調べられるようになったからといって、必ず正解するわけじゃない。

「改善案を3つ出しました」。いや、どこに?

もう一つ困ったのは、文章の作成だ。

ボブに改善案を3つ頼むと、「改善案を3つ提案しました」と報告してくる。ところが、肝心の改善案が書かれていない。

さらに「上記が改善案です」と言い始めた。存在しない上記を読めと。

そこで、道具を選ぶ処理と、改善案そのものを書く処理を分けた。

修正後のbob_v05.pyには、実際にこういうコードがある。

if action == "finish":
    answer = write_answer(user, evidence, history)
    break

finishが出たら、「仕事を終えました」という報告をそのまま表示するのではなく、write_answer()で実際の回答文を生成する。

さらに、3件の改善案を頼んだ場合は、回答に「1.」「2.」「3.」という番号があるかも確認するようにした。

形式が足りなければ再生成を試み、なお失敗したら完了扱いにしない。

途中では、この番号の判定にも不具合があった。AIが正しく文章を出しても、Pythonが失敗だと判断してしまう。

修正してようやく、改善案と理由、文章例を3件出せるようになった。

ただし、このチェックは番号があるかを見るだけ。提案内容の事実確認までできているわけじゃない。

AIの「終わりました」は、仕事が終わった証拠にはならないらしい。

Ver.0.6|ボブに記憶を持たせてみた

次に困ったのが、ボブが会話を忘れることだった。

そこでbob_v06.pyでは、SQLiteを使って会話や重要なメモを保存する仕組みを作った。

データベースには、大きく2種類の記録を保存している。

  • messages:やり取りした会話。会話後に自動保存する。
  • memories:特に覚えておきたい内容。/memoコマンドで登録する。

重要メモを保存する部分は、実際にはこんなコードになっている。

conn.execute(
    "INSERT INTO memories (content, created_at) VALUES (?, ?)",
    (content[:2000], now())
)
conn.commit()

難しそうだけど、要するに「入力したメモをmemoriesという場所に書き込んで保存する」ということ。

実際にこんなテストをした。

あなた:/memo 今回のテストプロジェクトの名前は青いペンギン計画。
ボブ:メモを保存したぞ。

一度プログラムを終了し、再起動。そこでもう一度、前回の計画名を尋ねてみた。

ボブは「青いペンギン計画」を思い出せた。

おお、覚えてる。

もちろん、Gemmaのモデルそのものに知識を書き込んだわけではない。Macに保存した記録を、次の会話の際に読み込んで渡しただけだ。

でも、終了しても情報が残る。これは初めて体験するとかなり面白い。

なお、現時点で「重要な記憶をAIが自動で選んで登録する」機能はない。/memoは俺が手動で指示している。

Ver.0.7|全部思い出すのではなく、必要な記憶を探す

Ver.0.6では、直近の会話を最大12件と、重要メモを最大30件、質問と一緒にボブへ渡していた。

でも、記録が増えたらどうするのか。関係ない思い出まで毎回読ませるのは無駄じゃないか。

そこでVer.0.7では、質問に関係しそうな記憶を探してから渡すことにした。

ここで使ったのが、文章を2文字ずつに分けて比較する方法だ。

実際のコードはこちら。

def grams(s):
    s = normalize(s)
    if len(s) < 2:
        return {s} if s else set()
    return {s[i:i+2] for i in range(len(s)-1)}

例えば「赤いロボット」なら、「赤い」「いロ」「ロボ」「ボッ」「ット」に分ける。

質問と保存した記憶で、共通する2文字の組み合わせが多いほど、関連性が高そうだと判断する。質問文がそのまま記憶に含まれる場合は、最も高い評価にする処理もある。

その結果、関連度の高い記録を最大5件選び、直近4件の会話と一緒にGemmaへ渡す。

実際に思い出せるのか?

テストでは、架空の計画を2つ登録した。

  • 赤いロボット計画:動画の冒頭3秒を改善する。
  • 緑のカメ計画:中古ゲーム機の記事に購入前チェックリストを追加する。

その後、赤いロボット計画のことを尋ねると、ターミナルにはこう表示された。

ちゃんと赤いロボット計画の方を答えている。これは素直にうれしかった。

ただし、今回の関連度はAIが意味を理解した度合いではない。
文字の重なり具合を計算した数値だ。

関係ない記録が候補に混ざることもあるし、言い換えに弱い可能性もある。

Ver.0.7が最新版なら、もう全部できるのか?

ここは少しややこしい。

実は、できない。

今回確認したファイルでは、Ver.0.5のファイル操作とWikipedia調査、Ver.0.6の記憶保存、Ver.0.7の記憶検索が、それぞれ別のPythonプログラムとして存在している。

Ver.0.7という数字が一番大きいからといって、前の機能が全部入っているわけではない。

機能確認できた試作
テスト用.txtの読み込みVer.0.5
Wikipediaの検索Ver.0.5
実際の改善案を生成し、番号を確認Ver.0.5
会話履歴と手動メモの保存Ver.0.6
再起動後の記憶参照Ver.0.6
関連記憶を検索して回答Ver.0.7
全機能を一つのボブで利用まだ未実装
放っておいても仕事を継続するまだ未実装

しかも今のボブは、何をしても正しく判断できるわけではない。出典があっても間違える可能性はあるし、コード側のエラーも起こる。

これを「AI社員完成」と言ってしまうのは、ちょっと違うと思う。

将来は、ボブそのものを持ち運びたい

今のボブはMacBookの中にいる。

でも、いずれはAIモデル、人格設定、記憶、Pythonのプログラムをひとまとめにして、別のパソコンへ持っていけるようにしたい。

まずは手元にある外付けHDDに整理して保存する。余裕ができたらSSDへ。

もちろん、外付けストレージを接続しただけでAIが動くわけではない。

移動先にも対応する実行環境が必要で、MacからWindowsへ移すなら設定変更も必要になるだろう。

それでも、特定のパソコンだけに縛られず、記憶を引き継いだボブを連れていけるようにしたい。

そのためにも、記憶をデータベースとして分け、人格を設定ファイルとして持ち、道具をPythonで作っておくという方向性には意味がありそうだ。

プログラミング未経験でも、ローカルAI社員は作れるのか

今の段階で言えるのは、ChatGPTの助けを借りれば、ローカルAI社員の試作はできたということだ。

ただ、できたのはあくまで試作。

俺自身、コードを読んでもまだ分からない部分が多い。ChatGPTに書いてもらって、実行して、失敗したら直す。今はその繰り返しだ。

だからこそ、ボブが逆ギレしたことも、存在しない「上記」を参照し始めたことも、記憶検索に成功したことも、全部ちゃんと記録しておきたい。

次の目標は、バラバラの機能を統合して、普通の会話から記事分析も記憶検索も頼めるようにすること。

動画の自動カットをしたかっただけなのに、随分と大きな話になってきた。

PROJECT BOB、まだまだ続く。

※この記事は2026年10月時点の開発記録です。掲載コードは実際のModelfile、bob_v05.py、bob_v06.py、bob_v07.pyから抜粋・照合したものです。ただしコード全文の公開・配布用手順ではありません。実行ログは当時のテスト結果であり、性能や正確性を保証するものではありません。作業には架空のテストデータを使用しています。

-ガジェット・サービス
-