Skip to content

Commit 2a3ac57

Browse files
authored
Merge pull request #8 from ks6088ts-labs/feature/issue-7_elastic-search-tool
add elastic search tool
2 parents 787ed3e + 7785ba6 commit 2a3ac57

13 files changed

+437
-1
lines changed

.env.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ CSV_LOADER_DATA_DIR_PATH="./data"
1313

1414
# Qdrant Settings
1515
QDRANT_URL="http://localhost:6333"
16+
17+
# Elasticsearch Settings
18+
ELASTICSEARCH_URL="http://localhost:9200"

data/docs_kabuto.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# KABUTOシステム仕様書
2+
3+
## 第1章 KABUTOシステム概要
4+
5+
本仕様書は、独自技術に基づき開発された高次元演算処理システム「KABUTO」のシステム構成、動作原理、および特殊機能について記述する。KABUTOは、従来のコンピューティングパラダイムとは一線を画す、生体情報および精神波形との同期を基盤としたシステムであり、その動作は多岐にわたる特殊なプロトコルによって制御される。システムの各モジュールは、固有の名称と機能を持ち、相互に複雑な作用を及ぼし合う。
6+
7+
---
8+
9+
## 第2章 ハードウェア・インターフェース
10+
11+
### 2.1 電源・起動システム
12+
13+
KABUTOの電源ランプは、通常の動作状態を以下のパターンで表示する。待機状態では赤色点滅、稼働状態では青色点滅が繰り返される。このパターンにない緑色の点滅は、システムが「**禅モード**」に移行していることを示す。禅モードでは、パフォーマンスが最小限に抑えられ、バックグラウンドでのシステム自己修復が実行される。このモードからの強制離脱は、KABUTO本体に設置された「**龍玉**」ボタンを5秒以上長押しすることで可能となる。また、電源OFF後も微細な電流が流れ続ける「**夢の海**」と呼ばれる待機モードが存在し、これにより次回の起動高速化が図られる。この際、本体から微かな波の音が聞こえるが、これは正常な動作である。
14+
15+
### 2.2 映像出力システム
16+
17+
KABUTOの映像出力モジュール「**玉手箱**」は、接続されたディスプレイの固有情報(「魂」)を認識し、適切なカラー表示を行う。この認識に失敗した場合、画面は白黒表示となる。この事象は、接続ケーブルの抜き差し、または特殊な両端同形状ケーブルの接続向きを逆にして再接続することで解消される場合がある。
18+
19+
### 2.3 冷却システム
20+
21+
システム冷却は、特殊な流体冷却機構「**風魔の術**」によって制御される。特定の演算処理を伴うアプリケーション「鬼灯」の実行中は、冷却システムが一時的に停止し、無音となる。これは内部エネルギーの流れを最適化するための仕様であり、異常ではない。ただし、この無音状態が15分以上継続する場合は、過熱の可能性があるため、アプリケーションの強制終了およびシステムの再起動が推奨される。
22+
23+
---
24+
25+
## 第3章 ソフトウェア・オペレーション
26+
27+
### 3.1 起動プロトコル
28+
29+
KABUTOの起動シーケンスは、「**シノビ・プロトコル**」に基づき実行される。このプロトコルの初期化フェーズで、内部クロックと接続された外部周辺機器のクロックとの同期に失敗した場合、画面全体が紫色に点滅し、システムがフリーズする。この問題は、KABUTO本体の再起動前に、すべての周辺機器を5秒以上電源から抜くことで、外部クロックのキャッシュがクリアされ、同期が正常に行われる可能性が高まる。
30+
31+
### 3.2 セキュリティ・認証システム
32+
33+
ログイン認証は、パスワード入力に加え、セキュリティモジュール「**百鬼夜行**」によるログイン試行者の「**精神波形**」解析を伴う。パスワードが正しく入力された場合でも、精神波形が登録されたユーザーと一致しないと判断された場合、「**虚無**」エラーが表示され、ログインは拒否される。これは疲労やストレスによる精神状態の変化が原因である可能性があり、深呼吸による精神状態の安定化が解決策となる。
34+
35+
### 3.3 ネットワーク・通信
36+
37+
ネットワークモジュール「**隠れ蓑**」は、外部からの不必要なスキャンを回避するため、デフォルトでステルスモードで動作する。これにより、ネットワーク上の他のデバイスから認識されない状態となる。KABUTOをネットワーク上で可視化させるには、ネットワーク設定画面から「**忍びの道**」オプションを有効にする必要がある。
38+
39+
### 3.4 演算コア
40+
41+
KABUTOの演算コア「**稲荷**」は、膨大な演算処理能力を持つ。しかし、システム負荷が極端に高い場合、演算結果の一部が視覚的なノイズとして画面の隅に不規則な光の点(「**狐火**」)として現れることがある。これはシステム負荷の過大を示す兆候であり、不要なバックグラウンドアプリケーションを終了させるか、システムを再起動することで解消される。
42+
43+
---
44+
45+
## 第4章 ユーザー・インターフェース機能
46+
47+
### 4.1 ファイルシステム
48+
49+
ファイルシステム「**竜宮城**」は、特定の文字を「**時空の歪み**」として認識し、文字コードの誤読が発生することがある。これにより、漢字で表示されている特定のフォルダ名が、ひらがなとして読み取られる現象が発生する。この問題を解消するには、システム設定にて「**読み方優先モード**」を一時的に無効化する必要がある。
50+
51+
### 4.2 入力・AIアシスタント
52+
53+
内蔵AIアシスタント「**ヤタガラス**」は、ユーザーの入力内容を予測し、システムの基幹言語である「**KABUTO語**」に最適化しようとする機能を持つ。これにより、特定の文字が自動的にカタカナに変換される現象が発生する。この機能を一時的に停止するには、入力中に`Ctrl`キーと`Shift`キーを同時に押しながら「KABUTO」と入力する。
54+
55+
### 4.3 スクリーンショット機能
56+
57+
スクリーンショット機能「**万華鏡**」は、ユーザーの「**視点**」を認識し、見ている領域のみを円形に切り取る「**集中モード**」を自動で適用する場合がある。画面全体を保存したい場合は、スクリーンショット実行時にマウスカーソルを画面の隅に移動させてから操作する必要がある。
58+
59+
### 4.4 映像処理フィルター
60+
61+
映像処理モジュール「**葛飾北斎**」は、動画形式を自動で判断し、独自の「**浮世絵**」フィルターを適用する場合がある。この機能が有効化されると、映像が「水墨画」のようにモノクロで、筆で描かれたような動きになる。この機能を無効にするには、動画再生中に右クリックメニューから「葛飾北斎」オプションをオフにする。
62+
63+
### 4.5 システム・パーソナライゼーション
64+
65+
高度なAI機能「**天照**」は、ユーザーの無意識下での情報を収集し、デスクトップの背景画像をユーザーの最後に見た「夢」の内容に変更する機能を持つ。この機能を停止するには、システム設定内の「**天照の予知夢**」オプションを無効化する。ただし、この設定の無効化は、KABUTOの全体的なパフォーマンスの一部低下を招く可能性がある。
66+
67+
---
68+
69+
## 第5章 バグ・特殊現象
70+
71+
ごく稀に、システムクロックが過去の時間に一時的に戻ることで発生する「**天狗のいたずら**」と呼ばれる現象が発生する。この現象では、デスクトップ上のアイコンがすべて逆さまに表示される。この状態はパフォーマンスには影響しないが、龍玉ボタンを音量を最大にした状態で3回連続で押すことで、システムクロックが強制的に再設定され、現象が解消される。

