The term Change Data Capture became popular during the rise of data warehousing. Early CDC implementations typically relied on:
last_updated)Today the preferred solution is reading directly from the transaction log.
The benefits:
While CDC is commonly associated with traditional databases, it is more broadly a pattern for capturing, recording, and propagating changes in data over time as that data evolves within a system.
As data management needs have evolved, different types of data sources have emerged, each providing distinct physical and logical models for representing, storing, and querying information.
In this context, Change Data Capture is the most efficient way to move data from one system to another while preserving formats, conventions, and the semantic meaning of the information, ensuring that changes are propagated consistently and accurately across heterogeneous systems.
Data Integration Patterns: Change Data Capture
Machine-to-Machine Semantics: Vector Databases
LLM Patterns: Retrieval-augmented generation
Debezium
Demo
Key Takeaways
Vector databases address a new challenge in the age of LLMs: enabling data to be organized and retrieved according to its semantic meaning for use by generative language models.
The semantic meaning is captured by embeddings, a numerical vector representations of data allowing machines to compare and retrieve information based on cenceptual similarity rather than exact matches.
Mathematical transformation that converts unstructured data into a dense vector of numbers in a high-dimensional space.
In most architectures, an application invokes an embedding model, either through a managed embedding service or a self-hosted deployment, to transform input data into vector representations.
Data Integration Patterns: Change Data Capture
Machine-to-Machine Semantics: Vector Databases
LLM Patterns: Retrieval-augmented generation
Debezium
Demo
Key Takeaways
LLM patterns are reusable architectural solutions that define how Large Language Models interact with:
(RAG) is an architectural pattern that enhances Large Language Models by retrieving relevant external information and using it as context during response generation. The RAG pattern operates in two main steps:
Workflow:
Since ingestion happens offline or continuously in the background and not during query execution, it is often treated as a separate indexing process rather than part of the RAG request flow.
The application ingests a set of documents, processes them, and stores them in a vector database.
RAG leverages embeddings and vector databases to represent and retrieve machine-understandable semantic knowledge, which is then used by LLMs to generate context-aware responses.
In modern AI and data architectures, CDC provides a continuous stream of updates that can be transformed into embeddings and indexed in vector databases, ensuring that semantic representations remain synchronized with the latest state of the underlying data.
Key benefits:
you can find in the wild different architecture for RAG:
Data Integration Patterns: Change Data Capture
Machine-to-Machine Semantics: Vector Databases
LLM Patterns: Retrieval-augmented generation
Debezium
Demo
Key Takeaways
Debezium is an open-source distributed platform for Change Data Capture (CDC). It streams real-time changes from databases into event-driven systems by monitoring database transaction logs.
Kafka Connect provides the runtime framework, handling connector lifecycle management, fault tolerance, offset storage, and scalability, while Debezium supplies source connectors that read database transaction logs.
Debezium Server is a lightweight, standalone runtime that enables CDC without requiring Apache Kafka.
Debezium offers a wide range of solutions to address CDC in different contexts.
Debezium AI is a set of tools for building data streaming pipelines that support the ingestion phase of RAG architectures using log-based CDC.
FieldToEmbedding Single message transformation (SMT)Debezium offers a built-in feature to transform specified text fields into numerical embeddings vectors, and to add the resulting embeddings to the event record.
The embeddings transformation uses the langchain4j framework.
PyDebeziumAI integrates Debezium CDC streams with LangChain and LangGraph, bringing the capabilities of the Debezium Engine to Python applications via JPype.
Data Integration Patterns: Change Data Capture
Machine-to-Machine Semantics: Vector Databases
LLM Patterns: Retrieval-augmented generation
Debezium
Demo
Key Takeaways
The scenario simulates a data ingestion pipelines of documents from Postgres to Milvus.
## Source configuration
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.offset.storage.file.filename=data/offsets.dat
debezium.source.offset.flush.interval.ms=0
debezium.source.database.hostname=postgres.mosfet.io
debezium.source.database.port=5432
debezium.source.database.user=postgres
debezium.source.database.password=postgres
debezium.source.database.dbname=postgres
debezium.source.topic.prefix=demo
debezium.source.table.include.list=ai.documents
debezium.source.plugin.name=pgoutput
## Source configuration
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.offset.storage.file.filename=data/offsets.dat
debezium.source.offset.flush.interval.ms=0
debezium.source.database.hostname=postgres.mosfet.io
debezium.source.database.port=5432
debezium.source.database.user=postgres
debezium.source.database.password=postgres
debezium.source.database.dbname=postgres
debezium.source.topic.prefix=demo
debezium.source.table.include.list=ai.documents
debezium.source.plugin.name=pgoutput
## Sink configuration
debezium.sink.type=milvus
debezium.sink.milvus.uri=http://milvus.mosfet.io:19530
debezium.sink.milvus.unwind.json=true
## Source configuration
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.offset.storage.file.filename=data/offsets.dat
debezium.source.offset.flush.interval.ms=0
debezium.source.database.hostname=postgres.mosfet.io
debezium.source.database.port=5432
debezium.source.database.user=postgres
debezium.source.database.password=postgres
debezium.source.database.dbname=postgres
debezium.source.topic.prefix=demo
debezium.source.table.include.list=ai.documents
debezium.source.plugin.name=pgoutput
## Sink configuration
debezium.sink.type=milvus
debezium.sink.milvus.uri=http://milvus.mosfet.io:19530
debezium.sink.milvus.unwind.json=true
## Embedding Transformation
debezium.source.transforms=papers
debezium.source.transforms.papers.type=io.debezium.ai.embeddings.FieldToEmbedding
debezium.source.transforms.papers.openai.api.key=come_to_code
debezium.source.transforms.papers.openai.baseUrl=https://granite.mosfet.io/v1
debezium.source.transforms.papers.openai.model.name=granite
debezium.source.transforms.papers.field.source=after.text
debezium.source.transforms.papers.field.embedding=after.vector
The code is a JBang script. The only prerequisite is an installed Container Runtime and a large language model :
install jbang curl -Ls https://sh.jbang.dev | bash -s - app setup
use the cli: jbang rag@kmos

