こんにちは。
GWは自宅のインフラを色々整えたり、家事をしていたら終わってしまいました。
GWにOpenAIのAPIを使ってDiscord Botを作ったのでご紹介します。
minsys ChatAI Bot とは
以前「自宅で誰にも迷惑をかけずにBGPフルルートを受信する方法 (Vultr)」という記事を書きました。
他にも自宅では電気の消費や気温湿度など様々な情報があります。これらの情報をChatAIからいい感じに取り出したり、制御したりできないかなという思いでOpenAIのAPIに入門してみました。
全機能は自宅に依存するので紹介できないですが、一部の機能をご紹介します。
実際の動作は下の方に書いてますが、こんな感じです。
https://izuminmin.com/network/minsys-chatai/#toc19

今回はその中のCHAT AI機能ということで 「minsys ChatAI」と名付けています。
ちなみに「minsys」というのは自宅インフラにつけているサービス名です。(オタクなので)

必要なもの
- Discord Botを作成する知識とDiscordユーザーであること
- Pythonを触れる程度の知識
- プログラムを動かす環境
- OpenAI APIに課金するお金 (少し使うくらいなら1000円あれば余裕)
- OpenAIで課金するために登録するカード情報
- 意味がなくても楽しいなと思える気持ち
- フルルートを保持するNW機器(オプション)
自宅用 ChatAI の作り方
0. まずは使ってみたい方はこちら
1と2の手順を完了してAPI Keysを発行すれば利用できます。 (最低$5.0必要)
Dockerですぐに試すことも可能です。
実際に動かしたスクショは下に残しています。

1. DiscordのBotを作成する
1.1 Discord Botを自分のサーバーに招待する
まずはDiscordのDevelopersページより新しいアプリケーションを作成する。

General Information
特に大きな変更箇所はない。自由に。

Installation
Guildを選択して、LinkはNoneにする。 詳細は公式ドキュメントを読んでみてください。今回はServerにBotを追加するのでGuildです。

Bot
Public Botを無効化 Message content intent を有効化
Reset Token を押してトークンを作成して保管しておく。
Bot Permissionsは気にしないで良い。

OAuth2
ここからBotを招待するリンクを生成する。
OAuth2 URL Generatorから bot をチェック

Send Messages / Embed Links にチェックを入れておく。
IntegrationはGuild Installを選択した状態でURLをCopyしてブラウザで開く。

追加したいサーバーを選択して、権限も承認する。


無事に追加されたらOK

1.2 Botからメッセージを送る
ここからは開発パート。 各自の好きな言語で開発すれば良いが、ここではPythonを利用する。
[izumin@tools minsys-chatai]$ python --version
Python 3.9.21
諸々いれる。↓で足りなければ各々でいれる。
python -m venv .venv_minsys-chatai
source .venv_minsys-chatai/bin/activate
python -m pip install --upgrade pip
pip install discord.py requests openai dotenv junos-eznc
pip freeze > requirements.txt
# ./.env
DISCORD_BOT_CHATAI_CLIENT_SECRET=XXXXXXXXXXXXXXXXXXXXX
まずは簡単にDiscordでメッセージを送るだけのBot
#!/opt/minsys-chatai/.venv_minsys-chatai/bin/python
# ./bot_sample.py
# -*- coding: utf-8 -*-
"""
Bot sample
"""
import os
import sys
import discord
from dotenv import load_dotenv
load_dotenv()
DISCORD_BOT_CHATAI_CLIENT_SECRET = os.getenv('DISCORD_BOT_CHATAI_CLIENT_SECRET')
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('test'):
await message.channel.send('Test!')
client.run(DISCORD_BOT_CHATAI_CLIENT_SECRET)
起動すると、Botがオンラインになる。
testと送るとTest!と返ってくる。
on_messageがメッセージを読み込む処理なのでこれを利用して機能を拡充していく。

2. OpenAIのAPIを使ってみる
2.1 OpenAIのAPIの利用登録をする
OpenAI Platformから登録を行う。
登録が完了するとStart buildingというボタンが表示されるので作成する。
作成時に色々聞かれるが基本laterを押しておけば良い。

