Utilizzare la ricerca per similarità - Come non perdere i contenuti di Meetup su Internet
Hai mai provato la frustrazione di ricordare un’idea brillante condivisa a un Meetup, per poi scoprire che si è persa nel labirinto degli eventi passati? Come organizzatore e partecipante, ho sperimentato il dispiacere di vedere contenuti preziosi sfuggire tra le maglie una volta concluso l’evento. Troppo spesso, gli insight condivisi in un angolo del mondo rimangono isolati, inaccessibili a chi potrebbe trarne beneficio altrove.
Per affrontare questo problema, mi sono affidato alle tecniche di ricerca per similarità per passare al setaccio l’ampia gamma di dati non strutturati. I dati non strutturati rappresentano l’80% dei dati mondiali e possono essere convertiti in vettori usando diversi modelli di Machine Learning. Lo strumento che ho scelto per questo compito è stato Milvus, un popolare database vettoriale open-source che eccelle nella gestione e nella ricerca all’interno di scenari di dati complessi. Milvus rende possibile scoprire connessioni e similarità sottostanti.
Per calcolare gli Embedding, sto usando SentenceTransformers. È un framework Python per embedding di frasi, testi e immagini all’avanguardia. Puoi usarlo per calcolare embedding di frasi/testi per più di 100 lingue. Questi embedding possono poi essere confrontati, ad esempio con la similarità coseno, per trovare frasi con un significato simile.
Scaricare i dati
Meetup.com non ha un’API pubblica gratuita. Avrai bisogno di un account Pro per accedervi, e puoi verificarlo tu stesso qui.
Poiché l’API non è pubblica, ho generato alcuni dati da un gruppo Meetup che gestisco. Puoi trovare i dati semplici su GitHub e caricarli con Pandas.
import pandas as pd
df = pd.read_csv(‘data/data_meetup.csv’)
Lo stack tecnologico: Milvus e SentenceTransformers
Useremo Milvus come database vettoriale, SentenceTransformers per generare embedding testuali e OpenAI GPT 3.5-turbo per riassumere l’essenza del Meetup. Di solito c’è molto rumore nella descrizione dell’evento, quindi riassumerle può essere d’aiuto.
Milvus Lite
Milvus offre diverse opzioni di deployment per adattarsi a esigenze differenti. Per una configurazione leggera e semplice, Milvus Lite è ideale. Può essere facilmente installato tramite PyPi pip install Milvus ed eseguito direttamente all’interno di un notebook Jupyter, offrendo un modo senza complicazioni per integrare le funzionalità di un database vettoriale nel nostro progetto.
Milvus con Docker/ Docker Compose
Per esigenze più robuste, Milvus può essere distribuito usando Docker Compose, poiché è un sistema distribuito.
Il file docker compose è disponibile nella pagina Install Milvus Standalone e su Milvus GitHub. Quando avvii Milvus con Docker Compose, vedrai tre container e ti connetterai a Milvus tramite la porta 19530 per impostazione predefinita.
SentenceTransformers
SentenceTransfomers viene usato per creare i nostri Embedding, è disponibile su PyPi con pip install sentence-transformers. Useremo il modello all-MiniLM-L6-v2 perché è 5 volte più piccolo e 5 volte più veloce e offre comunque una buona qualità rispetto al miglior modello che offrono.
Eseguire query di ricerca per similarità
Avviare Milvus
Per eseguire una ricerca per similarità, dobbiamo avere un database vettoriale. Per avviarlo, importa semplicemente default_server e chiama la funzione start().
from milvus import default_server
default_server.start()
Popolare i dati in Milvus
Prima di poter aggiungere dati a Milvus, dobbiamo creare una Collection e preparare uno Schema. Innanzitutto, prepara i parametri necessari, inclusi lo schema dei campi, lo schema della collection e il nome della collection.
from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
# We insert the object in the format of title, date, content, content embedding
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=500),
FieldSchema(name="date", dtype=DataType.VARCHAR, max_length=100),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=10000),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]
schema = CollectionSchema(fields=fields)
collection = Collection(name=”mlops_meetups”, schema=schema)
Ora che la Collection e lo schema sono stati creati, possiamo creare un indice per il campo embedding e caricare i dati in memoria con la funzione load().
collection.create_index(field_name="embedding")
collection.load()
Crea Embedding con SentenceTransformer
Come detto in precedenza, useremo SentenceTransformer e il modello 'all-MiniLM-L6-v2' per creare i nostri embedding. Importiamo ciò che serve a questo scopo.
from sentence_transformers import SentenceTransformer
transformer = SentenceTransformer('all-MiniLM-L6-v2')
content_detail = df[‘content’]
content_detail = content_detail.tolist()
embeddings = [transformer.encode(c) for c in content_detail]
# Create an embedding column in our Dataframe
df['embedding'] = embeddings
# Insert the data in the collection
collection.insert(data=df)
Riassumi il contenuto dei Meetup
Le descrizioni dei Meetup, pur essendo informative, possono anche essere piuttosto rumorose: di solito contengono informazioni sul programma, su chi sponsorizza l’evento e diverse regole sulla sede/evento, ecc. Sebbene siano molto importanti quando partecipi a un Meetup, non sono rilevanti per il nostro caso d’uso. Uso OpenAI GPT-3.5-turbo per riassumere il contenuto.
def summarise_meetup_content(content: str) -> str:
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "Summarize content you are provided with."
},
{
"role": "user",
"content": f"{content}"
}
],
temperature=0,
max_tokens=1024,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
summary = response.choices[0].message.content
return summary
Restituisci contenuti simili
Affinché la nostra Similarity Search funzioni, dobbiamo assicurarci che il nostro Vector Database possa comprendere i nostri termini di ricerca; creiamo gli embedding dei nostri termini di ricerca.
search_terms = "The speaker speaks about Open Source and ML Platform"
search_data = [transformer.encode(search_terms)] # Must be a list.
Cerca contenuti simili nella Collection Milvus
res = collection.search(
data=search_data, # Embedded search value
anns_field="embedding", # Search across embeddings
param={"metric_type": "IP"},
limit = 3, # Limit to top_k results per search
output_fields=["title", "content"] # Include title field in result
)
for hits_i, hits in enumerate(res):
print("Search Terms:", search_terms)
print("Results:")
for hit in hits:
content_test = hit.entity.get("content")
print(hit.entity.get("title"), "----", hit.distance)
print(f'{summarise_meetup_content(hit.entity.get("content"))} \n')
Risultati
Milvus ha restituito tre meetup su Open-Source e ML Platform ospitati da MLOps.community e Neptune.ai.
Di seguito i dettagli:
Search terms: The speaker speaks about Open Source and ML Platform
Results:
Primo Meetup MLOps.community Berlin ---- 0.5537542700767517
Il meetup MLOps.community a Berlino del 30 giugno presenterà un talk principale di Stephen Batifol di Wolt su Scaling Open-Source Machine Learning. L'evento includerà anche lightning talk, networking e cibo e bevande. L'agenda prevede l'apertura delle porte alle 18:00, il talk di Stephen alle 19:00, lightning talk alle 19:50 e socializzazione alle 20:15. I partecipanti possono iscriversi ai lightning talk su Meetup.com. L'evento è in collaborazione con <a href="https://neptune.ai/>neptune.ai</a>
MLOps.community Berlin 04: Pre-event Women+ In Data and AI Festival ---- 0.4623506963253021
MLOps.community Berlin ospita un evento in edizione speciale il 29 e 30 giugno presso Thoughtworks. L'evento è un warm-up per il festival Women+ In Data and AI. Il meetup presenterà le relatrici Fiona Coath, che discuterà di capitalismo della sorveglianza, e Magdalena Stenius, che parlerà dell'impronta di carbonio del machine learning. L'agenda include talk, lightning talk e opportunità di networking. I partecipanti sono incoraggiati a leggere e rispettare il Code of Conduct dell'evento per un ambiente inclusivo e rispettoso.
MLOps.community Berlin Meetup 02 ---- 0.41342616081237793
Il meetup MLOps.community a Berlino del 6 ottobre presenterà un talk principale di Lina Weichbrodt su ML Monitoring, lightning talk e opportunità di networking. L'evento si terrà presso l'ufficio di Wolt con un limite di capienza di 150 persone. Lina ha una vasta esperienza nello sviluppo di modelli di machine learning scalabili e ha lavorato in aziende come Zalando e DKB. L'agenda include cibo, un'attività di bonding, il talk principale, lightning talk e socializzazione. I partecipanti possono anche iscriversi per tenere lightning talk su vari argomenti legati a MLOps. L'evento è in collaborazione con neptune.ai.
Sentiti libero di dare un'occhiata al codice su Github.
Continua a leggere

Milvus 2.6.x Now Generally Available on Zilliz Cloud, Making Vector Search Faster, Smarter, and More Cost-Efficient for Production AI
Milvus 2.6.x is now GA on Zilliz Cloud, delivering faster vector search, smarter hybrid queries, and lower costs for production RAG and AI applications.

DeepSeek-OCR Explained: Optical Compression for Scalable Long-Context and RAG Systems
Discover how DeepSeek-OCR uses visual tokens and Contexts Optical Compression to boost long-context LLM efficiency and reshape RAG performance.

DeepSeek Always Busy? Deploy It Locally with Milvus in Just 10 Minutes—No More Waiting!
Learn how to set up DeepSeek-R1 on your local machine using Ollama, AnythingLLM, and Milvus in just 10 minutes. Bypass busy servers and enhance AI responses with custom data.



