自宅で無料にエージェントを構築する:オープンソースのツールとモデル
無料ツールとオープンソースモデルだけを使って、ラップトップで動く完全なマルチエージェントシステムを構築できる。クレジットカード不要、APIレート制限なし、ベンダーロックインなし。代償は?推論が遅く、能力がやや低いこと。しかし学習、実験、小規模な自動化には十分すぎるほどだ。
このガイドの終わりには、自分のハードウェアで動くローカル研究エージェントができあがる——ウェブ検索、ファイル読み取り、情報の合成——すべて無料で。
オープンソースエージェント開発の理由
コストの現実
Claude APIの価格は本番ワークロードには合理的だが、学習と実験はすぐに積み重なる。ローカル推論はこの懸念を完全に排除する——ゼロの限界コストで無限のイテレーション。
プライバシーとデータ管理
一部のワークロードはクラウドAPIに送れない。患者データ、独自コード、機密ビジネスロジック——すべてが自分のマシンに留まることで恩恵を受ける。ローカルモデルは、データがハードウェアを離れることなく同じ知的な動作を提供する。
現実確認
7〜13Bパラメータのオープンソースモデルは、複雑な推論、コード生成、指示への従順さでフロンティアモデルに明らかに劣る。精度が重要な本番環境では、商用APIが依然として最善の選択だ。学習とプロトタイピングには、ローカルモデルは優れている。
オープンソースLLMの選択
LLMファミリー
- Llama(Meta):最も広くサポートされているファミリー。Llama 3は特に有能。
- Mistral:優れた品質/パラメータ比。Mistral-7Bはそのサイズを上回る。
- Phi(Microsoft):非常に効率的な小型モデル。Phi-3 MiniはGPUなしで動作。
- Qwen(Alibaba):強力な多言語性能。
モデルサイズとハードウェア要件
| モデル | パラメータ | 量子化 | VRAM | 速度 | 品質 |
|---|---|---|---|---|---|
| Phi-3 Mini | 3.8B | 4-bit | 4GB | 非常に速い | 良好 |
| Mistral-7B | 7B | 4-bit | 8GB | 速い | 良好 |
| Llama-3-8B | 8B | 4-bit | 8GB | 速い | とても良好 |
| Llama-3-13B | 13B | 4-bit | 10GB | 中程度 | とても良好 |
| Mixtral-8x7B | 46.7B (MoE) | 4-bit | 24GB | 遅い | 優秀 |
量子化:なぜ重要か
量子化はメモリ使用量を減らすためにモデルの重みを圧縮する。7Bパラメータのモデルは完全精度で約28GBのRAMが必要。同じモデルを4-bit量子化すると約4GBになり、品質の低下はわずかだ。
ハードウェア別の出発点:
- ラップトップ(8〜16GB RAM): Phi-3 MiniまたはMistral-7Bの4-bit
- 中程度のGPU搭載デスクトップ: GPUアクセラレーションでMistral-7BまたはLlama-3-8B
- 高性能GPU搭載デスクトップ: Mixtral-8x7BまたはLlama-3-70Bの4-bit
ローカル推論のセットアップ
Ollama:最も簡単な入り口
# macOSにインストールbrew install ollama
# Linuxにインストールcurl -fsSL https://ollama.com/install.sh | sh
# Mistral-7Bをダウンロードollama pull mistral
# 低速ハードウェア向けの軽量オプションollama pull phi3
# 推論サーバーを起動ollama serve動作確認:
curl http://localhost:11434/api/generate -d '{ "model": "mistral", "prompt": "AIエージェントとは一言で何か?", "stream": false}'LM Studio:GUIの代替手段
LM Studioは、モデルをダウンロードして実行するためのグラフィカルインターフェースを提供するデスクトップアプリケーション。OpenAI互換のAPIエンドポイントを公開する。
オープンソースエージェントフレームワーク
| フレームワーク | 最適な用途 | 学習曲線 |
|---|---|---|
| LangChain | 広範なツールサポート | 中程度 |
| LangGraph | ステートマシンワークフロー | 中〜高 |
| AutoGen | マルチエージェント会話 | 低 |
| CrewAI | ロールベースのマルチエージェント | 低〜中 |
AutoGenまたはLangChainから始めよう。 AutoGenはプロトタイピングが速い;LangChainはエージェントループをより制御できる。
最初のエージェントを構築する:ローカル研究アシスタント
環境セットアップ
python3 -m venv agent-envsource agent-env/bin/activatepip install langchain langchain-ollama langchain-community duckduckgo-search完全なエージェント
#!/usr/bin/env python3"""Ollama + LangChainを使ったローカル研究エージェント前提条件: - ollama serve(バックグラウンドで実行中) - ollama pull mistral - pip install langchain langchain-ollama langchain-community duckduckgo-search"""
import jsonfrom langchain_core.tools import toolfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_ollama import ChatOllamafrom langchain.agents import AgentExecutor, create_react_agentfrom duckduckgo_search import DDGS
@tooldef search_web(query: str) -> str: """DuckDuckGoを使ってウェブで情報を検索する。""" try: with DDGS() as ddgs: results = list(ddgs.text(query, max_results=5)) if not results: return "結果が見つかりませんでした。" return json.dumps( [{"title": r["title"], "snippet": r["body"], "url": r["href"]} for r in results], indent=2, ensure_ascii=False ) except Exception as e: return f"検索に失敗しました:{e}"
@tooldef read_file(filepath: str) -> str: """ローカルファイルを読み取りその内容を返す。""" try: with open(filepath, "r") as f: return f.read() except FileNotFoundError: return f"ファイルが見つかりません:{filepath}"
@tooldef calculate(expression: str) -> str: """単純な算術式を安全に評価する。""" try: result = eval(expression, {"__builtins__": {}}, {}) return str(result) except Exception as e: return f"計算エラー:{e}"
llm = ChatOllama( model="mistral", base_url="http://localhost:11434", temperature=0.3,)
prompt = ChatPromptTemplate.from_messages([ ("system", """あなたは研究アシスタントです。ツールを使って質問に答えてください。
利用可能なツール:{tool_names}ツールの説明:{tools}
このフォーマットに正確に従ってください:Thought: 何を調べる必要があるか?Action: ツール名Action Input: ツールへの入力Observation: ツールの結果...(必要に応じて繰り返す)Thought: 今、十分な情報がある。Final Answer: あなたの完全な答え"""), ("user", "{input}"), ("placeholder", "{agent_scratchpad}"),])
tools = [search_web, read_file, calculate]agent = create_react_agent(llm, tools, prompt)agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, max_iterations=8, handle_parsing_errors=True,)
if __name__ == "__main__": result = agent_executor.invoke({ "input": "今最も人気のあるオープンソースLLM三つは何ですか?名前とそれぞれの主要な特徴を教えてください。" }) print(f"\n最終回答:\n{result['output']}")実行
# ターミナル1:Ollamaを起動ollama serve
# ターミナル2:エージェントを実行python research_agent.py能力の拡張:APIなしのツール
ローカルデータベースアクセス
import sqlite3
@tooldef query_database(sql: str) -> str: """ローカルデータベースで読み取り専用SQLクエリを実行する。""" try: conn = sqlite3.connect("data.db") cursor = conn.cursor() cursor.execute(sql) rows = cursor.fetchall() columns = [desc[0] for desc in cursor.description] conn.close() return json.dumps([dict(zip(columns, row)) for row in rows], indent=2) except Exception as e: return f"データベースエラー:{e}"埋め込みによるローカル文書検索
pip install sentence-transformers chromadbfrom sentence_transformers import SentenceTransformerimport chromadb
model = SentenceTransformer("all-MiniLM-L6-v2")client = chromadb.Client()collection = client.create_collection("docs")
@tooldef search_docs(query: str) -> str: """意味的類似性でローカル文書を検索する。""" results = collection.query( query_embeddings=[model.encode(query).tolist()], n_results=3 ) return json.dumps(results["documents"][0], indent=2)現実世界の制約と解決策
レイテンシ
推論ステップごとに2〜30秒を見込もう。戦略:
- より少ないステップでエージェントを設計する;シンプルほど速い
- 可能な場合はツール呼び出しをまとめる
精度のギャップ
軽減策:
- より短く明示的なプロンプト — 期待するフォーマットを正確に指定する
- 複雑なタスクをステップに分解する
- ツールの出力をエージェントに返す前に検証する
- ツール使用には0.1〜0.3の温度を使用する
デプロイメント:ラップトップから常時稼働へ
Docker
FROM python:3.12-slimRUN pip install langchain langchain-ollama langchain-community duckduckgo-searchCOPY research_agent.py .ENV OLLAMA_HOST=host.docker.internal:11434CMD ["python3", "research_agent.py"]Systemdサービス(Linux)
sudo systemctl enable ollamasudo systemctl start ollamaより深く:自宅でのマルチエージェントシステム
def run_pipeline(question: str) -> str: research_result = researcher.invoke({"input": question}) final_output = writer.invoke({ "input": f"この調査に基づいて、明確な要約を書いてください:\n{research_result['output']}" }) return final_output["output"]オープンソースエージェント開発は今日実用的だ。道筋はこうだ:推論にOllama、エージェントループにLangChainまたはAutoGen、検索にDuckDuckGo、残りすべてに自分のマシンのファイルシステム。
シンプルに始めよう——上の研究エージェントから。動かそう。そして2つ目のツールを追加する。次に2つ目のエージェントを。