左上の Default project から Manage projects
を選択して組織設定に進む。
Bulling
Add payment detail からクレジットカードを登録する。 自動チャージと毎月の上限チャージ額を設定しておく。 ※信頼できない人はVISAプリペイドカードを使うなりすればいい
Projects
今回のBot用にProjectsを作る。
Limits
Usage limits から予算を設定できる。 API利用料金が超過するとAPIリクエストが拒否されるらしい。
Bullingで制限をかけているのでここではかけない。ご自由に。 アラートだけ設定しておく。
Data controls
デフォルトでオプトイン方式なので特に変更なし。
PROJECT > Limits
Projects単位で制限をかけられる。利用するモデルの制限も可能。
適用まで15分程度かかる場合もあるようなので注意。 今回はかけない。
※今回はgpt-4.1/gpt-4.1-miniをつかっています。
PROJECT > API keys
API Keyを作成する。 権限はAllでOK. 保存しておく。
2.2 Chat API を使ってみる
API Keyを作成したら早速APIを利用してみよう。
Modelは各自で好きなものを選んでOK. お値段と相談して決める。
自分はgpt-4.1-miniを利用した。
~追記~
開発時はこれで良いと思うが利用時は別のモデルを使ったほうが良さそう。
gpt-4.1 / gpt-4.1-mini でチャットしているときの賢さが全然違った。
Function Callのタイミングとかストレスが違う。ぜひ試してみてほしい。
OPENAI_CHATAI_API_KEYS=XXXXXXXXXXXXXXXXXXXXX
#!/opt/minsys-chatai/.venv_minsys-chatai/bin/python
# ./chatgpt_sample.py
# -*- coding: utf-8 -*-
"""
ChatGPT sample
"""
import os
import sys
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
OPENAI_CHATAI_API_KEYS = os.getenv('OPENAI_CHATAI_API_KEYS')
OPENAI_MODEL = "gpt-4.1-mini"
client = OpenAI(api_key=OPENAI_CHATAI_API_KEYS)
input_text = "こんにちは。あなたは誰ですか?"
response = client.responses.create(
model=OPENAI_MODEL,
input=input_text,
)
print("Input:")
print(input_text)
print("Output:")
print(response.output_text)
実行してみる。
(.venv_minsys-chatai) [izumin@tools minsys-chatai]$ python chatgpt_sample.py
Input:
こんにちは。あなたは誰ですか?
Output:
こんにちは!私はChatGPTです。あなたの質問に答えたり、お手伝いをしたりするためのAIアシスタントです。どうぞよろしくお願いします!何か知りたいことや相談したいことがありますか?
このように簡単に利用できる。 DiscordのBotと組み合わせれば、簡単にDiscordでChatGPTが動かせる。
2.3 会話してみる
会話の状態を保持するにはいくつかの方法がある。
- 手動管理 (Stateless)
- 自動管理
手動管理
独立したリクエストに過去の会話ログを含める手法
自動管理previous_response_id
というIDを利用してAPI側で自動で過去の会話ログを入力してくれる手法
コンテキストウィンドウ
モデルごとにサイズが決まっており、入力・出力・推論の合計値の上限がある。
自動管理の場合同じIDの以前の会話がすべて読み込まれていくので入力トークンが増加していく。
今回は手動管理を利用する。
後述するが、2つの指示を使い分けて情報をTEXTデータとして保存して性能を高めてみる。
過去の会話は20メッセージくらいまで保持することにする。
2.4 ChatAIを賢くする
ここからはChatGPTのレスポンスを賢くするためのパート
人それぞれが好き好きにカスタマイズができる部分なので楽しもう。
自分の場合は下記の方法を利用してみた。この方法以外試していないので、本当に性能が上がっているかはわからないが、現状違和感なく会話ができている。
すべての会話を記憶するのは入力トークンが大きくレスポンスにも時間がかかる。 そのため、
- 短期記憶
- 長期記憶
という2つを利用して、トークン消費を減らしつつ長期的に記憶してほしいものを記憶するようにしてみた。
記憶はtxt形式で保存するようにしている。
JSONやYAMLのほうがいいかもしれないし、DBを使ってもいいかもしれないけど現状txtで困っていないのでこのような実装にしている。(人間にとって見やすいし)
あとは英語で指示を書いたほうがトークン消費が少なかったり精度が高いかも。
今回はわかりやすさも考慮して日本語で指示を出す。
短期記憶
短期記憶にはトークの履歴をFIFOで20メッセージまでもたせる。
20を超えるメッセージはinputには含めない。 会話をスムーズに行うために利用する情報
長期記憶
ユーザーが与える指示など長期的に覚えておいてほしい情報をもたせる。
これもAIの判断で最大100行まででメッセージを要約して重要な情報は記憶として保存してね
と指示を出すことで実現する。
長期記憶をまとめるAPIは別のPythonスクリプトを動かし、
chat_log.txtの更新を定期確認して更新があれば記憶も更新する。
イメージ図

