botserver/KB_SYSTEM_COMPLETE.md
Rodrigo Rodriguez (Pragmatismo) d0563391b6 ``` Add comprehensive email account management and user settings
interface

Implements multi-user authentication system with email account
management, profile settings, drive configuration, and security
controls. Includes database migrations for user accounts, email
credentials, preferences, and session management. Frontend provides
intuitive UI for adding IMAP/SMTP accounts with provider presets and
connection testing. Backend supports per-user vector databases for email
and file indexing with Zitadel SSO integration and automatic workspace
initialization. ```
2025-11-21 09:28:35 -03:00

171 lines
No EOL
4.3 KiB
Markdown

# 🧠 Knowledge Base (KB) System - Complete Implementation
## Overview
The KB system allows `.bas` tools to **dynamically add/remove Knowledge Bases to conversation context** using `ADD_KB` and `CLEAR_KB` keywords. Each KB is a vectorized folder that gets queried by the LLM during conversation.
## 🏗️ Architecture
```
work/
{bot_name}/
{bot_name}.gbkb/ # Knowledge Base root
circular/ # KB folder 1
document1.pdf
document2.md
vectorized/ # Auto-generated vector index
comunicado/ # KB folder 2
announcement1.txt
announcement2.pdf
vectorized/
geral/ # KB folder 3
general1.md
vectorized/
```
## 📊 Database Tables (Already Exist!)
### From Migration 6.0.2 - `kb_collections`
```sql
kb_collections
- id (uuid)
- bot_id (uuid)
- name (text) -- e.g., "circular", "comunicado"
- folder_path (text) -- "work/bot/bot.gbkb/circular"
- qdrant_collection (text) -- "bot_circular"
- document_count (integer)
```
### From Migration 6.0.2 - `kb_documents`
```sql
kb_documents
- id (uuid)
- bot_id (uuid)
- collection_name (text) -- References kb_collections.name
- file_path (text)
- file_hash (text)
- indexed_at (timestamptz)
```
### NEW Migration 6.0.7 - `session_kb_associations`
```sql
session_kb_associations
- id (uuid)
- session_id (uuid) -- Current conversation
- bot_id (uuid)
- kb_name (text) -- "circular", "comunicado", etc.
- kb_folder_path (text) -- Full path to KB
- qdrant_collection (text) -- Qdrant collection to query
- added_at (timestamptz)
- added_by_tool (text) -- Which .bas tool added this KB
- is_active (boolean) -- true = active in session
```
## 🔧 BASIC Keywords
### `ADD_KB kbname`
**Purpose**: Add a Knowledge Base to the current conversation session
**Usage**:
```bas
' Static KB name
ADD_KB "circular"
' Dynamic KB name from variable
kbname = LLM "Return one word: circular, comunicado, or geral based on: " + subject
ADD_KB kbname
' Multiple KBs in one tool
ADD_KB "circular"
ADD_KB "geral"
```
**What it does**:
1. Checks if KB exists in `kb_collections` table
2. If not found, creates entry with default path
3. Inserts/updates `session_kb_associations` with `is_active = true`
4. Logs which tool added the KB
5. KB is now available for LLM queries in this session
**Example** (from `change-subject.bas`):
```bas
PARAM subject as string
DESCRIPTION "Called when someone wants to change conversation subject."
kbname = LLM "Return one word circular, comunicado or geral based on: " + subject
ADD_KB kbname
TALK "You have chosen to change the subject to " + subject + "."
```
### `CLEAR_KB [kbname]`
**Purpose**: Remove Knowledge Base(s) from current session
**Usage**:
```bas
' Remove specific KB
CLEAR_KB "circular"
CLEAR_KB kbname
' Remove ALL KBs
CLEAR_KB
```
**What it does**:
1. Sets `is_active = false` in `session_kb_associations`
2. KB no longer included in LLM prompt context
3. If no argument, clears ALL active KBs
**Example**:
```bas
' Switch from one KB to another
CLEAR_KB "circular"
ADD_KB "comunicado"
' Start fresh conversation with no context
CLEAR_KB
TALK "Context cleared. What would you like to discuss?"
```
## 🤖 Prompt Engine Integration
### How Bot Uses Active KBs
When building the LLM prompt, the bot:
1. **Gets Active KBs for Session**:
```rust
let active_kbs = get_active_kbs_for_session(&conn_pool, session_id)?;
// Returns: Vec<(kb_name, kb_folder_path, qdrant_collection)>
// Example: [("circular", "work/bot/bot.gbkb/circular", "bot_circular")]
```
2. **Queries Each KB's Vector DB**:
```rust
for (kb_name, _path, qdrant_collection) in active_kbs {
let results = qdrant_client.search_points(
qdrant_collection,
user_query_embedding,
limit: 5
).await?;
// Add results to context
context_docs.extend(results);
}
```
3. **Builds Enriched Prompt**:
```
System: You are a helpful assistant.
Context from Knowledge Bases:
[KB: circular]
- Document 1: "Circular 2024/01 - New policy regarding..."
- Document 2: "Circular 2024/02 - Update on procedures..."
[KB: geral]
- Document 3: "General information about company..."
User: What's the latest policy update?