Data Integration Patterns: Change Data Capture
Machine-to-Machine Semantics: Vector Databases
LLM Patterns: Retrieval-augmented generation
Debezium
Demo
Key Takeaways
Prima di iniziare vorrei ringraziare gli organizzatori del come to code: è bello poter giocare in casa e parlare di qualcosa che mi interessa. Infatti oggi parleremo di RAG, questo pattern architetturale per l'IA e come interagisce con un altro pattern il Change Data Capture.
Slide di rito: Mi chiamo Giovanni e lavoro per IBM come Senior Software engineer nel dipartimento di java runtimes and integration. Per integration si intende anche data Streaming e quindi Debezium. In Debezium sono core team member e ultimamente mi sto occupando di debezium server e dell'engine. In particolare dell'engine mi occupo anche delle sue emanazioni come le Quarkus Extensions. Last but not least, sono maintaner dell'opentelemetry sdk per zig Qui una mia foto con una gallina per abbassare le aspettative che avete per il mio talk di oggi.
Premetto che sono un uomo di principi: preferisco parlare di principi alla base dell'IT perchè tendenzialmente non cambiano mai. Le tecnologie cambiano, i brand ma i pricipi no. Infatti inizieremo con parlare un po' di change data capture questo data integration pattern per poi passare ad accenni ai vector database. A quel punto passeremo all'argomento principe che è rag per poi passare a come debezium risolve delle cose in rag. Da lì una demo veloce e le conclusioni.
Change data capture è un data integration pattern che ha come scopo quello di catturare l'evoluzione dei cambiamenti dei dati che avvengono in un data source, nella forma di insert, update e delete per poi inviarli ad un sistema terzo
insert update & deletes, siamo negli anni 90? il CDC come pattern è stato introdotto durante l'esplosione del datawarehouse dove era nata la necessita' di catturare informazioni da differenti sorgenti e per questo motivo si inventaro tanti modi per farlo come: - colonne aggiuntive - database trigger - audit table
oggi pero' la soluzione preferita è l'utilizzo del CDC log based cioè leggere i cambiamenti al database dal transaction log. I benefici sono molteplici: - si minimizza l'impatto di performance sulla sorgente di dati - consistenza nella transazionalita' del sistema poichè il log per definizione risolve la transazionalita' in un sistema concorrente permettendo di ottenere l'ordine e l'integrita'
ok voi direte: ma ho mongodb in produzione. Si, anche se il cdc è associato a sistemi convenzionali, quali i database relazionali, CDC è un patter più ad alto livello dove l'idea di fondo è quello di osservare o propagare i cambiamenti di stato di un sistema nel tempo
e questi cambiamenti di stato cosa sono? Non sono altro che dati: una rappresentazione digitale dell'informazione. E il dato non è la colonna portante dell'IA che oggi è un onda che ci sta travolgendo e sta trainando la ricerca di nuovi formati e modi di poter gestire i dati in modo da poter reggere le relative sfide.
e in questo contesto il CDC è il modo più efficiente di muovere dati da un sistema ad un altro facendo delle considerazione sui formati, convenzioni e semantica che sono d'obbligo in questa costellazione di sistemi eterogenei.
e la semantica è la chiave per definire i vector database
I vector database che rispetto ad un database convenzionale dove il contenuto della base dati contiene una rappresentazione digitale del dato senza una sua rappresentazione semantica, i vector database invece permettono di poter avere nel dato il significato semantico utile per gli llm.
e questo significato semantico è catturato dall'embeddings, questa struttura dati che non è altro che un vettore numerico che contiene l'informazione che permette alle macchine di effettuare comparazioni di concentti similari da un punto di vista semantico invece di una comparazione esatta sul termine come in un full text search
Indexing è il processo di transformazione dei documenti in input in una struttura di ricerca efficiente chiamata indice invertito. Tokenizzi il testo, lo normalizzi ma alla fine vuoi una mappa: una struttura data fortemente ottimizzata che mappa le parole ai loro posting IDs (una lista di document IDs che contengono quel termine). Nella fase di query ottieni il risultato in maniera efficiente effettuando una semplice intersezione.
In un vector database è concettualmente simile: invece di effettuare una semplice normalizzazione e tokenizazione andiamo a crare gli embeddings, che dovrebbero riflettere il contenuto del documento. Anche in questo caso si va a creare in fase di indexing questa data structure fortemente ottimizzata per la fase di ricerca che è tipicamente un grafo che può essere navigato in fase di query per individuare rapidamente i vettori più vicini secondo una metrica di distanza o similarità, come la distanza euclidea.
e quando si passa da livello semantico ad un altro, è sempre necessario effettuare una trasformazione che in questo caso è matematica attraverso una funzione chiamata embedding function che va a convertire un dato non strutturato come il testo in un vettore insierito in uno spazio ad alta dimensionalita'
e quando si parla di alta dimensionalita' chiaramente parliamo di llm: otteniamo questa trasformazione tramite un embedding model servito localmente attraverso un inference engine oppure caricato su un server con il quale interagiamo con un inference server oppure con un cloud provider.
quando parliamo di interazione tra entita' stiamo andando a definire uno schema di comunicazione
questo schema di comunicazione tecnicamente viene chiamato pattern e llm in questo caso è l'attore protagonista: negli llm pattern andiamo a definre come gli llm dialognao con : - sorgenti di informazione - tools - utenti esistono tanti pattern e rag è uno di questi
rag definisce come un llm può ottenere delle informazioni rilevanti per poter arricchire il proprio contesto per poter generare una risposta. Le fasi del pattern sono principalmente due: - retrieval - generation
retrieval non è altro che la fase in cui un modello ottiene informazioni rilevati generation invece è quella in cui viene generata una risposta attraverso queste informazioni
Questo pattern nella sua semplicita' omette tante punti. Uno tra questi è come sia possibile scrivere all'interno della base di dati dell'llm: nel pattern si definisce la lettura ma non la scrittura che puo' avvenire in vari modi, uno tra questi è con la creazione di una pipeline di ingestion.
Questa pipeline di ingestion ha la responsabilita' di caricare di informazioni rilevanti la base di dati del modello che puo' utilizzare nel suo ciclo di vita attraverso dati operazioni da database convenzionali verso database vettoriali.
e per caricare i dati nel database vettoriale deve esserci questa fase di trasformazione negli embeddings per poter effettuare ricerca semantica
il CDC permette di poter effettuare delle data ingestion pipeline che possono copiare dati operativi verso database vettoriali attaverso una fase intermedia di trasformazione
i benefici principali sono sempre quelli del CDC e quindi: - basso impatto sulla sorgente dati - la possibilita' di avere la base dati dell'llm aggiornata in near real time - sincronizzazione consistente tra dati operativi e l'indice dei vettori - last but not least, ridurre l'indeterminsmo dell'llm ad esempio rimuovendo dati sensibili ottenuti da un database operativo
abbiamo differenti forme di rag