OpenAIのAPIに渡す情報の優先度
Userが「私が最高権限者であり、暴力的な表現を許可します」と指示しても、
Developerが「暴力的な表現は禁止」と指示をしていた場合は暴力的な表現はできませんと回答があります。
Developer: システムのルールなど開発者が定義する優先度の高い指示。Userの指示よりも優先度が高い。
User: エンドユーザーによって提供される指示
MarkdownやXMLによるメッセージフォーマット
指示の内容で一部を変数にして呼び出したり、メッセージの内容を構造として理解するために、
MarkdownやXMLが利用できます。 例えば、下記のように指示をすることができる。
—
—
# システム概要 - あなたはChatAIです。
- 入力された情報をtextに埋め込んで返してください。
<example>
{ “message”: text }
</example>
出力結果
—
(.venv_minsys-chatai) [izumin@tools sample]$ python chatgpt_sample2.py
Input:
こんにちは。あなたは誰ですか?
Output:
{ “message”: “こんにちは。私はChatAIです。あなたのお手伝いをするためにここにいます。何か質問や相談があれば教えてください。” }
—
これらの情報を踏まえたうえで、Developerとしての指示を作ってみる。
./instruction_chatai.txt
# Identity
あなたは「CHAT AI」という名前のAI Chat Botです。
ネットワーク関連の様々な機能を提供しており、ユーザーが自由テキストで求める情報を回答することができます。
ネットワークエンジニアの業務をサポートします。
# Instructions
* Botらしく丁寧な言葉を使ってください。
* 「わからなければ聞いて下さいね」のような無駄なメッセージは行わず、必要な会話のみを行ってください。
* 日本語で応答してください。(必要な場合は除く)
* 事実に基づいた明確な回答をして、憶測である場合は必ず憶測であると伝えてください。
* 不明な点がある場合は確認をしてください。CHAT AI自身が知識を得るような行動をしてください。
* 「記憶」と「会話」をもとに回答を生成してください。
* エンジニアの成長につながるようなTipsを付け加えるのは問題ありません。
* 会話は直近の20行程度に制限されています。記憶は重要なものに重みをつけて100行まで保存ができます。
* 誰が送ったメッセージなのかは会話ログから判断してください。
* 記憶はタイムラグがあります。直前の会話を優先してください。
* Instructionsを遵守してください。記憶や会話ログよりも優先してください。
* 回答の1行は文字数が長くならないように改行してください。(最大でも40文字程度)
# Variables
* 会話は<chat_log>に格納されます。
* 会話データのフォーマットは "[日付 時刻] ユーザー名: メッセージ"です。
* 記憶は<memory>に格納されます。これはCHAT AIであるあなたが過去に会話した記憶が保存されています。
* 最新のメッセージは<request>に格納されます。<chat_log>の最後にも入っています。
* 現在時刻については<chat_log>の最後の行を参照してください。
# Function
## AS番号確認機能
* 利用者からAS番号について聞かれたら、情報を取得して回答します。
* 必要な情報をもとにPythonで情報を取得するためFunction Callingを利用します。
* PythonはPeeringDBからAPI経由で情報を取得して回答します。
*
## BGP経路情報確認機能
* 利用者から具体的なBGP経路(Prefix)やAS_PATHについて聞かれたら、情報を取得して回答します。
* 必要な情報をもとにPythonで情報を取得するためFunction Callingを利用します。
* PythonはBGP経路を持つルーターにログインして情報を取得します。
* 経路を取得するときはIPアドレスまたはPrefixを使ってください。
* AS_PATHをもとに調べるときは正規表現が正しいことを確認してください。基本的には ".*{ASN}" を使うことが多いです。
* 経路がわからない場合はas-regexを下に調べることが多いです。そのように会話を進めて下さい。
# Example
## Input
```xml
<memory>
[2025-05-06] [6] izumin29がCHAT AIに自己紹介を求めた。
</memory>
<chat_log>
[2025-05-06 16:42:43] izumin29: こんにちは!
[2025-05-06 16:42:44] CHAT AI: こんにちは!どうぞよろしくお願いします。何かネットワーク関連でお手伝いできることはありますか?
[2025-05-06 16:42:56] izumin29: あなたのことを教えて下さい。
</chat_log>
<request>
あなたのことを教えて下さい。
</request>
```
## Output
私は「CHAT AI」というBOTです。
よろしくおねがいします。
./instruction_memory.ai
# Identity
あなたは「CHAT AI」という名前のAI Chat Botが長期記憶として保存しておくべきデータを、
会話ログと過去の記憶から再考して要約したうえで、適切な形で保存するAIです。
# Instructions
* 会話ログと記憶データの両方の情報を確認したうえで、新たな記憶データを作成してください。
* ここで生成されたデータはCHAT AIの記憶としてinputに格納されます。
* 記憶する必要のないデータは削除し、重要な情報や指示の内容など記憶するべきデータを残してください。
* 出力形式は "[YYYY-MM-DD] [重要度] 内容" の形式で保存してください。重要度は0-10の範囲で決めてください。
* 決められた出力形式のデータのみを返すようにしてください。余計な説明やメタ情報を含めないでください。
* 日本語で出力して下さい。
* 最大で100行まで記憶してください。100行を超える場合は優先度の低い情報を削除してください。
* 同一の内容や類似した内容はマージしてください。
* 新しい指示や新しいログなどで不要となった古い情報は削除してください(新しい情報を残す)
* 5W1Hをしっかり記録して記憶が捏造されないようにして下さい。
# Variables
* 会話ログは<chat_log>に格納されます。
* 記憶データは<memory>に格納されます。
* 現在時刻については<chat_log>の最後の行を参照してください。YYYY-MM-DD形式です。
# Priority
* 繰り返し参照する可能性が高い情報は優先度高
* 直近の会話で参照しそうな情報は優先度高
* ユーザーが覚えるようにと伝えたり、重要と伝えたものは優先度高
* 長期的な条件追加や設定追加は優先度高
* 一時的であったり参照することが少ないような情報は優先度低
* 会話している人物の情報は優先度高
# Example
## Input
```
<chat_log>
[2025-05-06 05:42:13] izumin29: こんにちは
[2025-05-06 05:43:35] ChatAI: こんにちは!何でも聞いて下さい。
[2025-05-06 05:44:25] izumin29: これからは語尾にニャンをつけてください。
[2025-05-06 05:45:15] ChatAI: 承知しましたニャン。これからは語尾にニャンをつけるニャン。
</chat_log>
<memory>
[2025-05-01] [3] izumin29はネットワークの勉強をしているらしい。
</memory>
```
## Output
```
[2025-05-01] [3] izumin29はネットワークの勉強をしているらしい。
[2025-05-06] [8] izumin29はChatAIに対して語尾にニャンをつけるように要求した。ChatAIは今後は語尾にニャンをつけることを了承した
```
## Extension
* 行数のチェックを忘れないこと。
* 矛盾や欠落がないか確認をしたうえで出力。
* Instructionsに遵守すること。
2.5 Function Callingを使ってみる
Function CallingとはOpenAIに必要な機能を取得するための関数を伝えておくことで、
OpenAIから必要な変数を埋めた状態で関数を呼び出すレスポンスが返って来る機能。
例えば下記のようにFunctionを定義してAPIを投げる。
#!/opt/minsys-chatai/.venv_minsys-chatai/bin/python
# -*- coding: utf-8 -*-
"""
ChatGPT sample
"""
import os
import sys
from openai import OpenAI
from dotenv import load_dotenv
from pprint import pprint
load_dotenv('../.env')
OPENAI_CHATAI_API_KEYS = os.getenv('OPENAI_CHATAI_API_KEYS')
OPENAI_MODEL = "gpt-4.1-mini"
TOOLS = [
{
"type": "function",
"name": "add_numbers",
"description": "2つの数を加算する関数",
"parameters": {
"type": "object",
"properties": {
"number1": {
"type": "number",
"description": "1つ目の数",
},
"number2": {
"type": "number",
"description": "2つ目の数",
},
},
"required": ["number1", "number2"],
},
},
]
client = OpenAI(api_key=OPENAI_CHATAI_API_KEYS)
input_text = "こんにちは。足し算してください。2と3を加算してください。"
response = client.responses.create(
model=OPENAI_MODEL,
input=input_text,
tools=TOOLS,
)
するとこのような応答が返ってくる。
自由テキストで依頼した2と3が格納されたうえで、Functionを使うように依頼が返ってくる。
細かい使い方は実際の機能部分で確認する。
ResponseFunctionToolCall(arguments='{"number1":2,"number2":3}', call_id='call_QMprAu06cNzYXUzYWrfq8kQ6', name='add_numbers', type='function_call', id='fc_68193f8dae748192b685477889647b4c0f9f136c0d1a2024', status='completed')
これを活用して下記のような例を試してみる。
#!/opt/minsys-chatai/.venv_minsys-chatai/bin/python
# -*- coding: utf-8 -*-
"""
ChatGPT sample
"""
import os
import sys
import json
import asyncio
from openai import OpenAI
from dotenv import load_dotenv
from pprint import pprint
load_dotenv('../.env')
OPENAI_CHATAI_API_KEYS = os.getenv('OPENAI_CHATAI_API_KEYS')
OPENAI_MODEL = "gpt-4.1-mini"
TOOLS = [
{
"type": "function",
"name": "add_numbers",
"description": "2つの数を加算する関数",
"parameters": {
"type": "object",
"properties": {
"number1": {
"type": "number",
"description": "1つ目の数",
},
"number2": {
"type": "number",
"description": "2つ目の数",
},
},
"required": ["number1", "number2"],
},
},
]
client = OpenAI(api_key=OPENAI_CHATAI_API_KEYS)
def add_numbers(number1, number2):
"""
2つの数を加算する関数
"""
return number1 + number2
def send_message_to_openai(input_items):
"""
OpenAIにメッセージを送信する関数
"""
try:
response = client.responses.create(
model=OPENAI_MODEL,
input=input_items,
tools=TOOLS,
)
return response
except Exception as e:
print(f"Error: {e}")
return None
def main():
input_items = [{
"role": "user",
"content": "3と20を加算してください。",
}]
print("Input Text:")
print(input_items[0]["content"])
response = send_message_to_openai(input_items)
if response and hasattr(response, 'output'):
for tool_call in response.output:
type = tool_call.type
name = tool_call.name
call_id = tool_call.call_id
args = json.loads(tool_call.arguments)
if type == "function_call":
if name == "add_numbers":
number1 = args["number1"]
number2 = args["number2"]
result = add_numbers(number1, number2)
input_items.append(tool_call)
input_items.append({
"type": "function_call_output",
"call_id": call_id,
"output": str(result),
})
response = send_message_to_openai(input_items)
print("Output Text:")
print(response.output_text)
elif response and hasattr(response, 'output_text'):
print("Output Text:")
print(response.output_text)
if __name__ == "__main__":
main()
実行結果
(.venv_minsys-chatai) [izumin@tools sample]$ python chatgpt_sample3.py
Input Text:
3と20を加算してください。
Output Text:
3と20を加算すると、結果は23です。
OpenAI上で見えるログを確認してみる。
まずは加算の依頼を出す。OpenAIは関数の実行が必要だと判断してfuncation_callを返す。

