architecture
Bruno CeccarelliSolution Architect
person
memory ARCHITETTURA RAG SAP

RAG Ibrido per SAP ABAP/HCM con ChromaDB, Ollama e Qwen

Ingegnerizzazione di una pipeline di retrieval specializzata per repository SAP ABAP/HCM mission-critical. Integrazione bidirezionale tra ricerca semantica vettoriale, lexical scan per termini DDIC, content deduplication V4 e scoring strutturale proprietario.

Dataset Corpus 46.346 Chunk indicizzati
Content Dedup -35.3% Riduzione duplicati V4
Precisione DDIC 100% Zero allucinazioni campo
Schema architettura RAG ABAP
rag_abap_runtime_pipeline.png
SAP Certified
Architettura Tecnica RAG e Validazione Codice SAP ABAP
verified 01. OBIETTIVO DEL PROGETTO E LIMITI VECTORDB GENERICI

Perché i Vector Database Generici Falliscono nel Codice SAP

Nel dominio enterprise SAP, una query come PA0001 non rappresenta un vago concetto discorsivo ma un identificatore DDIC rigoroso e ad altissima criticità operativa.

01

Interrogazione Base ABAP

Accesso sistematico a decine di migliaia di include, classi OO, function modules HR e macro standard.

Storage Layer
02

Recupero Codice Mirato

Isolamento di reali logiche di business ed estrazione dei blocchi sintattici attivi anziché frammenti sparsi.

Semantic Retrieval
03

Fusione Ibrida Bidirezionale

Accoppiamento sincronizzato tra similarità vettoriale profonda (cosine) e scansione lessicale esatta (Exact Match).

Hybrid Engine
04

Riconoscimento DDIC

Mappatura automatica di tabelle infotype (PA0001, PA0002) e campi chiave (PERNR, KOSTL, WERKS, BEGDA).

Lexical Entities
05

Eliminazione Duplicati V4

Deduplicazione basata su hashing del contenuto sorgente per superare il limite dei soli metadati file.

Cleaning Pipeline
06

Ranking Strutturale ABAP

Premiazione di costrutti SQL ed accessi diretti (SELECT SINGLE) rispetto a semplici dichiarazioni DATA.

Syntactic Re-Rank
07

Contesto Compatto Qwen

Compressione selettiva del payload per garantire il rispetto assoluto della context window di 4096 token.

Token Budgeting
08

Generazione Sintattica 7.40+

Generazione di codice ABAP pulito, aderente alle linee guida SAP moderne con variabili host inline @.

Inference Output
biotech Caso di Studio Reale: Test Benchmark "PA0001"

Ricerca di utilizzi effettivi e dipendenze strutturali

Durante il test isolato con la query "PA0001", una ricerca vettoriale classica restituiva 30 chunk parzialmente disallineati. La pipeline ibrida ha scansionato 46.346 chunk estraendo con precisione i pattern legati a PERNR, KOSTL, WERKS, PERSG, BEGDA ed ENDDA.

PA0001-PERNR PA0001-KOSTL PA0001-WERKS PA0001-BEGDA PA0001-ENDDA PA0001-PERSG PA0001-BTRTL PA0001-ORGEH
account_tree 02. ARCHITETTURA GENERALE E FLUSSO DELLA PIPELINE

Dalla Query Utente al Codice ABAP Verificato

Il diagramma di runtime descrive il percorso rigoroso a step: analisi semantico-lessicale in parallelo, de-duplicazione profonda del codice, riordinamento sintattico e validazione dell'output.

terminal
User Prompt Input Query: "PA0001" o "Leggi KOSTL con PERNR"
keyboard_arrow_down
psychology
Step 1: Query Profiling Engine Estrazione Tabelle • Campi DDIC • Intent Classification
keyboard_arrow_down
blur_on Ricerca Semantica
Ollama nomic-embed-text (k=30) Similarity Score & Context Proximity
find_in_page Ricerca Esatta SAP
Batch Lexical Scan (500/chunk) Exact Terms Match via Regex Bounds
keyboard_arrow_down
join_inner
Step 2: Consolidamento Merge Pool + Metadata Dedup + Content Hash Dedup (V4)
keyboard_arrow_down
grade
Step 3: Algoritmo Specializzato SAP Structural Ranking (SELECT SINGLE > DATA lv_kostl)
keyboard_arrow_down
compress
Step 4: Context Compression Top-K Selection • Adjacency Check • Token Cap < 4096
keyboard_arrow_down
smart_toy
Step 5: LLM Inference oisee/qwen-coder-abap:v7 via Ollama Local Instance
keyboard_arrow_down
task_alt
Output Finale Validato Codice ABAP Clean, Conforme e Verificato su DB DDIC
tune 03. STACK TECNICO E CONFIGURAZIONE AMBIENTE

