はじめに
今回は、自作ローカルLLMロボットの第1段階として、頭脳部分であるローカルLLMをCPUのみ・RAM16GBのノートPCで実装した。
使用したもの
Ollama
ローカルLLMを手軽に動かすためのツールとしてOllamaを使用した。
インストール後、以下のコマンドでモデルをダウンロードする。
ollama pull qwen3:1.7b
モデルの選定
今回試したモデルはこの2つ。
| モデル | サイズ | 速度 |
|---|---|---|
| qwen3:4b | 約3GB | 重くて実用困難 |
| qwen3:1.7b | 約1.5GB | なんとか動く |
CPUのみだとqwen3:4bでも実用には厳しく、今回はqwen3:1.7bを採用した。
フォルダー構成
robotti/
├── README.md
├── .gitignore
├── brain/
│ └── chat.py
├── data/
│ └── logs/
└── db/ # 自動生成
1. チャット機能
まずはシンプルにチャットできるコードから。
from langchain_ollama import OllamaLLM
MODEL = "qwen3:1.7b"
llm = OllamaLLM(model=MODEL, temperature=0.7)
print("chat開始(じゃあねで終わり)")
while True:
question = input("僕: ")
if question == "じゃあね":
break
response = llm.invoke(question)
print(f"robotti: {response}\n")
めちゃくちゃ遅い。 商業用のすごさを感じました。
2. ログ記録機能
チャット終了時に会話を自動保存する機能を追加した。
from langchain_ollama import OllamaLLM
import os
from datetime import date
MODEL = "qwen3:1.7b"
llm = OllamaLLM(model=MODEL, temperature=0.7)
log = []
log_dir = "data/logs"
os.makedirs(log_dir, exist_ok=True)
log_path = f"{log_dir}/{date.today()}.txt"
print("chat開始(じゃあねで終わり)")
while True:
question = input("僕: ")
if question == "じゃあね":
with open(log_path, "w", encoding="utf-8") as f:
f.write("\n".join(log))
print("ログを保存しました")
break
response = llm.invoke(question)
print(f"robotti: {response}\n")
log.append(f"hiroi: {question}")
log.append(f"robotti: {response}")
「じゃあね」と入力するとdata/logs/日付.txtに保存される。
実際に記録できた内容がこれです。
僕: 私の今日の予定は、個人開発をすることです
robotti: 今日は個人開発を進めることにしましたね!
それなら、以下のステップを試してみてください。
### 1. **予算と目標の設定**
- 今週末までに「完成形」の目標を決めてみましょう。
- 例:「今週末に基本機能を実装する」「3週間後にプロダクトバージョンを出す」など。
### 2. **タスクの分解**
- 大きなタスクを小さな「作業」に分解。
- 例:
- 「UIデザイン」→「フロントエンドのコード作成」
- 「機能実装」→「APIの作成」「データベースの設定」
### 3. **ツールの活用**
- **タスク管理**:TrelloやNotionで進捗を管理。
- **コード管理**:Gitでリポジトリを作成し、自分のコードを追跡。
- **デザイン**:FigmaやAdobe XDでUIをデザインし、コードに反映。
### 4. **時間管理**
- 20〜30分の短時間に集中し、1〜2時間の間隔で作業。
- 例:
- 19:00〜20:30:UIデザイン
- 20:30〜22:00:コード作成
### 5. **休息の取り方**
- 1時間ごとに「休憩」を取る。
- 例:「5分だけ目を閉じて呼吸」や「ストレッチ」で体のケア。
### 6. **進捗の確認**
- 週末に「今週の進捗」を確認し、次のステップに移す。
お手伝いできることがあれば、いつでもご相談くださいね!💪
どんなに小さなことでも、積み重ねて進んでいきますよ!
3. RAG(ログを参照して回答)
保存したログをベクトルDBに読み込み、質問に関連するログを検索して回答に使う仕組みを追加した。
from langchain_ollama import OllamaLLM, OllamaEmbeddings
from langchain_chroma import Chroma
from langchain_core.documents import Document
import os
from datetime import date
MODEL = "qwen3:1.7b"
llm = OllamaLLM(model=MODEL, temperature=0.7)
log = []
log_dir = "data/logs"
os.makedirs(log_dir, exist_ok=True)
log_path = f"{log_dir}/{date.today()}.txt"
# ログを読み込む
docs = []
for filename in os.listdir(log_dir):
if filename.endswith(".txt"):
with open(f"{log_dir}/{filename}", "r", encoding="utf-8") as f:
docs.append(Document(page_content=f.read()))
# ベクトルDB構築
embeddings = OllamaEmbeddings(model="nomic-embed-text")
db = Chroma.from_documents(docs, embeddings, persist_directory="./db")
print("chat開始(じゃあねで終わり)")
while True:
question = input("僕: ")
if question == "じゃあね":
with open(log_path, "w", encoding="utf-8") as f:
f.write("\n".join(log))
print("ログを保存しました")
break
# 関連ログを検索
related = db.similarity_search(question, k=2)
context = "\n".join([d.page_content for d in related])
prompt = f"""以下の記録を参考に答えてください。記録がない場合は普通に答えてください。
記録:
{context}
質問: {question}
"""
response = llm.invoke(prompt)
print(f"robotti: {response}\n")
log.append(f"hiroi: {question}")
log.append(f"robotti: {response}")
結果
僕: 今日の予定は?短めに教えて
robotti: 今日の予定は、個人開発をすることです。
終わりに
今回はローカルLLMを初めて動かしてみた。
日頃触れている生成AIの精度のすごさを身をもって感じた。あれだけの速度と精度を出すために、どれだけの計算資源が使われているかがよくわかった。
今週は研究とかで忙しくて、あまり個人開発ができなかったので、来週はもう少し時間を取ってできるように頑張りたい。