Skip to content

Commit db42a3a

Browse files
committed
add an example help desk agent
1 parent 5bf2fd4 commit db42a3a

File tree

11 files changed

+209
-11
lines changed

11 files changed

+209
-11
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,3 @@ cython_debug/
163163
*.env
164164
requirements.txt
165165
assets/
166-
data/

data/qa_kabuto.csv

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
q,a
2+
KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。,この現象は、「シノビ・プロトコル」が初期化フェーズで、内部クロックと外部クロックの同期に失敗している場合に発生します。KABUTO本体を再起動する前に、必ず接続されているすべての周辺機器を5秒以上、電源から抜いてください。これにより、外部クロックのキャッシュがクリアされ、同期が正常に行われる可能性が高まります。
3+
特定のアプリケーション「鬼灯」を実行すると、KABUTOのファンが急に停止し、無音になります。,「鬼灯」は、その特殊な演算処理において、KABUTOの冷却システム「風魔の術」を一時的に停止させ、内部エネルギーの流れを最適化する機能を持っています。これは異常ではありません。ただし、無音状態が15分以上続く場合は、過熱の可能性があるため、アプリケーションを強制終了し、KABUTO本体の電源を一度切ってから再起動してください。
4+
KABUTOのログイン画面で、パスワードを正しく入力しても、ログインが拒否され、「虚無」と表示されます。,「虚無」エラーは、パスワード自体が破損しているのではなく、KABUTOのセキュリティモジュール「百鬼夜行」が、ログイン試行者の「精神波形」を解析し、登録されたユーザーと一致しないと判断した場合に表示されます。これは、疲労やストレスなどによる精神状態の変化が原因で起こることがあります。一度、深呼吸をして落ち着き、再度ログインをお試しください。解決しない場合は、KABUTO本体の電源を抜いて30秒待ち、再起動してください。
5+
KABUTOの電源ランプが、赤と青の交互点滅ではなく、緑色で点滅しています。,通常、電源ランプは赤(待機中)と青(稼働中)の点滅を繰り返します。緑色の点滅は、KABUTOが「禅モード」に入っており、パフォーマンスを最小限に抑え、バックグラウンドでシステム自己修復を行っている状態を示します。この状態では、ユーザー操作はほとんど受け付けられません。このモードから強制的に脱出するには、KABUTO本体の「龍玉」ボタンを5秒以上長押ししてください。
6+
KABUTOに接続したディスプレイの画面が、常に白黒で表示され、カラー表示に切り替わりません。,この現象は、KABUTOの映像出力モジュール「玉手箱」が、接続されたディスプレイの「魂」を認識できていない場合に発生します。これは、ディスプレイの電源ケーブルを抜き差しすることで解消されることが多いですが、解決しない場合は、KABUTO本体とディスプレイを接続するケーブルを、接続の向きを逆にして接続し直してみてください。(このシステムでは、特殊なケーブルを使用しているため、両端が同じ形状になっています。)
7+
KABUTOを起動すると、デスクトップ上のアイコンがすべて逆さまに表示されます。,この現象は、「天狗のいたずら」と呼ばれる稀なバグで、システムクロックが過去の時間に一時的に戻ることで発生します。この状態はシステムパフォーマンスには影響しませんが、不便な場合は、KABUTO本体の「龍玉」ボタンを、音量を最大にした状態で3回連続で押してください。これにより、システムクロックが強制的に現在時刻に再設定されます。
8+
KABUTOでテキストを入力していると、特定の文字(「か」「ぶ」「と」)が、自動的にカタカナに変換されてしまいます。,この現象は、KABUTOに内蔵されたAIアシスタント「ヤタガラス」が、ユーザーの入力内容を予測し、システムの基幹言語である「KABUTO語」に最適化しようとしているために発生します。この機能を一時的に停止するには、入力中に「Ctrl」キーと「Shift」キーを同時に押しながら「KABUTO」と入力してください。
9+
KABUTOの電源をOFFにした後も、本体から微かな「波の音」のような音が聞こえます。,これは、KABUTOが「夢の海」と呼ばれる待機モードに入っている状態で、次回の起動をより高速にするために、一部の内部回路が微弱な電流を流し続けているために聞こえる音です。この音はシステムが正常に動作している証拠であり、異常ではありません。気になる場合は、KABUTOの電源ケーブルを完全に抜いてください。
10+
KABUTOをネットワークに接続すると、他のデバイスから認識されなくなり、通信ができません。,KABUTOのネットワークモジュール「隠れ蓑」は、外部からの不要なスキャンを避けるため、通常はステルスモードで動作します。ネットワーク上でKABUTOを可視化させるには、KABUTOのネットワーク設定画面で「忍びの道」オプションを有効にしてください。これにより、KABUTOが一時的にネットワーク上で可視化されます。
11+
KABUTOの画面の隅に、時々「狐火」のような光の点が、不規則に現れては消えます。,「狐火」は、KABUTOの演算コア「稲荷」が、膨大な量のタスクを処理しきれずに、一部の計算結果が視覚的なノイズとして現れている現象です。これは、システム負荷が高いことを示しています。この現象が頻繁に発生する場合は、バックグラウンドで動作している不要なアプリケーションを終了させるか、KABUTOを再起動してください。
12+
KABUTOのファイル管理画面で、特定のフォルダ名が漢字で表示されているにも関わらず、ひらがなとして読み取られます。,この現象は、KABUTOのファイルシステム「竜宮城」が、フォルダ名に含まれる特定の文字を「時空の歪み」と認識し、異なる文字コードで読み込んでいるために発生します。この問題を解消するには、KABUTOのシステム設定で「読み方優先モード」を一時的に無効にしてください。
13+
KABUTOに外部ストレージを接続しても、認識されず、代わりに「幽霊」というアイコンが表示されます。,「幽霊」アイコンは、外部ストレージが、KABUTOのセキュリティプロトコル「陰陽道」によって、外部から持ち込まれた「邪気」を持つデバイスとして認識された場合に表示されます。この問題を解決するには、外部ストレージを一度フォーマットし、再度接続してください。
14+
KABUTOでスクリーンショットを撮ると、画面全体ではなく、画面の中央に円形の領域だけが切り取られて保存されます。,この現象は、KABUTOのスクリーンショット機能「万華鏡」が、「視点」を認識し、ユーザーが見ているものだけを切り取る「集中モード」に入っているために発生します。画面全体を保存したい場合は、スクリーンショットを撮る際に、マウスカーソルを画面の隅に移動させてから操作してください。
15+
KABUTOで動画を再生すると、音声が正常に聞こえますが、映像が「水墨画」のようにモノクロで、筆で描かれたような動きになります。,この現象は、KABUTOの映像処理モジュール「葛飾北斎」が、再生中の動画が古い形式であると判断し、独自の「浮世絵」フィルターを自動的に適用しているために発生します。この機能を無効にするには、再生中の動画を右クリックし、「葛飾北斎」オプションをオフにしてください。
16+
KABUTOを起動すると、システムの背景画像が、ユーザーが最後に見た「夢」の内容に変わっています。,これは、KABUTOの高度なAI機能「天照」が、ユーザーの無意識下での情報収集を行い、システムをパーソナライズしようとしているために発生します。この機能を停止するには、KABUTOのシステム設定で「天照の予知夢」オプションを無効にしてください。この設定を無効にした場合、KABUTOのパフォーマンスの一部が低下する可能性があります。

