AIエージェントを無料で簡単に作成する方法
AIエージェントを無料で作成し、簡単に実行する方法
目的:お金をかけず(無料)・手早く(数十分)・確実に動く「最小エージェント」を作って実行する方法を検討しました。おすすめは“ローカルLLM+小さなPythonスクリプト”です。クラウドの無料枠に依存せず、PCだけで完結します。
概要(3通り)
- 最短おすすめ:Ollama(無料・ローカルLLM)+60行Pythonでミニエージェント
- ノーコード系:Flowise(無料・GUI)+Ollamaでドラッグ&ドロップ
- 自動化系:n8n Desktop(無料)+Ollamaで「トリガー→LLM→通知」
まずは「最短おすすめ」の手順から。
手順A:Ollama+Pythonで“無料・最小エージェント”を作る
- 準備(macOS / Windows / Linux)
- macOS: brew install ollama; ollama serve
- Windows: インストーラー実行後、Ollamaアプリを起動(サービスが立ち上がります)
- Linux: curl -fsSL 🔗 https://ollama.com/install.sh | sh
- モデル取得(軽量でOK):
- ollama pull llama3.2
- 代替: ollama pull qwen2.5:3b など(PC性能に応じて)
- 動作確認:
- ollama run llama3.2
- 対話できれば準備完了(Ctrl+Cで終了)
- 最小エージェントのコード(約70行)
- ツール(電卓・現在時刻JST)をホワイトリストで用意
- LLMには「必ずJSONで返す」指示
- “思考→ツール実行→結果を再観測→次の一手”を最大8手で反復
mini_agent_ollama.py
import json, re, requests
from datetime import datetime
from zoneinfo import ZoneInfo
# -------- ツール定義(安全のためホワイトリスト) --------
def tool_calculator(expression: str) -> str:
if not re.fullmatch(r"[0-9+\-*/().\s]+", expression):
return "安全のため数式以外は不可。"
try:
return str(eval(expression, {"__builtins__": {}}, {}))
except Exception as e:
return f"計算エラー: {e}"
def tool_time_jst() -> str:
return datetime.now(ZoneInfo("Asia/Tokyo")).strftime("%Y-%m-%d %H:%M:%S")
TOOLS = {
"calculator": tool_calculator,
"time_jst": tool_time_jst,
}
# -------- LLM(Ollamaのchat API, モデルはllama3.2想定) --------
OLLAMA_URL = "http://localhost:11434/api/chat"
MODEL = "llama3.2"
SYSTEM_PROMPT = (
"あなたは小さなAIエージェントです。必ずJSONで返答してください。"
'形式は {"action":"tool","name":"<tool_name>","args":{...}} '
'または {"action":"final","output":"..."}。'
f"利用可能ツール: {list(TOOLS.keys())}。"
"複数手順が必要なら、適切な順にtoolを呼び、最後にfinalを返してください。"
)
def call_llm(messages):
payload = {"model": MODEL, "messages": messages, "stream": False}
r = requests.post(OLLAMA_URL, json=payload, timeout=120)
r.raise_for_status()
data = r.json()
# Ollamaは data['message']['content'] に応答が入る
content = (data.get("message") or {}).get("content", "")
# モデルがJSON以外を返す保険
try:
return json.loads(content)
except Exception:
# JSONでない場合は、再度JSON形式を促す
return {"action": "final", "output": f"JSON以外の応答を受信: {content[:200]}"}
def main():
goal = input("エージェントへの依頼を入力してください: ").strip()
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": goal},
]
for _ in range(8): # 最大8手で打ち切り(無限ループ防止)
resp = call_llm(messages)
if resp.get("action") == "final":
print("最終回答:", resp.get("output", ""))
break
if resp.get("action") == "tool":
name = resp.get("name")
args = resp.get("args", {}) or {}
if name not in TOOLS:
tool_result = f"未許可のツール: {name}"
else:
try:
tool = TOOLS[name]
tool_result = tool(**args) if args else tool()
except TypeError:
tool_result = "引数が不正です。"
except Exception as e:
tool_result = f"ツール実行エラー: {e}"
# ツール結果を“観測”として再入力
messages.append({"role": "user", "content": f"ツール結果: {tool_result}\n続けて。JSONで。"})
else:
messages.append({"role": "user", "content": "必ず指定のJSON形式で返答してください。"})
else:
print("手数上限に達しました。")
if __name__ == "__main__":
main()
- 実行
- Python 3.10以上を用意(Windows/macOS/Linuxいずれも可)
- python mini_agent_ollama.py
- 例の依頼:
- 「3*(4+5)を計算してから、日本時間も教えて」
- 「家計の計算: (1250+980)*3 を計算後、時刻を教える」
- 期待動作:
- LLMがJSONで“calculator”→結果取得→“time_jst”→最終回答 という反復を自動で行い、最後に人間向けの出力を返します
- よくあるつまずき(対処)
- JSONで返ってこない: SYSTEM_PROMPTで“必ずJSON”を強調。上記コードは保険あり
- 応答が遅い/CPUが重い: さらに小さいモデルへ変更(例: qwen2.5:1.8b 等)。タスク難易度を下げる
- 日本語の指示が苦手: 先頭に「以後、日本語で回答」と1行追加
- ループが長引く: 反復上限(8手)を厳しめに、あるいは目的を具体化(例: “計算→時刻→完了と宣言”)
手順B:ノーコード/ローコードで無料エージェント
- Flowise(無料・GUI)
- Node.js環境で npx flowise start
- ブラウザでFlowiseを開く→“LLMノード”に“Local (Ollama)”を選択→モデルに llama3.2
- “Tools”ノードに「計算(Code Executor)」「JST時刻(Function)」を配置
- “Agent”ノード(ReAct/Tool Calling)で接続→チャットUIで実行
- n8n Desktop(無料・GUI)
- n8n Desktopを起動→“HTTP Request”で Ollama /api/chat を呼び出すノードを作成
- “Function”ノードでツール(計算/時刻)を実装
- “If”ノードで action=="tool" を分岐→実行→再度HTTPへ戻すループを構成
- Slack/メール通知ノードをつないで“結果を届ける”まで自動化
無料で作るときのコツ
- 完全ローカルで始める: 料金・鍵管理・利用規約を気にせず検証できる
- ツールは最小限+ホワイトリスト: “電卓/時刻/メモ保存”の3つ程度から
- 出力形式を固定: “必ずJSON”とし、パースできなければ再要求
- 手数上限・タイムアウトを設定: 迷走や外部API停止に強くなる
- ログを残す: 入出力・ツール実行・例外をprint→慣れたらファイル保存