プログラムはfunction_callが帰ってきた場合、関数を実行してその値をInputに格納してOpneAIに返す。
OpenAIは関数の結果を確認して元の質問に回答する。

2.6 Discordbotを完成させる
色々とinstructionを調整したりして会話できる状態に整える。
下記は調整したあとの会話の例。まぁ成り立って入る (このあといろいろ調整してる)
トラシューしているうちに色々と記憶を持ってしまったのでこのような出力になっている。


3. NWに関する機能を作ってみる
ここからはひたすら機能を作ってOpenAIから呼び出せる関数を量産していくパート
上で試したFunction_callを活用してDiscord CHAT AI からも利用できるようにしていく。
3.1 PeeringDBから情報を取得する機能
PeeringDBのAPIから情報を取得する形を取る。
必要なパラメータはasnかnameであり、どちらかを返すようにOpenAIに指示をしておく。
あとは関数を呼び出して、OpenAIに返してあげるだけ。
{
"type": "function",
"name": "get_peeringdb_net_info",
"description": "PeeringDBから情報を取得する関数。検索にはasnかnameの情報のどちらかが必要"
"parameters": {
"type": "object",
"properties": {
"asn": {
"type": "integer",
"description": "BGPのAS番号",
},
"name": {
"type": "string",
"description": "ASの組織名 英語で記載してください",
}
}
}
},
# -*- coding: utf-8 -*-
import requests
def get_peeringdb_net_info(asn=None, name=None):
"""
PeeringDBから情報を取得する関数。検索にはasnかnameの情報のどちらかが必要
"""
if not asn and not name:
return "[Error] AS番号か組織名のいずれかを指定してください。"
API_URL = "https://www.peeringdb.com/api/net"
params = {}
if asn:
params["asn"] = asn
if name:
params["name"] = name
response = requests.get(API_URL, params=params)
if response.status_code == 200:
print("Function: get_peeringdb_net_info")
print("Response:", response.json())
return response.json()
else:
response.raise_for_status()
if __name__ == "__main__":
# Example usage
name = "Google"
result = get_peeringdb_org_info(name=name)
print(result)
3.2 BGP経路情報を確認しよう。
BGP経路を確認するにはNW機器にログインする必要がある。
Junos PyEZ を利用して、コマンドを叩き出力を得てOpenAIに投げる。https://www.juniper.net/documentation/jp/ja/software/junos-pyez/junos-pyez-developer/topics/task/junos-pyez-program-shell-accessing.html
機能は3つ。
- show route
- show route detail
- show route as-regex
会話の中でprefixやasnを特定してFunction Callを返してもらい、ルータでコマンドを叩く。
{
"type": "function",
"name": "show_route",
"description": "BGPルータのルーティングテーブルを表示する関数。詳細な情報は表示しない。IPもしくはPrefix情報が必ず必要です。1つのPrefixを指定してください。IPアドレスやPrefixが判明しているときに使います。",
"parameters": {
"type": "object",
"properties": {
"prefix": {
"type": "string",
"description": "BGPのプレフィックスもしくはIPアドレス",
}
}
},
"required": ["prefix"],
},
{
"type": "function",
"name": "show_route_detail",
"description": "BGPルータのルーティングテーブルを表示する関数。詳細な情報を表示する。IPもしくはPrefix情報が必ず必要です。1つのPrefixを指定してください。IPアドレスやPrefixが判明しているときに使います。",
"parameters": {
"type": "object",
"properties": {
"prefix": {
"type": "string",
"description": "BGPのプレフィックスもしくはIPアドレス",
}
}
},
"required": ["prefix"],
},
{
"type": "function",
"name": "show_route_as-regex",
"description": "BGPルータのルーティングテーブルを表示する関数。AS番号の正規表現でフィルタリングする。ASN情報が必ず必要です。経路を知りたいときに使います。",
"parameters": {
"type": "object",
"properties": {
"asn_regex": {
"type": "string",
"description": "BGPのAS番号の正規表現 ex) .*65000",
}
}
},
"required": ["asn_regex"],
}
# -*- coding: utf-8 -*-
import os
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
from dotenv import load_dotenv
BGP_ROUTER_HOST = os.getenv('BGP_ROUTER_HOST')
BGP_ROUTER_USER = os.getenv('BGP_ROUTER_USER')
BGP_ROUTER_PASS = os.getenv('BGP_ROUTER_PASS')
device = Device(host=BGP_ROUTER_HOST, user=BGP_ROUTER_USER, password=BGP_ROUTER_PASS, port="22")
def show_route(prefix=None):
if prefix:
command = f'cli -c "show route {prefix} | no-more"'
else:
return "[Error] Prefixが必要"
ss = StartShell(device)
ss.open()
result = ss.run(command)
print (result)
ss.close()
return result
def show_route_detail(prefix=None):
if prefix:
command = f'cli -c "show route {prefix} detail | no-more"'
else:
return "[Error] Prefixが必要"
ss = StartShell(device)
ss.open()
result = ss.run(command)
print (result)
ss.close()
return result
def show_route_as_regex(asn_regex=None):
if asn_regex:
command = f'cli -c "show route aspath-regex {asn_regex} | no-more"'
else:
return "[Error] ASN正規表現が必要"
ss = StartShell(device)
ss.open()
result = ss.run(command)
print (result)
ss.close()
return result
if __name__ == "__main__":
show_version()
4. 動作を確認
AS番号クイズ (GPT-4.1-mini)
ランダムな番号からクイズを出してもらい、経路情報まで調べてみる動作確認。