docs/index.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,17 @@
33
## Operations
44

55
```bash
6+
# Delete collection from Qdrant
7+
uv run python -m template_langgraph.tasks.delete_qdrant_collection
8+
69
# Add documents to Qdrant
710
uv run python -m template_langgraph.tasks.add_documents_to_qdrant
11+
12+
# Search Qdrant
13+
uv run python -m template_langgraph.tasks.search_documents_on_qdrant
14+
15+
# Run Kabuto Helpdesk Agent
16+
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。"
817
```
918

1019
## References

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,4 @@ environment = { python-version = "3.10" }
6262
[tool.ty.rules]
6363
unknown-argument = "ignore"
6464
invalid-parameter-default = "ignore"
65+
non-subscriptable = "ignore"

template_langgraph/agents/__init__.py

Whitespace-only changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from langgraph.prebuilt import create_react_agent
2+
3+
from template_langgraph.llms.azure_openais import AzureOpenAiWrapper
4+
from template_langgraph.loggers import get_logger
5+
from template_langgraph.tools.qdrants import search_qdrant
6+
7+
logger = get_logger(__name__)
8+
9+
10+
class KabutoHelpdeskAgent:
11+
def __init__(self, tools=None):
12+
if tools is None:
13+
tools = [search_qdrant] # Default tool for searching Qdrant
14+
self.agent = create_react_agent(
15+
model=AzureOpenAiWrapper().chat_model,
16+
tools=tools,
17+
prompt="KABUTO に関する質問に答えるために、必要な情報を収集し適切な回答を提供します",
18+
debug=True,
19+
)
20+
21+
def run(self, question: str) -> dict:
22+
logger.info(f"Running KabutoHelpdeskAgent with question: {question}")
23+
return self.agent.invoke(
24+
{
25+
"messages": [
26+
{
27+
"role": "user",
28+
"content": question,
29+
},
30+
]
31+
}
32+
)

template_langgraph/tasks/add_documents_to_qdrant.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,42 @@
88
from template_langgraph.tools.qdrants import QdrantClientWrapper
99

1010
logger = get_logger(__name__)
11-
logger.setLevel(logging.INFO)
12-
COLLECTION_NAME = "documents"
11+
logger.setLevel(logging.DEBUG)
12+
COLLECTION_NAME = "qa_kabuto"
1313

