0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第1回LLMロボット作成

0
Posted at

はじめに

今回は、自作ローカル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の精度のすごさを身をもって感じた。あれだけの速度と精度を出すために、どれだけの計算資源が使われているかがよくわかった。

今週は研究とかで忙しくて、あまり個人開発ができなかったので、来週はもう少し時間を取ってできるように頑張りたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?