Использование поиска по сходству — как не потерять контент митапа в интернете
Случалось ли вам испытывать разочарование, вспоминая блестящую идею, которой поделились на Meetup, только чтобы обнаружить, что она затерялась в лабиринте прошедших событий? Как организатор и участник, я ощущал досаду от того, что ценный контент проваливается сквозь щели, как только мероприятие завершается. Слишком часто инсайты, которыми поделились в одном уголке мира, остаются изолированными и недоступными для тех, кто мог бы извлечь из них пользу в другом месте.
Чтобы решить эту проблему, я обратился к методам поиска по сходству, чтобы просеять обширный массив неструктурированных данных. Неструктурированные данные составляют 80% мировых данных и могут быть преобразованы в векторы с помощью различных моделей машинного обучения. Моим выбранным инструментом для этой задачи стал Milvus, популярная векторная база данных с открытым исходным кодом, которая отлично справляется с управлением и поиском в сложных ландшафтах данных. Milvus позволяет обнаруживать скрытые связи и сходства.
Для вычисления Embeddings я использую SentenceTransformers. Это Python-фреймворк для передовых эмбеддингов предложений, текста и изображений. Вы можете использовать его для вычисления эмбеддингов предложений/текста более чем для 100 языков. Затем эти эмбеддинги можно сравнивать, например, с помощью косинусного сходства, чтобы находить предложения с похожим смыслом.
Загрузка данных
У Meetup.com нет бесплатного публичного API. Вам понадобится Pro-аккаунт, чтобы получить к нему доступ, и вы можете проверить это самостоятельно здесь.
Поскольку API не является публичным, я сгенерировал некоторые данные из Meetup-группы, которой управляю. Вы можете найти простые данные на GitHub и загрузить их с помощью Pandas.
import pandas as pd
df = pd.read_csv(‘data/data_meetup.csv’)
Технологический стек: Milvus и SentenceTransformers
Мы будем использовать Milvus как векторную базу данных, SentenceTransformers для генерации текстовых эмбеддингов и OpenAI GPT 3.5-turbo для краткого изложения сути Meetup. В описании мероприятия обычно много шума, поэтому их суммаризация может с этим помочь.
Milvus Lite
Milvus предлагает различные варианты развертывания для разных потребностей. Для легкой и простой настройки идеально подходит Milvus Lite. Его можно легко установить через PyPi pip install Milvus и запускать непосредственно внутри Jupyter notebook, что обеспечивает удобный способ добавить возможности векторной базы данных в наш проект.
Milvus с Docker/ Docker Compose
Для более серьезных потребностей Milvus можно развернуть с помощью Docker Compose, поскольку это распределенная система.
Файл docker compose доступен на странице Install Milvus Standalone page и в Milvus GitHub. Когда вы запускаете Milvus с Docker Compose, вы увидите три контейнера и по умолчанию будете подключаться к Milvus через порт 19530.
SentenceTransformers
SentenceTransfomers используется для создания наших Embeddings, он доступен на PyPi с помощью pip install sentence-transformers. Мы будем использовать модель all-MiniLM-L6-v2, поскольку она в 5 раз меньше, чем в 5 раз быстрее, и при этом предлагает хорошее качество по сравнению с лучшей моделью, которую они предлагают.
Выполнение запросов поиска по сходству
Запуск Milvus
Чтобы выполнить поиск по сходству, нам нужна векторная база данных. Чтобы запустить ее, просто импортируйте default_server и вызовите функцию start().
from milvus import default_server
default_server.start()
Загрузка данных в Milvus
Прежде чем добавлять данные в Milvus, нам нужно создать Collection и подготовить Schema. Сначала подготовьте необходимые параметры, включая схему полей, схему коллекции и имя коллекции.
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)
Теперь, когда Collection и схема созданы, мы можем создать индекс для поля embedding и загрузить данные в память с помощью функции load().
collection.create_index(field_name="embedding")
collection.load()
Создание Embeddings с помощью SentenceTransformer
Как уже говорилось ранее, мы будем использовать SentenceTransformer и модель 'all-MiniLM-L6-v2' для создания наших embeddings. Давайте импортируем то, что для этого необходимо.
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)
Суммирование содержания Meetups
Описания Meetups, хотя и информативны, также могут быть довольно зашумленными: обычно они содержат информацию о расписании, о том, кто спонсирует мероприятие, различные правила площадки/мероприятия и т. д. Хотя всё это очень важно, когда вы посещаете Meetup, для нашего сценария использования это не имеет значения. Я использую OpenAI GPT-3.5-turbo для суммирования содержания.
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
Возврат похожего содержимого
Чтобы наш Similarity Search работал, мы должны убедиться, что наша Vector Database может понимать наши поисковые запросы; давайте создадим embeddings для наших поисковых запросов.
search_terms = "The speaker speaks about Open Source and ML Platform"
search_data = [transformer.encode(search_terms)] # Must be a list.
Поиск похожего содержимого в Milvus Collection
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')
Результаты
Milvus вернул три meetups об Open-Source и ML Platform, организованные MLOps.community и Neptune.ai.
Ниже приведены подробности:
Search terms: The speaker speaks about Open Source and ML Platform
Results:
Первый митап MLOps.community в Берлине ---- 0.5537542700767517
На митапе MLOps.community в Берлине 30 июня состоится основной доклад Stephen Batifol из Wolt о масштабировании open-source машинного обучения. Мероприятие также будет включать lightning talks, нетворкинг, еду и напитки. В программе: открытие дверей в 18:00, доклад Stephen в 19:00, lightning talks в 19:50 и общение в 20:15. Участники могут записаться на lightning talks на Meetup.com. Мероприятие проводится в сотрудничестве с <a href="https://neptune.ai/>neptune.ai</a>
MLOps.community Berlin 04: Предварительное мероприятие Women+ In Data and AI Festival ---- 0.4623506963253021
MLOps.community Berlin проводит специальное мероприятие 29 и 30 июня в Thoughtworks. Мероприятие является разминкой перед фестивалем Women+ In Data and AI. На митапе выступят Fiona Coath с обсуждением surveillance capitalism и Magdalena Stenius с рассказом об углеродном следе машинного обучения. Программа включает доклады, lightning talks и возможности для нетворкинга. Участникам рекомендуется ознакомиться с Code of Conduct мероприятия и соблюдать его для создания инклюзивной и уважительной среды.
MLOps.community Berlin Meetup 02 ---- 0.41342616081237793
На митапе MLOps.community в Берлине 6 октября состоится основной доклад Lina Weichbrodt о ML Monitoring, lightning talks и возможности для нетворкинга. Мероприятие пройдет в офисе Wolt с ограничением вместимости в 150 человек. Lina имеет обширный опыт в разработке масштабируемых моделей машинного обучения и работала в таких компаниях, как Zalando и DKB. Программа включает еду, активность для знакомства, основной доклад, lightning talks и общение. Участники также могут записаться, чтобы выступить с lightning talks на различные темы, связанные с MLOps. Мероприятие проводится в сотрудничестве с neptune.ai.
Не стесняйтесь ознакомиться с кодом на Github.
Читать далее

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.

Why I’m Against Claude Code’s Grep-Only Retrieval? It Just Burns Too Many Tokens
Learn how vector-based code retrieval cuts Claude Code token consumption by 40%. Open-source solution with easy MCP integration. Try claude-context today.

Announcing the General Availability of Zilliz Cloud BYOC on Google Cloud Platform
Zilliz Cloud BYOC on GCP offers enterprise vector search with full data sovereignty and seamless integration.



