AI 기능 개요~
AoT는 MCP(Model Context Protocol) 기반 AI 에이전트를 통해 온실·재배 시설의 환경을 관찰·진단·제어합니다. AI는 시스템을 보조하는 역할로, 상태를 바꾸는 모든 동작은 사용자 승인 후 실행됩니다.
AI 시스템 구조~
AoT의 AI는 두 가지 경로로 도구를 사용합니다.
- 인앱 AI 어시스턴트 — 대시보드의 채팅 어시스턴트. 단일 에이전트 루프가 전체 도구 카탈로그를 보고 스스로 도구를 선택·실행합니다. 상태를 바꾸는 동작(장치 제어, 엔티티 생성·수정·삭제 등)은 채팅의 승인 카드로 사용자 확인을 받은 뒤 실행됩니다.
- 외부 MCP 서버 —
aot/aot_mcp_server.py(표준 MCP 프로토콜, stdio/HTTP). Claude Desktop 같은 외부 MCP 클라이언트가 AoT 도구를 직접 호출할 수 있게 노출합니다.
사용자 채팅 ─────────────┐ 외부 MCP 클라이언트(Claude Desktop 등)
↓ ↓
인앱 에이전트 루프 aot_mcp_server.py (stdio/HTTP)
└──────────┬───────────────┘
↓
도구 레지스트리 (tool_registry.py, 단일 소스)
↓
AoT 시스템 (Daemon / InfluxDB / SQLite)
두 경로 모두 같은 도구 레지스트리(aot/ai/services/tool_registry.py)에서 도구를 가져오므로 목록이 서로 어긋나지 않습니다.
MCP 도구 목록~
외부 MCP 서버와 내부 mcp_aot 엔진이 노출하는 도구입니다. 읽기 도구는 즉시 실행되고, 제어·일정 도구는 인앱 어시스턴트에서 호출될 때 승인 게이트를 거칩니다.
관찰·조회 (읽기 — 즉시 실행)~
| 도구 | 설명 |
|---|---|
get_spatial_tree | 공간 계층(사이트 > 구역 > 장치) 트리 |
get_device_list | 등록된 전체 장치(입력·출력·카메라) 목록 |
search_devices | 이름·유형 키워드로 장치 검색 |
get_sensor_detail | 센서 시계열 이력 (min/max/avg 통계) |
get_weather | 포장·구역의 현재 기상 (기온·습도·풍속·강수) |
get_energy_report | 기간·구역별 에너지 사용량 리포트 |
get_cumulative_status | EnvCoordinator DLI(일적산광량)·GDD(누적온도) 상태 |
search_notes | 구역·장치에 부착된 노트/메모/작업기록 조회 |
list_notices | 공지 게시판 글 목록 |
get_system_update_status | 설치 버전 vs GitHub 최신 릴리스 비교 |
list_available_devices | AI 판단 대상 장치 목록 (네이티브 브리지) |
get_sensor_reading | 특정 센서의 최신 측정값 (네이티브 브리지) |
기록·작업~
| 도구 | 설명 | 승인 |
|---|---|---|
create_note | 날짜 없는 메모/노트를 대상 엔티티에 부착해 즉시 저장 | 불필요 |
add_schedule | 사람이 수행할 작업 일정(제초·점검·청소 등) 등록 | 필요 |
제어 (사용자 승인 필요)~
| 도구 | 설명 |
|---|---|
operate_device | 밸브·펌프·조명 등 즉시 물리 제어 |
set_output_state | 출력 장치 on/off (선택적 지속시간, 네이티브 브리지) |
schedule_device_control | 특정 시각 1회성 장치 제어 예약 |
인앱 어시스턴트에서는 위 제어·
add_schedule호출이 승인 카드로 확인을 받은 뒤 실행됩니다. 외부 MCP 서버로 직접 호출할 때는 자체 승인 게이트가 없으므로, 제어 도구까지 노출되는 이 서버는 신뢰할 수 있는 클라이언트에만 연결하세요.
인앱 어시스턴트 확장 도구~
인앱 AI 어시스턴트는 위 MCP 카탈로그 외에 엔티티 조립·자동화·지식까지 다루는 확장 도구를 추가로 사용합니다. 상태를 바꾸는 도구는 모두 승인이 필요합니다.
- 입력/출력 관리:
list_device_types,get_device_type_options,create_input·modify_input·delete_input,create_output·modify_output·delete_output,get_device_measurements - 함수(자동화):
get_function_list,create_function,create_sequence_function,modify_function_options,activate_function·deactivate_function·delete_function - 일정 원장:
search_schedule,edit_schedule,delete_schedule - 지도(GIS):
list_geo_maps,get_device_location,set_device_location,delete_geo_shape - 공지 게시판:
create_notice·modify_notice·delete_notice - AI 에이전트 관리:
list_ai_agents,list_ai_entries,create_ai_agent·modify_ai_agent·delete_ai_agent - 지식 라이브러리:
knowledge_search,knowledge_shelve,list_library_source_types,smartfarmkorea_lookup,configure_library_source - 진단·기타:
analyze_system_failure,get_local_time,get_tool_detail,read_manual,get_detailed_manifest,ask_user
도구의 단일 정본은
aot/ai/services/tool_registry.py입니다. 도구가 추가·변경되면 이 문서보다 그 파일이 우선합니다.
장치별 AI 판단 포함 여부~
설정 -> 입력 / 설정 -> 출력의 각 장치 설정 모달에는 AI 판단 포함(Include in AI Judgment) 토글이 있습니다.
- 켜짐(기본값): 해당 입력/출력이 AI 판단·제어 도구(공간 트리, 장치 조회, 센서·제어 도구 등)에 노출됩니다.
- 꺼짐: 해당 장치는 위 도구들의 조회·제어 대상에서 제외됩니다. 민감한 장치나 AI가 다루면 안 되는 장치를 개별적으로 숨길 때 사용하세요.
신규 입력/출력은 기본적으로 켜진 상태(is_ai_enabled=True)로 생성됩니다.
안전·승인 모델~
상태를 바꾸지 않는 읽기 도구는 즉시 실행됩니다. 상태를 바꾸는 도구는 인앱 어시스턴트에서 호출될 때 승인 게이트를 거칩니다.
- 승인 필요(변이·물리 제어): 장치 제어(
operate_device,set_output_state,schedule_device_control), 입력/출력/함수/공지/AI 에이전트의 생성·수정·삭제, 지도 배치 변경(set_device_location,delete_geo_shape),add_schedule,configure_library_source등. - 승인 불필요(저위험 기록):
create_note,knowledge_shelve— 되돌릴 수 있는 개인 메모/미확인 지식으로 즉시 저장되며, 확정 전까지 권위 없는 정보로 취급됩니다.
승인이 필요한 동작은 즉시 적용되지 않고 채팅에 승인 카드로 제시됩니다. 사용자가 승인해야 실제로 실행되며, 거부하면 아무 변경도 일어나지 않습니다.
지식 라이브러리 (Knowledge Library)~
AI -> 라이브러리(/ai/library) 페이지에서 AI 답변의 근거가 되는 컨텍스트 소스를 등록합니다. 문서(PDF·텍스트), 웹 URL, REST API, 내부 쿼리를 소스로 추가할 수 있습니다.
지식 다이제스트 파이프라인~
문서·웹 URL처럼 긴 산문형 소스는 등록 시 한 번만 전처리됩니다.
- 소스를 여러 청크(chunk)로 분할합니다.
- 각 청크를 LLM으로 요약(digest) + 키워드 추출하여
ai_knowledge_chunk테이블에 캐시합니다. - 질의 시점에는 LLM 호출 없이 DB 조회 + 결정론적 검색만 수행합니다 → 답변이 빠르고 비용이 낮습니다.
각 청크는 컨텍스트 레코드와 동일한 3단계 신뢰 파이프라인(system_generated → pending → user_confirmed)을 재사용하므로, 문서형 지식도 같은 검토 UX로 승인·관리합니다.
멀티사이트 스코핑 (facility_id)~
각 청크는 소스의 facility_id(사이트/시설 경계)를 함께 저장합니다. 지식 검색은 이 값으로 필터링됩니다.
- 사이트 A에 업로드한 문서는 사이트 B의 답변에 절대 노출되지 않습니다.
facility_id없이 검색하면 라이브러리 지식이 모두 제외됩니다(교차-사이트 유출을 막기 위한 의도된 동작이며, 단순 무필터가 아닙니다).
이 스코핑은 여러 시설을 한 시스템에서 운영할 때 각 시설의 매뉴얼·재배 지침이 서로 섞이지 않도록 보장합니다.
MCP 서버 실행~
외부 MCP 클라이언트용 표준 MCP 서버입니다. 앱 시작 시 자동으로 warm-start되며, 수동 실행도 가능합니다.
# stdio 모드 (기본) — Claude Desktop 등 로컬 클라이언트
python3 /opt/AoT/aot/aot_mcp_server.py
# HTTP 모드 — 원격 클라이언트 (기본 포트 5700)
python3 /opt/AoT/aot/aot_mcp_server.py --http --port 5700
Claude Desktop에서 연결하려면 claude_desktop_config.json에 추가합니다:
이 서버는 도구를 호출된 대로 실행합니다(자체 승인 게이트 없음). 제어 도구까지 노출되므로 신뢰할 수 있는 클라이언트에만 연결하세요. 승인 카드는 인앱 어시스턴트 경로에만 적용됩니다.