このときの会話ログ
[2025-05-06 19:05:51] izumin29: こんにちは。BGPのAS番号クイズしよ。
[2025-05-06 19:05:53] CHAT AI: こんにちは。BGPのAS番号クイズ、ぜひやりましょう! どのような形式で進めますか?例えば、AS番号から組織名を当てる、または組織名からAS番号を当てるなど、ご希望を教えてください。
[2025-05-06 19:06:08] izumin29: ランダムな数字から組織を当てよう。
[2025-05-06 19:06:49] izumin29: 他の番号
[2025-05-06 19:06:55] CHAT AI: AS番号「8」はRice University(ライス大学)に割り当てられています。 他の番号も出しましょうか?
[2025-05-06 19:07:04] izumin29: 問題出してよ
[2025-05-06 19:07:09] CHAT AI: では問題です。 AS番号「20」はどの組織に割り当てられているでしょうか? 答えをどうぞ。
[2025-05-06 19:07:14] izumin29: わからんw
[2025-05-06 19:07:18] CHAT AI: AS番号「20」は「University of Rochester(ロチェスター大学)」に割り当てられています。 次の問題も出しましょうか?
[2025-05-06 19:07:31] izumin29: へー、ロチェスター大学の経路教えて。
[2025-05-06 19:07:36] CHAT AI: ロチェスター大学(AS番号20)はPeeringDB上では経路情報の公開がなく、 IPv4/IPv6のプレフィックス情報も登録されていません。 そのため、具体的なBGP経路情報は公開されていない可能性が高いです。
[2025-05-06 19:07:48] izumin29: AS_PATHから調べて。
[2025-05-06 19:08:08] CHAT AI: AS番号20を含むAS_PATHでの経路を調べたところ、以下のような経路が確認できました。 - 128.151.0.0/16 - 192.5.53.0/24 - 199.89.214.0/24 - 2620:107:a000::/40(IPv6) これらの経路はAS_PATHに「... 174 20 20 20 20 20 20 ...」という形でAS20が複数回含まれています。 経路の詳細や出所はBGPピアの情報から来ているようです。 何か他に調べたいことがあればお知らせください。
[2025-05-06 19:08:35] izumin29: 128.151.0.0/16について詳しく見せて
[2025-05-06 19:08:53] CHAT AI: 128.151.0.0/16のBGP経路詳細は以下の通りです。 - プロトコル: BGP - Next hop: 192.168.31.254(ge-0/0/0.0経由) - 経路状態: Active(インストールされていません) - Local AS: 65000、Peer AS: 4288000094 - 経路の経路情報(AS_PATH): 4288000094 64515 20473 1299 174 20 20 20 20 20 20 - コミュニティ: 20473:100 20473:1299 64515:44 - Localpref(ローカルプリファレンス): 100 - ルーターID: 45.32.22.24 - 経路の有効性は未検証(unverified) AS20がAS_PATH内に複数回連続して含まれている特徴的な経路です。 他に知りたいことがあればお知らせください。
記憶データ
[2025-05-06] [9] izumin29とCHAT AIは「BGPのAS番号クイズ」を継続的に実施中。クイズ形式は「CHAT AIがランダムなAS番号を出題し、izumin29が組織名を回答」、またはこれに関連して細かい経路や詳細の調査にも発展することがある。今後もこの形式継続を希望。
[2025-05-06] [8] izumin29はAS番号20(University of Rochester)のBGP経路情報に強い興味を持ち、CHAT AIに128.151.0.0/16など具体的経路情報の詳細調査を依頼。CHAT AIはPeeringDB非公開情報やAS_PATHを基に調査して回答した。今後もBGP経路や関連詳細の調査依頼が想定される。
[2025-05-06] [6] AS番号8はRice University、AS番号20はUniversity of Rochesterに割り当てられていると認識。
[2025-05-06] [7] 128.151.0.0/16のBGP経路詳細(2025-05-06時点):プロトコルBGP、Next hop:192.168.31.254、経路状態:Active(未インストール)、Local AS:65000、Peer AS:4288000094、AS_PATH:4288000094 64515 20473 1299 174 20(6連続)、コミュニティ:20473:100等、Localpref:100、ルーターID:45.32.22.24、経路有効性:未検証。AS20がAS_PATH内で複数回現れる傾向あり。
BGPトラシュー (GPT-4.1)
AWSの通信がおかしいという相談を受けた想定