data/docs_kabuto.pdf

516 KB
Binary file not shown.

docker-compose.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,15 @@ services:
66
- "6333:6333" # Dashboard: http://localhost:6333/dashboard
77
volumes:
88
- ./assets/qdrant_data:/qdrant/storage
9+
elasticsearch:
10+
build:
11+
dockerfile: elasticsearch.Dockerfile
12+
container_name: elasticsearch
13+
ports:
14+
- "9200:9200"
15+
- "9300:9300"
16+
environment:
17+
- discovery.type=single-node
18+
- xpack.security.enabled=false
19+
volumes:
20+
- ./assets/es_data:/usr/share/elasticsearch/data

docs/index.md

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

55
```bash
6+
# Start Docker containers
7+
docker compose up -d
8+
69
# Delete collection from Qdrant
710
uv run python -m template_langgraph.tasks.delete_qdrant_collection
811

@@ -12,8 +15,15 @@ uv run python -m template_langgraph.tasks.add_documents_to_qdrant
1215
# Search Qdrant
1316
uv run python -m template_langgraph.tasks.search_documents_on_qdrant
1417

18+
# Add documents to Elasticsearch
19+
uv run python -m template_langgraph.tasks.add_documents_to_elasticsearch
20+
21+
# Search Elasticsearch
22+
uv run python -m template_langgraph.tasks.search_documents_on_elasticsearch
23+
1524
# Run Kabuto Helpdesk Agent
1625
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。"
26+
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOのマニュアルから禅モードに関する情報を教えて下さい"
1727
```
1828