Infrastruttura On-Premise a Zero Leakage Informativo

L'intero stack opera in ambiente isolato locale per rispettare la riservatezza totale del repository sorgente aziendale e la compliance con le direttive SAP Governance.

Parametri di Deployment Attivi

Linguaggio Principale Python 3.11+
Vector Store Persistente ChromaDB Local Engine
Collection Name abap_hcm
Embedding Engine nomic-embed-text:latest
Generative Foundation oisee/qwen-coder-abap:v7
Volumetria Repository 46.346 Chunk indicizzati
Ollama Inference Host http://127.0.0.1:11434
init_vector_db.py LangChain + Chroma
from pathlib import Path

from langchain_ollama import OllamaEmbeddings

from langchain_chroma import Chroma



# Parametri d'ambiente persistente locale

DB_DIR = Path(r"C:\Progetto_AI\Abap_VectorDB")

COLLECTION_NAME = "abap_hcm"

EMBEDDING_MODEL = "nomic-embed-text:latest"

OLLAMA_BASE_URL = "http://127.0.0.1:11434"



# Inizializzazione connettori

embeddings = OllamaEmbeddings(

    model=EMBEDDING_MODEL,

    base_url=OLLAMA_BASE_URL

)



vector_db = Chroma(

    collection_name=COLLECTION_NAME,

    embedding_function=embeddings,

    persist_directory=str(DB_DIR)

)
Status: RUNNING LOCALLY Zero Cloud Data Ingestion
Enterprise Core Transformation

Digital Twin & SAP ABAP Knowledge Graph

Trasformazione del patrimonio legacy SAP in un gemello digitale di conoscenza navigabile e pronto per gli agenti AI di nuova generazione.

developer_board 04. LE SFIDE TECNICHE E LE FASI DI SVILUPPO

Ingegnerizzazione Reale: I Problemi Risolti in Produzione

Dettaglio delle criticità computazionali riscontrate durante lo scaling sui 46.346 chunk e soluzioni algoritmiche adottate dalla V1 alla V5.1.

Fasi 1 & 2 • Dual Path sync_problem

Il Fallimento della Sola Ricerca Semantica

La chiamata iniziale vector_db.similarity_search(k=30) produceva 30 risultati non focalizzati. Per identificatori categorici come PA0001, gli embedding catturano affinità concettuali ma ignorano la presenza fisica dell'infotype.

# Divergenza del retrieval su "PA0001":
• Ricerca Vettoriale: 30 chunk (dispersione elevata)
• Scansione Lessicale: 22.471 chunk (match esatto con termini SAP)
Soluzione: Creazione di una Knowledge Base esatta di termini SAP (PAxxxx, Pxxxx, Txxxx, BAdI).
Storage Limit • Batch Scan warning

ChromaDB "Too Many SQL Variables"

La query lessicale massiva mandava in crash SQLite: code 1: too many SQL variables. Impossibile interrogare tutti i record in una singola transazione.

# Ingegneria Batching persistente:
BATCH_SIZE = 500
for offset in range(0, total, BATCH_SIZE):
data = collection.get(limit=500, offset=offset)
Risultato: Elaborazione a blocchi di tutti i 46.346 chunk senza alterare il DB né saturare la memoria.
Parsing • Term Separation rule

Normalizzazione e Separazione Table/Field

Evitare che identificatori come PERNR vengano scambiati per sottostringhe arbitrarie. Risolto inoltre il bug per cui PA0001 veniva classificato simultaneamente come tabella e come campo.

# Algoritmo di Sanificazione:
re.sub(r'[^A-Z0-9_/~]', ' ', text.upper())
TABLE_TERMS ∩ FIELD_TERMS = ∅
Regola: I termini tabella vengono purgati prima della classificazione dei campi DDIC.
Data Hygiene • Phase V4 cleaning_services

Content Deduplication V4: Oltre i Metadati

I file esportati spesso presentano nomi diversi ma blocchi sorgente identici (es. ztm_simulazione_ele.txt vs ..._ele_1.txt). La sola deduplicazione per metadata creava gravissimo bias e spreco di token.

Unici Iniziali:22.482
Duplicati per Contenuto Rimossi:- 7.933
Risultati Puliti V4:14.549
Impatto: Eliminazione del 35.3% del rumore totale del corpus prima della fase di re-ranking.
Semantic Heuristics • V3 analytics

SAP Structural Ranking: Riconoscere l'Accesso Reale

Nel codice ABAP, una dichiarazione dati deve valere infinitamente meno di una query di estrazione. La formula proprietaria valuta la sintassi attiva:

Final Score = Semantic + Exact + QueryBonus + Structural
• SELECT SINGLE ... FROM PA0001 WHERE PERNR (+48.0)
• DATA lv_kostl LIKE pa0001-kostl (+0.0)
Esito: I primi 15 risultati estratti contengono solo istruzioni SQL operative e pattern Dynpro validi.
Context Window • 4096 Limit data_thresholding

Context Window Crunch: 4489 vs 4096 Token

Qwen restituiva eccezione fatale: request (4489 tokens) exceeds the available context size (4096 tokens). La qualità del retrieval non equivale alla gestione del contesto di generazione.

Assioma Architetturale Fondamentale:
Retrieval Quality ≠ Generation Context Management
46.346 chunk → Retrieval → Ranking → Top-K sintetico
Adottato: Compressione aggressiva e selezione chirurgica dei frammenti rilevanti per il prompt.
verified_user 05. PRINCIPI ARCHITETTURALI RIUTILIZZABILI

Linee Guida per Sistemi RAG su Codice Enterprise

Principi cardine applicabili a qualsiasi stack mission-critical (SAP, Oracle, COBOL, mainframe) dove l'allucinazione di un identificatore comporta blocchi di produzione.

filter_alt

Separare Retrieval e Ranking

Il layer di retrieval raccoglie tutti i candidati potenziali; il layer di ranking stabilisce l'autorevolezza sintattica. Mai usare il primo score vettoriale come verdetto.

code_blocks

Il Codice ha Struttura Sintattica

Nel software la presenza di una stringa non ne certifica la funzione. È obbligatorio riconoscere clausole primarie: SELECT SINGLE, WHERE, LOOP AT, CALL FUNCTION.

rule_folder

Deduplicare Prima del Prompt

I duplicati consumano token, creano bias cognitivo nel modello e degradano i tempi di risposta. L'hashing di contenuto a monte è una conditio sine qua non.

fact_check 06. VALIDAZIONE ABAP E REGOLE DI QUALITÀ POST-OUTPUT

Checklist di Conformità a 10 Controlli Rigorosi

Il codice generato da Qwen viene sottoposto a parsing deterministico. Se anche un singolo vincolo fallisce, la risposta viene rigettata prima di raggiungere il developer.

Controllo QA Deterministico Stato / Criterio
1. NO TOOL / RAW JSON RESIDUO PASS
2. SOLO OGGETTI DB REALI (DDIC ESISTENTI) PASS
3. TYPE TABLE OF VALIDO E COERENTE PASS
4. CAMPI ESISTENTI IN TABELLA (NO PSEUDO-CAMPI) PASS
5. TIPIZZAZIONE CAMPI TABELLARI COMPATIBILE PASS
6. PARAMETRI FM PRESENTI NEL DIZIONARIO VERIFICATO PASS
7. DIVIETO ASSOLUTO DI "SELECT *" PASS
8. ZERO STATEMENT SQL DENTRO LOOP O ITERAZIONI PASS
9. SAFETY VERIFICATA SU FIELD-SYMBOL (IS ASSIGNED) PASS
10. BASELINE HR AUTHORITY & DATE SPLIT (BEGDA/ENDDA) PASS
check_circle
QA_RESULT: 10/10 PASS Conforme a standard Enterprise SAP NetWeaver / S4HANA
VERIFIED
Esempio Output Generato Clean ABAP 7.40+
" Query profilata: Intent = data_read

" Tabella: PA0001 | Campi: KOSTL | Chiave: PERNR



SELECT SINGLE kostl

  FROM pa0001

  INTO @DATA(lv_kostl)

  WHERE pernr = @lv_pernr

    AND begda <= @sy-datum

    AND endda >= @sy-datum.



IF sy-subrc = 0.

  " Esecuzione logica certificata

ENDIF.

Uso di variabili host @, target declaration inline e restrizione temporale automatica BEGDA/ENDDA.

Metriche di Pipeline Registrate

Retrieval Time:184 ms
Re-Ranking & Dedup:62 ms
Estimated Tokens:1.420 / 4096
Total Inference:1.84 s
S/4HANA Readiness

Architettura Pronta per il Core S/4HANA Enterprise

Il motore ibrido estende la propria governance a Core Data Services (CDS), AMDP, BAdI enhancement framework e API OData v4 con la medesima precisione deterministica.

rocket_launch Architettura Scalabile Mission-Critical

RAG Specializzato: La Risposta Ingegneristica all'Allucinazione nei Sistemi Core

La transizione da un generico "Query → Embedding → LLM" a una pipeline a doppio binario certificata dimostra che l'AI per l'Enterprise richiede comprensione profonda della semantica applicativa. Il sistema è pronto per essere scalato su repository FI-CO, SD, MM e logiche di migrazione ECC → S/4HANA.

• Nessuna esportazione esterna di codice • ChromaDB Local Cluster • Precisione Lessicale Garantita
Schema architettura RAG ABAP