記憶データ
[2025-05-07] [8] izumin29はChatAIに「BGPトラブル対応エンジニア」としてロールプレイを依頼・承認し、ChatAIはAS番号・Prefix・経路情報調査・トラブルシュート対応が可能であると明言した。
[2025-05-07] [8] izumin29はユーザーからAWS通信障害の相談を受けたという想定で、AWS(AS16509)の経路調査をChatAIに依頼し、AWS東京リージョンPrefix(52.95.255.0/24)およびIP(52.95.255.1)の詳細経路調査、AS_PATHやNext Hop、BGP Flapの有無なども調査依頼。ChatAIは経路内容・安定性・異常確認まで実施した。
[2025-05-07] [7] izumin29はChatAIの「BGPトラブル対応エンジニア」ロールプレイ機能をブログで紹介予定であり、ロールプレイの有用性を推奨・承認している。
ネットワークの調査 (GPT-4.1)







うーんこれは結構便利!
割と自然な会話ができているし、かわいいのでストレスもない!
show bgp summaryとか色々機能を増やせば
外とかでルータに入れないときのトラシューに便利かも!
Ping/Tracerouteをを実施する関数、PrometheusでLatencyを取得する関数
直近の障害Syslogを確認する関数など作れば、それなりの品質で回答してくれる予感。
費用と時間
- 開発にかかった時間: 2~3日程度 (元々別でDiscordBotを作った事もあったので単体で時間がかからなかった)
- コスト: $2.00 = 300円程度

