Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare il database vettoriale integrato in Azure DocumentDB per connettere facilmente le applicazioni basate su intelligenza artificiale ai dati archiviati in Azure DocumentDB. Questa integrazione può includere app create usando incorporamenti OpenAI di Azure. Il database vettoriale integrato in modo nativo consente di archiviare, indicizzare ed eseguire query sui dati vettoriali altamente dimensionali archiviati direttamente in Azure DocumentDB, insieme ai dati originali da cui vengono creati i dati vettoriali. Elimina la necessità di trasferire i dati in archivi vettoriali alternativi e comporta costi aggiuntivi.
Che cos'è un archivio di vettori?
Un archivio vettoriale o un database vettoriale è un database progettato per archiviare e gestire incorporamenti vettoriali, che sono rappresentazioni matematiche dei dati in uno spazio ad alta dimensione. In questo spazio, ogni dimensione corrisponde a una caratteristica dei dati e decine di migliaia di dimensioni possono essere usate per rappresentare dati sofisticati. La posizione di un vettore in questo spazio rappresenta le sue caratteristiche. Parole, frasi o interi documenti, immagini, audio e altri tipi di dati possono essere vettorizzati.
Come funziona un archivio vettoriale?
In un archivio vettoriale, gli algoritmi di ricerca vettoriale vengono usati per indicizzare ed eseguire query sugli incorporamenti. Alcuni algoritmi di ricerca di vettori noti includono Gerarchica Navigable Small World (HNSW), Inverted File (IVF) e DiskANN. La ricerca vettoriale è un metodo che consente di trovare elementi simili in base alle caratteristiche dei dati anziché in base alle corrispondenze esatte in un campo di proprietà. Questa tecnica è utile nelle applicazioni come la ricerca di testi simili o di immagini correlate, la creazione di elementi consigliati o anche il rilevamento di anomalie. Viene usato per interrogare i vettori di incorporamenti (elenchi di numeri) dei dati che hai creato utilizzando un modello di Machine Learning attraverso un'API di incorporamenti. Esempi di API di incorporamento sono incorporamenti di Azure OpenAI o Hugging Face in Azure. La ricerca vettoriale misura quindi la distanza tra i vettori di dati e i vettori di query. I vettori di dati più vicini al vettore di query sono quelli che risultano più simili dal punto di vista semantico.
Nel database vettoriale integrato in Azure DocumentDB è possibile archiviare, indicizzare ed eseguire query sugli incorporamenti insieme ai dati originali. Questo approccio elimina il costo aggiuntivo della replica dei dati in un database vettoriale puro separato. Inoltre, questa architettura mantiene insieme gli incorporamenti vettoriali e i dati originali, il che facilita meglio le operazioni sui dati multimodali e consente una maggiore coerenza, scalabilità e prestazioni.
Casi d'uso del database vettoriale
I database vettoriali vengono usati in molte aree dell'intelligenza artificiale e dell'analisi dei dati. Consentono di eseguire attività come la comprensione del linguaggio naturale, il riconoscimento di immagini e video, la creazione di sistemi di raccomandazione e l'alimentazione delle funzionalità di ricerca. È possibile trovarli sia nelle applicazioni di intelligenza artificiale analitica che nelle applicazioni di intelligenza artificiale generative.
È possibile, ad esempio, usare un database vettoriale per eseguire le azioni seguenti:
- Identificare immagini, documenti e canzoni simili in base ai relativi contenuti, temi, valutazioni e stili.
- Identificare prodotti simili in base alle relative caratteristiche e funzionalità e ai rispettivi gruppi utenti.
- Consigliare contenuti, prodotti o servizi in base alle preferenze dei singoli utenti.
- Consigliare contenuti, prodotti o servizi in base alle analogie dei gruppi di utenti.
- Identificare le opzioni possibili più adatte da un ampio pool di scelte per soddisfare requisiti complessi.
- Identificare anomalie dei dati o attività fraudolente diverse dai criteri normali o predominanti.
- Implementare la memoria persistente per gli agenti di intelligenza artificiale.
- Abilitare la Generazione aumentata di recupero (RAG)
Differenze tra un database vettoriale integrato e database vettoriale puro
Esistono due tipi comuni di implementazioni di database vettoriali: database vettoriale puro e database vettoriale integrato in un database NoSQL o relazionale.
Un database vettoriale puro archivia e gestisce in modo efficiente gli incorporamenti vettoriali insieme a una piccola quantità di metadati. È separato dall'origine dati da cui derivano gli incorporamenti.
Un database vettoriale che si integra in un database NoSQL o relazionale ad alte prestazioni offre funzionalità aggiuntive. Il database vettoriale integrato in un database NoSQL o relazionale può archiviare, indicizzare ed eseguire query sugli incorporamenti insieme ai dati originali corrispondenti. Questo approccio elimina il costo aggiuntivo della replica dei dati in un database vettoriale puro separato. Inoltre, mantenere meglio insieme gli incorporamenti vettoriali e i dati originali facilita le operazioni su dati multimodali e consente una maggiore coerenza, scalabilità e prestazione dei dati.
Database vettoriali open source
Quando gli sviluppatori selezionano i database vettoriali, le opzioni open source offrono numerosi vantaggi. Open source significa che il codice sorgente del software è disponibile liberamente, consentendo agli utenti di personalizzare il database in base alle proprie esigenze specifiche. Questa flessibilità è vantaggiosa per le organizzazioni che sono soggette a requisiti normativi univoci per i dati, ad esempio le aziende del settore dei servizi finanziari.
Un altro vantaggio dei database vettoriali open source risiede nel forte supporto di cui godono da parte della community. Le community di utenti attivi spesso contribuiscono allo sviluppo di questi database, forniscono supporto e condividono procedure consigliate, promuovendo l'innovazione.
Alcuni utenti optano per i database vettoriali open source perché sono "gratuiti", ovvero non c'è alcun costo per acquisire o usare il software. Un'alternativa consiste nell'usare i livelli gratuiti offerti dai servizi di database vettoriali gestiti. Questi servizi gestiti offrono non solo l'accesso gratuito fino a un determinato limite di utilizzo, ma semplificano anche il carico operativo gestendo la manutenzione, gli aggiornamenti e la scalabilità. Pertanto, usando il livello gratuito dei servizi di database vettoriali gestiti, è possibile ottenere risparmi sui costi riducendo al contempo il sovraccarico di gestione. Questo approccio consente di concentrarsi maggiormente sulle attività principali anziché sull'amministrazione del database.
Selezionare il database vettoriale open source migliore
Per scegliere il database vettoriale open source migliore è necessario prendere in considerazione diversi fattori. Le prestazioni e la scalabilità del database sono fondamentali perché influiscono sul fatto che il database possa gestire i requisiti specifici del carico di lavoro. I database con funzionalità efficienti di indicizzazione e query offrono in genere prestazioni ottimali. Un altro fattore è il supporto e la documentazione della community disponibili per il database. Una solida community e un'ampia documentazione può fornire assistenza preziosa. DocumentDB, ad esempio, è un popolare database vettoriale open source:
L'opzione più popolare potrebbe non essere l'opzione migliore per te. È quindi consigliabile confrontare opzioni diverse in base a funzionalità, tipi di dati supportati e compatibilità con gli strumenti e i framework esistenti usati. È anche consigliabile tenere presenti le sfide dei database vettoriali open source.
Sfide dei database vettoriali open source
La maggior parte dei database vettoriali open source, inclusi quelli elencati in precedenza, sono database vettoriali puri. In altre parole, sono progettati per archiviare e gestire solo incorporamenti vettoriali, insieme a una piccola quantità di metadati. Poiché funzionano separatamente dai dati originali, è necessario spostare i dati tra servizi diversi. Questa complessità aggiunge costi aggiuntivi, rende le cose più complesse e può rallentare i sistemi di produzione.
Rappresentano anche le sfide tipiche dei database open source:
- Installazione: sono necessarie informazioni approfondite per installare, configurare e gestire il database, soprattutto per distribuzioni complesse. L'ottimizzazione delle risorse e della configurazione durante l'operazione di aumento delle prestazioni richiede la chiusura del monitoraggio e delle rettifiche.
- Manutenzione: è necessario gestire aggiornamenti, patch e manutenzione personalizzati. Le competenze di Machine Learning non sono sufficienti; È inoltre necessario avere un'esperienza completa nell'amministrazione del database.
- Supporto: il supporto ufficiale può essere limitato rispetto ai servizi gestiti, in quanto si affida maggiormente all'assistenza della community.
Pertanto, i database vettoriali open source gratuiti comportano costi significativi durante l'aumento delle prestazioni. L'espansione delle operazioni richiede più hardware, personale IT qualificato e gestione avanzata dell'infrastruttura, aumentando i costi di hardware, personale e operativi. Il ridimensionamento dei database vettoriali open source può essere finanziariamente impegnativa nonostante l'assenza di tariffe di licenza.
Affrontare le sfide dei database vettoriali open source
Un database vettoriale completamente gestito che si integra in un database NoSQL o relazionale ad alte prestazioni evita costi aggiuntivi e complessità dei database vettoriali open source. Un tale database archivia, indicizza ed esegue query sugli incorporamenti e contemporaneamente sui dati originali corrispondenti. Questo approccio elimina il costo aggiuntivo della replica dei dati in un database vettoriale puro separato. Inoltre, mantenere insieme gli incorporamenti vettoriali e i dati originali facilita meglio le operazioni sui dati multimodali e consente una maggiore coerenza, scalabilità e prestazioni dei dati. Il servizio completamente gestito consente invece agli sviluppatori di evitare problemi di configurazione, manutenzione e affidamento sull'assistenza della community per un database vettoriale open source. Inoltre, alcuni servizi di database vettoriali gestiti offrono un livello gratuito di durata.
Un esempio è il database vettoriale integrato in Azure DocumentDB. Questa configurazione consente agli sviluppatori di risparmiare denaro come farebbe con database vettoriali open source. Tuttavia, a differenza delle opzioni open source, il provider di servizi si occupa di manutenzione, aggiornamenti e scalabilità. L'aggiornamento è semplice e rapido, mantenendo al tempo stesso un costo totale di proprietà (TCO) ridotto quando è il momento di aumentare le prestazioni delle operazioni. È anche possibile usare questo servizio per ridimensionare facilmente le applicazioni MongoDB già in produzione.
Eseguire una ricerca di somiglianza vettoriale
Azure DocumentDB offre potenti funzionalità di ricerca vettoriale, consentendo di eseguire ricerche di somiglianza ad alta velocità in set di dati complessi. Per eseguire la ricerca vettoriale in Azure DocumentDB, è prima necessario creare un indice vettoriale. Anche se Azure DocumentDB offre più opzioni, ecco alcune linee guida generali che consentono di iniziare in base alle dimensioni del set di dati:
| IVF | HNSW | DiskANN (scelta consigliata) | |
|---|---|---|---|
| Descrizione | Un indice IVFFlat divide i vettori in elenchi, quindi cerca un subset più vicino al vettore di query. | Un indice HNSW crea un grafico a più livelli. | DiskANN è un algoritmo di ricerca vicino approssimativo progettato per una ricerca vettoriale efficiente su qualsiasi scala. |
| Compromessi chiave |
Pro: Tempi di compilazione più rapidi, uso inferiore della memoria. Contro: Prestazioni delle query inferiori (in termini di compromesso tra velocità e richiamo). |
Pro: È possibile creare prestazioni di query migliori (in termini di compromesso tra velocità e richiamo) su una tabella vuota. Contro: Tempi di compilazione più lenti, uso di memoria superiore. |
Pro: Efficiente su qualsiasi scala, richiamo elevato, velocità effettiva elevata, bassa latenza. |
| Conteggio vettori | Meno di 10.000 | Fino a 50.000 | Fino a 500.000+ |
| Livello cluster consigliato | M10 o M20 | M30 e versioni successive | M30 e versioni successive |
È possibile usare gli indici DiskANN nei livelli M30 e superiori. Per creare l'indice DiskANN, impostare il "kind" parametro su "vector-diskann" come segue questo modello:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": <integer_value>,
"similarity": <string_value>,
"maxDegree" : <integer_value>,
"lBuild" : <integer_value>,
}
}
]
}
| Campo | TIPO | Description |
|---|---|---|
index_name |
string | Nome univoco dell'indice. |
path_to_property |
string | Percorso della proprietà che contiene il vettore. Questo percorso può essere una proprietà di primo livello o un percorso di notazione con punto per la proprietà. I vettori devono essere un number[] da indicizzare e usare nei risultati della ricerca vettoriale. Un vettore che usa un altro tipo, ad esempio double[], impedisce l'indicizzazione del documento. I documenti non indicizzati non vengono restituiti nel risultato di una ricerca vettoriale. |
kind |
string | Tipo di indice vettoriale da creare. Le opzioni sono vector-ivf, vector-hnsw e .vector-diskann |
dimensions |
integer | Numero di dimensioni per la somiglianza di vettore. DiskANN supporta fino a 16.000 dimensioni (con quantizzazione del prodotto), con supporto futuro previsto per 40.000+. |
similarity |
string | Metrica di somiglianza da usare con l'indice. Le opzioni possibili sono COS (distanza coseno), L2 (distanza euclidea) e IP (prodotto interno). |
maxDegree |
integer | Numero massimo di archi per nodo nel grafico. Questo parametro varia da 20 a 2048 (il valore predefinito è 32). Un maxDegree maggiore è adatto per i set di dati con requisiti di accuratezza elevata e/o dimensionalità elevata. |
lBuild |
integer | Imposta il numero di vicini candidati valutati durante la costruzione dell'indice DiskANN. Questo parametro, compreso tra 10 e 500 (il valore predefinito è 50), bilancia l'accuratezza e l'overhead di calcolo: i valori più elevati migliorano la qualità e l'accuratezza dell'indice, ma aumentano il tempo di compilazione |
Eseguire una ricerca vettoriale con DiskANN
Per eseguire una ricerca vettoriale, usare la fase $search della pipeline di aggregazione ed eseguire query con l'operatore cosmosSearch. DiskANN consente ricerche ad alte prestazioni in set di dati di grandi dimensioni con filtri facoltativi , ad esempio filtri geospaziali o basati su testo.
{
"$search": {
"cosmosSearch": {
"path": "<path_to_property>",
"query": "<query_vector>",
"k": <num_results_to_return>,
"filter": {"$and": [
{ "<attribute_1>": { "$eq": <value> } },
{"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
]}
}
}
},
| Campo | TIPO | Description |
|---|---|---|
lSearch |
integer | Specifica le dimensioni dell'elenco dei candidati dinamici per la ricerca. Il valore predefinito è 40, con un intervallo configurabile compreso tra 10 e 1000. L'aumento del valore migliora il richiamo, ma potrebbe ridurre la velocità di ricerca. |
k |
integer | Definisce il numero di risultati della ricerca da restituire. Il valore k deve essere minore o uguale a lSearch |
Esempio di utilizzo di un indice DiskANN con filtro
Aggiungere vettori al database
Per usare la ricerca vettoriale con filtri geospaziali, aggiungere documenti che includono incorporamenti di vettori e coordinate di posizione. È possibile creare gli incorporamenti usando il proprio modello, gli incorporamenti di Azure OpenAI o un'API come Hugging Face in Azure.
from pymongo import MongoClient
client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]
documents = [
{"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
{"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
{"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
{"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]
collection.insert_many(documents)
Creare un indice vettoriale DiskANN
Nell'esempio seguente viene illustrato come configurare un indice vettoriale DiskANN con funzionalità di filtro. Questo esempio include la creazione dell'indice vettoriale per la ricerca di somiglianza, l'aggiunta di documenti con proprietà vettoriali e geospaziali e l'indicizzazione dei campi per un maggiore filtro.
db.command({
"createIndexes": "testCollection",
"indexes": [
{
"name": "DiskANNVectorIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": 3,
"similarity": "COS",
"maxDegree": 32,
"lBuild": 64
}
},
{
"name": "is_open",
"key": {
"is_open": 1
}
},
{
"name": "locationIndex",
"key": {
"location": 1
}
}
]
})
Questo comando crea un indice vettoriale DiskANN nel campo contentVector in exampleCollection, abilitando le ricerche di somiglianza. Aggiunge anche:
- Un indice nel
is_opencampo, in modo da filtrare i risultati in base al fatto che le aziende siano aperte. - Indice geospaziale nel campo
locationda filtrare in base alla prossimità geografica.
Eseguire una ricerca vettoriale
Per trovare documenti con vettori simili all'interno di un raggio geografico specifico, specificare queryVector per la ricerca di somiglianza e includere un filtro geospaziale.
query_vector = [0.52, 0.28, 0.12]
pipeline = [
{
"$search": {
"cosmosSearch": {
"path": "contentVector",
"vector": query_vector,
"k": 5,
"filter": {
"$and": [
{"is_open": {"$eq": 1}},
{"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
]
}
}
}
}
]
results = list(collection.aggregate(pipeline))
for result in results:
print(result)
In questo esempio, la ricerca di somiglianza vettoriale restituisce i vettori più k vicini in base alla metrica di somiglianza COS specificata, filtrando i risultati in modo da includere solo le aziende aperte entro un raggio di 100 miglia.
[
{
similarityScore: 0.9745354109084544,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'CEO of AdventureWorks',
is_open: 1,
location: [-118.9865, 34.0145],
contentVector: [0.52, 0.20, 0.23]
}
},
{
similarityScore: 0.9006955671333992,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'President of Our Planet initiative',
is_open: 1,
location: [-119.7302, 34.4005],
contentVector: [0.91, 0.76, 0.83]
}
}
]
Questo risultato mostra i documenti più simili a queryVector, vincolati a un raggio di 100 miglia e aziende aperte. Ogni risultato include il punteggio di somiglianza e i metadati, dimostrando in che modo DiskANN in Azure DocumentDB supporta query di vettore e geospaziali combinate per esperienze di ricerca arricchite e sensibili alla posizione.
Ottenere definizioni di indice vettoriale
Per recuperare la definizione di indice vettoriale dalla raccolta, usare il comando listIndexes:
db.exampleCollection.getIndexes();
In questo esempio, vectorIndex viene restituito con tutti i parametri cosmosSearch usati per creare l'indice:
[
{ v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
{
v: 2,
key: { vectorContent: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
numLists: 3,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
Ricerca vettoriale filtrata
È ora possibile eseguire ricerche vettoriali con qualsiasi filtro di query supportato, ad esempio $lt, $lte, $eq, $neq, $gte, $gt, $in, $nine $regex.
Per usare il prefiltro, è prima necessario definire un indice standard per la proprietà in base alla quale si vuole filtrare, oltre all'indice vettoriale. Ecco un esempio di creazione di un indice di filtro:
db.runCommand({
"createIndexes": "<collection_name>",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Dopo aver applicato l'indice di filtro, è possibile aggiungere la "filter" clausola direttamente nella query di ricerca vettoriale. Questo esempio mostra come filtrare i risultati in cui il "title" valore della proprietà non è presente nell'elenco fornito:
db.exampleCollection.aggregate([
{
'$search': {
"cosmosSearch": {
"vector": "<query_vector>",
"path": <path_to_vector>,
"k": num_results,
"filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
},
"returnStoredSource": True }},
{'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);
Importante
Per ottimizzare le prestazioni e l'accuratezza delle ricerche dei vettori prefiltrati, valutare la possibilità di modificare i parametri dell'indice vettoriale. Per gli indici DiskANN, aumentare maxDegree o lBuild possa produrre risultati migliori. Per gli indici HNSW , l'esperimento con valori più elevati per m, efConstructiono efSearch può migliorare le prestazioni. Analogamente, per gli indici IVF , l'ottimizzazione numLists o nProbes potrebbe portare a risultati più soddisfacenti. È fondamentale testare la configurazione specifica con i dati per garantire che i risultati soddisfino i requisiti. Questi parametri influenzano la struttura dell'indice e il comportamento della ricerca e i valori ottimali possono variare in base alle caratteristiche dei dati e ai modelli di query.
Usare strumenti di orchestrazione LLM (Large Language Model)
Usare come database vettoriale con kernel semantico
Usare il kernel semantico per orchestrare il recupero delle informazioni da Azure DocumentDB e dall'LLM. Per altre informazioni, vedere il repository GitHub.
Usare come database vettoriale con LangChain
Usare LangChain per orchestrare il recupero delle informazioni da Azure DocumentDB e dall'LLM. Per altre informazioni, vedere Integrazioni di LangChain per Azure DocumentDB.
Usare come cache semantica con LangChain
Usare LangChain e Azure DocumentDB per orchestrare la memorizzazione nella cache semantica, usando risposte LLM registrate in precedenza che consentono di risparmiare sui costi dell'API LLM e ridurre la latenza per le risposte. Per altre informazioni, vedere Integrazione di LangChain con Azure DocumentDB.
Funzionalità e limitazioni
- Metriche di distanza supportate: L2 (euclideo), prodotto interno e coseno.
- Metodi di indicizzazione supportati: IVFFLAT, HNSW e DiskANN.
- Con DiskANN e la quantizzazione del prodotto, è possibile indicizzare vettori fino a 16.000 dimensioni.
- L'uso di HNSW o IVF con metà precisione consente l'indicizzazione di vettori fino a 4.000 dimensioni.
- Senza alcuna compressione, la dimensione massima massima predefinita per l'indicizzazione è 2.000.
- L'indicizzazione si applica a un solo vettore per percorso.
- È possibile creare un solo indice per percorso vettoriale.
Riassunto
Questa guida illustra come creare un indice vettoriale, aggiungere documenti con dati vettoriali, eseguire una ricerca di somiglianza e recuperare la definizione dell'indice. Usando il database vettoriale integrato, è possibile archiviare, indicizzare ed eseguire query sui dati vettoriali altamente dimensionali direttamente in Azure DocumentDB. Consente di sfruttare appieno il potenziale dei dati tramite incorporamenti vettoriali e consente di creare applicazioni più accurate, efficienti e potenti.
Contenuti correlati
- Soluzione di riferimento per la vendita al dettaglio di modelli .NET RAG
- Modello RAG C# - Integrare i servizi OpenAI con Cosmos
- Modello RAG python - Chatbot del prodotto Azure
- Esercitazione su notebook Python - Integrazione del database vettoriale tramite LangChain
- Esercitazione sul notebook Python - Integrazione di memorizzazione nella cache LLM tramite LangChain
- Python - Integrazione di LlamaIndex
- Integrazione della memoria nel Python Semantic Kernel