1414
if __name__ == "__main__":
1515
# Load documents from CSV files
1616
documents = CsvLoaderWrapper().load_csv_docs()
1717
logger.info(f"Loaded {len(documents)} documents from CSV.")
1818

19-
# hardcoded collection name for demonstration purposes
20-
21-
logger.info(f"Upserting {len(documents)} documents into Qdrant collection: {COLLECTION_NAME}")
2219
points = []
20+
embedding_wrapper = AzureOpenAiWrapper()
2321
for i, doc in enumerate(documents):
2422
logger.debug(f"Processing document {i}: {doc.metadata.get('source', 'unknown')}")
25-
content = doc.page_content
26-
content = content.replace(" ", "")
27-
embedding = AzureOpenAiWrapper().create_embedding(content)
23+
content = doc.page_content.replace("\n", " ")
24+
logger.debug(f"Creating embedding for document {i} with content: {content[:50]}...")
25+
vector = embedding_wrapper.create_embedding(content)
2826
points.append(
2927
PointStruct(
3028
id=i,
31-
vector=embedding,
29+
vector=vector,
3230
payload={
3331
"file_name": doc.metadata.get("source", f"doc_{i}"),
3432
"content": content,
3533
},
3634
)
3735
)
3836

37+
# Create Qdrant collection and upsert points
38+
logger.info(f"Creating Qdrant collection: {COLLECTION_NAME}")
3939
qdrant_client = QdrantClientWrapper()
4040
qdrant_client.create_collection(
4141
collection_name=COLLECTION_NAME,
4242
vector_size=len(points[0].vector) if points else 1536, # default vector size
4343
)
4444

45-
logger.info(f"Created Qdrant collection: {COLLECTION_NAME}")
45+
# Upsert points into the Qdrant collection
46+
logger.info(f"Upserting points into Qdrant collection: {COLLECTION_NAME}")
4647
operation_info = qdrant_client.upsert_points(
4748
collection_name=COLLECTION_NAME,
4849
points=points,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import logging
2+
3+
from template_langgraph.loggers import get_logger
4+
from template_langgraph.tools.qdrants import QdrantClientWrapper
5+
6+
logger = get_logger(__name__)
7+
logger.setLevel(logging.DEBUG)
8+
COLLECTION_NAME = "qa_kabuto"
9+
10+
if __name__ == "__main__":
11+
logger.info(f"Deleting Qdrant collection: {COLLECTION_NAME}")
12+
result = QdrantClientWrapper().delete_collection(
13+
collection_name=COLLECTION_NAME,
14+
)
15+
if result:
16+
logger.info(f"Successfully deleted Qdrant collection: {COLLECTION_NAME}")
17+
else:
18+
logger.warning(f"Qdrant collection {COLLECTION_NAME} does not exist or could not be deleted.")
19+
logger.info("Deletion task completed.")
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import logging
2+
import sys
3+
4+
from langchain_core.tools import tool
5+
6+
from template_langgraph.agents.kabuto_helpdesk_agent import KabutoHelpdeskAgent
7+
from template_langgraph.loggers import get_logger
8+
9+
10+
@tool
11+
def get_weather(city: str) -> str:
12+
"""天気情報を取得します"""
13+
return f"{city}は晴れです"
14+
15+
16+
logger = get_logger(__name__)
17+
logger.setLevel(logging.INFO)
18+
COLLECTION_NAME = "documents"
19+
20+
if __name__ == "__main__":
21+
question = "「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。"
22+
if len(sys.argv) > 1:
23+
# sys.argv[1] が最初の引数
24+
question = sys.argv[1]
25+
26+
logger.info(f"質問: {question}")
27+
28+
agent = KabutoHelpdeskAgent(
29+
tools=None, # ツールはカスタムせず、デフォルトのツールを使用
30+
)
31+
response = agent.run(
32+
question=question,
33+
)
34+
logger.info(f"Agent result: {response}")
35+
36+
# エージェントの応答を表示
37+
logger.info(f"Answer: {response['messages'][-1].content}")
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import logging
2+
3+
from template_langgraph.llms.azure_openais import AzureOpenAiWrapper
4+
from template_langgraph.loggers import get_logger
5+
from template_langgraph.tools.qdrants import QdrantClientWrapper
6+
7+
logger = get_logger(__name__)
8+
logger.setLevel(logging.INFO)
9+
COLLECTION_NAME = "qa_kabuto"
10+
11+
if __name__ == "__main__":
12+
question = "「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。"
13+
qdrant_client = QdrantClientWrapper()
14+
15+
results = qdrant_client.query_points(
16+
collection_name=COLLECTION_NAME,
17+
query=AzureOpenAiWrapper().create_embedding(question),
18+
)
19+
logger.info(f"Found {len(results)} results for the question: {question}")
20+
for result in results:
21+
logger.info(f"File Name: {result.payload['file_name']}")
22+
logger.info(f"Content: {result.payload['content']}")
23+
logger.info("-" * 40)

0 commit comments

Comments
 (0)