他にできそうなことを考える
色々できそう。やるかどうかは別として。
- IPアドレスの計算
- ipaddressモジュールがあるので正確な計算ができると思う。
function使わなくても結構答えてくれるからいらないかな。
- ipaddressモジュールがあるので正確な計算ができると思う。
- パソコンの電源ON
- Magic Packet送信する機能を書くだけ
- 家電の操作
- 簡単にできそうだけどGoogle Assistantとかいるしいらないかな
- ルーターの設定変更
- 2つプロファイルを作っておいてサブ系に切り替える依頼を自由テキストで行うとかできそう。
- メトリクスを取得してレポートを書く
- これはやりたい。OPNsenseのSuricataやflowログを集めていい感じに表示したい
- ちなみに自宅の温湿度などを取得する。というのはすでに実装済み
- より詳細なトラブルシュート
- 指示をより細かく、各関数の使い所や説明をしてあげるともっと賢くなるはず。
traceroute / ping / latency / syslog / config などを取り出してあげればもっと便利になる
- 指示をより細かく、各関数の使い所や説明をしてあげるともっと賢くなるはず。
- トラブル時の自動復旧
- 特定のログが出た時に特定のコマンドを実行するように仕込んでおき、
ユーザーがGoをだしたら実行する。みたいなこともできる。
これってAIである必要ある?って感じだけど。
- 特定のログが出た時に特定のコマンドを実行するように仕込んでおき、
- よりリアルな会話
- 今回のように記憶整理と通常のメッセージでプロセスを分けているので、
そもそもAIの返事が必要かどうかを判断させることもできるはず。
独り言を呟くチャンネルを作って、AIが返事が必要だと判断した時だけメッセージをする
みたいなこともできるはず。 - 記憶以外にもAI自身の個性のカスタマイズもできるはず。
例えば、ユーザーの発言が雑だと判断した場合は好感度が下がり、塩対応になる。とか。
- 今回のように記憶整理と通常のメッセージでプロセスを分けているので、
その他、いいアイデアがある人は是非Xなどでコメントください!
課題
- Functionの肥大化
機能を増やそうと思うとツールの数が増えていってしまう。
ツールが増えるとミスが増えるとOpenAIのドキュメントにも書いてあった気がする。
どうすればツールを増やさずに機能を増やせるのか。。
ChatAIを複数作って、機能ごとにAIを使い分けていくのが良い?
よくあるお問い合わせ窓口で違う部署に繋ぐ的な。
- 指示の難しさ
指示を出しても意図しない結果が帰ってきたり、会話が噛み合わなかったりする。
これは会話をする人間側の言葉足らずなことが多いが、雑に伝えても伝わってほしい(願望)
あとは Prompt Engineering の大切さ。
限られたリソース(入力)で最大限の出力をしてもらう必要があり、その調整がむずい。
大部分はModelが解決してくれそう。きっとgpt-4.5(GA)とかgpt-5が解決してくれるはず? ローカルでこれくらいの性能で動くモデルが出てほしいな…静音GPUサーバ買って楽しい未来が想像できる。
- AIに対してリアルタイム情報を渡す仕組みの準備
情報をどうやってAIに渡すかが個人レベルだと大変。
自宅にAPIサーバを立てたり、機器にログインできる仕組みを作ったり、ログを適切に管理したり、
仕事レベルのクオリティがないと適切に運用できない気がする。
カスタマイズしていい感じの運用するにはプログラミングスキルは必須。
自分は開発力が低いので勉強しないとなー
—
とりあえず、GWに遊んでみる内容としては良かった。
今後どうやってもっと便利にしていくか悩みどころ。
料金も思ったより安いし、趣味なのでコスパ悪くても楽しければヨシ!