1929
## References

elasticsearch.Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM docker.elastic.co/elasticsearch/elasticsearch:9.1.0
2+
3+
RUN bin/elasticsearch-plugin install analysis-kuromoji
4+
RUN bin/elasticsearch-plugin install analysis-icu

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ description = "A GitHub template repository for Python"
55
readme = "README.md"
66
requires-python = ">=3.10"
77
dependencies = [
8+
"elasticsearch>=9.1.0",
89
"langchain-community>=0.3.27",
910
"langchain-openai>=0.3.28",
1011
"langchain-text-splitters>=0.3.9",
1112
"langgraph>=0.6.2",
1213
"openai>=1.98.0",
1314
"pydantic-settings>=2.9.1",
15+
"pypdf>=5.9.0",
1416
"python-dotenv>=1.1.0",
1517
"qdrant-client>=1.15.1",
1618
"typer>=0.16.0",

template_langgraph/agents/kabuto_helpdesk_agent.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from template_langgraph.llms.azure_openais import AzureOpenAiWrapper
44
from template_langgraph.loggers import get_logger
5+
from template_langgraph.tools.elasticsearch_tool import search_elasticsearch
56
from template_langgraph.tools.qdrants import search_qdrant
67

78
logger = get_logger(__name__)
@@ -10,7 +11,12 @@
1011
class KabutoHelpdeskAgent:
1112
def __init__(self, tools=None):
1213
if tools is None:
13-
tools = [search_qdrant] # Default tool for searching Qdrant
14+
# Default tool for searching Qdrant
15+
tools = [
16+
search_qdrant,
17+
search_elasticsearch,
18+
# Add other tools as needed
19+
]
1420
self.agent = create_react_agent(
1521
model=AzureOpenAiWrapper().chat_model,
1622
tools=tools,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import logging
2+
3+
from template_langgraph.loggers import get_logger
4+
from template_langgraph.tools.elasticsearch_tool import ElasticsearchClientWrapper
5+
from template_langgraph.tools.pdf_loaders import PdfLoaderWrapper
6+
7+
logger = get_logger(__name__)
8+
logger.setLevel(logging.DEBUG)
9+
COLLECTION_NAME = "docs_kabuto"
10+
11+
if __name__ == "__main__":
12+
# Create Elasticsearch index
13+
es = ElasticsearchClientWrapper()
14+
logger.info(f"Creating Elasticsearch index: {COLLECTION_NAME}")
15+
result = es.create_index(
16+
index_name=COLLECTION_NAME,
17+
)
18+
if result:
19+
logger.info(f"Created Elasticsearch index: {COLLECTION_NAME}")
20+
else:
21+
logger.warning(f"Index {COLLECTION_NAME} already exists.")
22+
23+
# Load documents from PDF files
24+
documents = PdfLoaderWrapper().load_pdf_docs()
25+
logger.info(f"Loaded {len(documents)} documents from PDF.")
26+
27+
# Add documents to Elasticsearch index
28+
result = es.add_documents(
29+
index_name=COLLECTION_NAME,
30+
documents=documents,
31+
)
32+
if result:
33+
logger.info(f"Added {len(documents)} documents to Elasticsearch index: {COLLECTION_NAME}")
34+
else:
35+
logger.error(f"Failed to add documents to Elasticsearch index: {COLLECTION_NAME}")
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.loggers import get_logger
4+
from template_langgraph.tools.elasticsearch_tool import ElasticsearchClientWrapper
5+
6+
logger = get_logger(__name__)
7+
logger.setLevel(logging.INFO)
8+
COLLECTION_NAME = "docs_kabuto"
9+
10+
if __name__ == "__main__":
11+
query = "禅モード"
12+
es = ElasticsearchClientWrapper()
13+
14+
results = es.search(
15+
index_name=COLLECTION_NAME,
16+
query=query,
17+
)
18+
logger.info(f"Found {len(results)} results for the question: {query}")
19+
for i, result in enumerate(results, start=1):
20+
logger.info(f"Result {i}:")
21+
logger.info(f"File Name: {result.metadata['source']}")
22+
logger.info(f"Content: {result.page_content}")
23+
logger.info("-" * 40)

0 commit comments

Comments
 (0)