Uso de la búsqueda por similitud - Cómo no perder contenido de Meetup en Internet
¿Alguna vez has experimentado la frustración de recordar una idea brillante compartida en un Meetup, solo para descubrir que se perdió en el laberinto de eventos pasados? Como organizador y asistente, he sentido el golpe de ver contenido valioso escaparse entre las grietas una vez que el evento termina. Con demasiada frecuencia, los conocimientos compartidos en un rincón del mundo permanecen aislados, inaccesibles para quienes podrían beneficiarse de ellos en otros lugares.
Para abordar este problema, recurrí a técnicas de búsqueda por similitud para examinar la amplia variedad de datos no estructurados. Los datos no estructurados representan el 80% de los datos del mundo y pueden convertirse en vectores usando diferentes modelos de Machine Learning. La herramienta que elegí para esta tarea fue Milvus, una popular base de datos vectorial de código abierto que destaca en la gestión y búsqueda dentro de paisajes de datos complejos. Milvus hace posible descubrir conexiones y similitudes subyacentes.
Para calcular Embeddings, estoy usando SentenceTransformers. Es un framework de Python para embeddings de frases, texto e imágenes de última generación. Puedes usarlo para calcular embeddings de frases/texto en más de 100 idiomas. Estos embeddings pueden luego compararse, por ejemplo, con similitud de coseno, para encontrar frases con un significado similar.
Descarga de los datos
Meetup.com no tiene una API pública gratuita. Necesitarás una cuenta Pro para acceder a ella, y puedes comprobarlo tú mismo aquí.
Como la API no es pública, generé algunos datos a partir de un grupo de Meetup que administro. Puedes encontrar los datos simples en GitHub y cargarlos con Pandas.
import pandas as pd
df = pd.read_csv(‘data/data_meetup.csv’)
El stack tecnológico: Milvus y SentenceTransformers
Usaremos Milvus como base de datos vectorial, SentenceTransformers para generar embeddings de texto y OpenAI GPT 3.5-turbo para resumir la esencia de Meetup. Normalmente hay mucho ruido en la descripción del evento, por lo que resumirlas puede ayudar con eso.
Milvus Lite
Milvus ofrece diferentes opciones de despliegue para adaptarse a distintas necesidades. Para una configuración ligera y sencilla, Milvus Lite es ideal. Se puede instalar fácilmente mediante PyPi pip install Milvus y ejecutarse directamente dentro de un notebook de Jupyter, proporcionando una forma sin complicaciones de incorporar capacidades de base de datos vectorial en nuestro proyecto.
Milvus con Docker/ Docker Compose
Para necesidades más robustas, Milvus puede desplegarse usando Docker Compose, ya que es un sistema distribuido.
El archivo docker compose está disponible en la página Install Milvus Standalone y en Milvus GitHub. Cuando inicies Milvus con Docker Compose, verás tres contenedores y te conectarás a Milvus a través del puerto 19530 de forma predeterminada.
SentenceTransformers
SentenceTransfomers se usa para crear nuestros Embeddings, está disponible en PyPi con pip install sentence-transformers. Usaremos el modelo all-MiniLM-L6-v2 ya que es 5 veces más pequeño que 5 veces más rápido y aun así ofrece buena calidad en comparación con el mejor modelo que ofrecen.
Realizar consultas de búsqueda por similitud
Iniciar Milvus
Para realizar una búsqueda por similitud, necesitamos tener una base de datos vectorial. Para iniciarla, simplemente importa el default_server y llama a la función start().
from milvus import default_server
default_server.start()
Cargar los datos en Milvus
Antes de poder añadir datos a Milvus, necesitamos crear una Collection y preparar un Schema. Primero, prepara los parámetros necesarios, incluido el esquema de campos, el esquema de la colección y el nombre de la colección.
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)
Ahora que la Collection y el schema están creados, podemos crear un índice para el campo embedding y cargar los datos en memoria con la función load().
collection.create_index(field_name="embedding")
collection.load()
Crear embeddings con SentenceTransformer
Como se dijo anteriormente, usaremos SentenceTransformer y el modelo 'all-MiniLM-L6-v2' para crear nuestros embeddings. Importemos lo necesario para eso.
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)
Resumir el contenido de los Meetups
Las descripciones de los Meetups, aunque informativas, también pueden ser bastante ruidosas; normalmente contienen información del programa, quién patrocina el evento y diferentes reglas sobre el lugar/evento, etc. Si bien eso es muy importante cuando asistes a un Meetup, no importa para nuestro caso de uso. Uso OpenAI GPT-3.5-turbo para resumir el contenido.
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
Devolver contenido similar
Para que nuestra búsqueda por similitud funcione, tenemos que asegurarnos de que nuestra base de datos vectorial pueda entender nuestros términos de búsqueda; creemos embeddings de nuestros términos de búsqueda.
search_terms = "The speaker speaks about Open Source and ML Platform"
search_data = [transformer.encode(search_terms)] # Must be a list.
Buscar contenido similar en la Collection de 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')
Resultados
Milvus devolvió tres meetups sobre Open-Source y ML Platform organizados por MLOps.community y Neptune.ai.
A continuación se muestran los detalles:
Search terms: The speaker speaks about Open Source and ML Platform
Results:
Primer Meetup de MLOps.community Berlin ---- 0.5537542700767517
El meetup de MLOps.community en Berlín el 30 de junio contará con una charla principal de Stephen Batifol de Wolt sobre el escalado del aprendizaje automático de código abierto. El evento también incluirá charlas relámpago, networking, y comida y bebidas. La agenda incluye apertura de puertas a las 6:00 pm, la charla de Stephen a las 7:00 pm, charlas relámpago a las 7:50 pm y socialización a las 8:15 pm. Los asistentes pueden inscribirse para las charlas relámpago en Meetup.com. El evento es en colaboración con <a href="https://neptune.ai/>neptune.ai</a>
MLOps.community Berlin 04: Pre-evento Women+ In Data and AI Festival ---- 0.4623506963253021
MLOps.community Berlin organiza un evento de edición especial el 29 y 30 de junio en Thoughtworks. El evento es un calentamiento para el festival Women+ In Data and AI. El meetup contará con las ponentes Fiona Coath, que hablará sobre el capitalismo de vigilancia, y Magdalena Stenius, que hablará sobre la huella de carbono del aprendizaje automático. La agenda incluye charlas, charlas relámpago y oportunidades de networking. Se anima a los asistentes a revisar y cumplir el Código de Conducta del evento para un entorno inclusivo y respetuoso.
MLOps.community Berlin Meetup 02 ---- 0.41342616081237793
El meetup de MLOps.community en Berlín el 6 de octubre contará con una charla principal de Lina Weichbrodt sobre ML Monitoring, charlas relámpago y oportunidades de networking. El evento se celebrará en la oficina de Wolt con un límite de capacidad de 150 personas. Lina tiene amplia experiencia en el desarrollo de modelos de aprendizaje automático escalables y ha trabajado en empresas como Zalando y DKB. La agenda incluye comida, una actividad de vinculación, la charla principal, charlas relámpago y socialización. Los asistentes también pueden inscribirse para dar charlas relámpago sobre diversos temas relacionados con MLOps. El evento es en colaboración con neptune.ai.
No dudes en consultar el código en Github.
Sigue leyendo

Top 10 Context Engineering Techniques You Should Know for Production RAG
A practical guide to context engineering for production LLM systems, covering RAG, context processing, memory, agents, and multimodal context.

Zilliz Cloud Now Available in Azure North Europe: Bringing AI-Powered Vector Search Closer to European Customers
The addition of the Azure North Europe (Ireland) region further expands our global footprint to better serve our European customers.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.



