유사도 검색 사용하기 - 인터넷에서 Meetup 콘텐츠를 잃어버리지 않는 방법
Meetup에서 공유된 기발한 아이디어를 떠올렸지만, 과거 이벤트의 미로 속에서 사라져 버린 것을 발견하고 좌절감을 느껴본 적이 있나요? 주최자이자 참석자로서, 이벤트가 끝나면 가치 있는 콘텐츠가 틈새로 빠져나가는 아쉬움을 느껴왔습니다. 너무 자주, 지구 한쪽에서 공유된 인사이트가 사일로화되어 다른 곳에서 혜택을 받을 수 있는 사람들이 접근할 수 없게 됩니다.
이 문제를 해결하기 위해, 저는 방대한 비정형 데이터를 살펴보기 위해 유사도 검색 기법을 활용했습니다. 비정형 데이터는 전 세계 데이터의 80%를 차지하며, 다양한 머신러닝 모델을 사용해 벡터로 변환할 수 있습니다. 이 작업을 위해 제가 선택한 도구는 복잡한 데이터 환경을 관리하고 검색하는 데 뛰어난 인기 있는 오픈 소스 벡터 데이터베이스인 Milvus였습니다. Milvus는 숨겨진 연결성과 유사성을 발견할 수 있게 해줍니다.
임베딩을 계산하기 위해 저는 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를, Meetup의 핵심을 요약하기 위해 OpenAI GPT 3.5-turbo를 사용할 것입니다. 이벤트 설명에는 보통 많은 노이즈가 있으므로 이를 요약하면 도움이 될 수 있습니다.
Milvus Lite
Milvus는 다양한 요구에 맞는 여러 배포 옵션을 제공합니다. 가볍고 간단한 설정을 원한다면 Milvus Lite가 이상적입니다. PyPi를 통해 pip install Milvus로 쉽게 설치할 수 있고 Jupyter notebook 내에서 직접 실행할 수 있어, 벡터 데이터베이스 기능을 프로젝트에 번거로움 없이 통합할 수 있습니다.
Docker/ Docker Compose를 사용하는 Milvus
더 강력한 요구 사항을 위해 Milvus는 분산 시스템이므로 Docker Compose를 사용해 배포할 수 있습니다.
docker compose 파일은 Install Milvus Standalone page와 Milvus GitHub에서 확인할 수 있습니다. Docker Compose로 Milvus를 실행하면 세 개의 컨테이너가 표시되며 기본적으로 포트 19530을 통해 Milvus에 연결됩니다.
SentenceTransformers
SentenceTransfomers는 임베딩을 생성하는 데 사용되며, PyPi에서 pip install sentence-transformers로 사용할 수 있습니다. 우리는 all-MiniLM-L6-v2 모델을 사용할 것인데, 이는 그들이 제공하는 최고의 모델과 비교해 5배 더 작고 5배 더 빠르면서도 여전히 좋은 품질을 제공하기 때문입니다.
유사도 검색 쿼리 수행
Milvus 시작
유사도 검색을 수행하려면 벡터 데이터베이스가 필요합니다. 이를 시작하려면 default_server를 import하고 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과 schema가 생성되었으므로 embedding 필드에 대한 인덱스를 생성하고 load() 함수로 데이터를 메모리에 로드할 수 있습니다.
collection.create_index(field_name="embedding")
collection.load()
SentenceTransformer로 Embedding 생성하기
앞서 말했듯이, 우리는 SentenceTransformer와 모델 'all-MiniLM-L6-v2'를 사용해 embedding을 생성할 것입니다. 이를 위해 필요한 것을 import해 보겠습니다.
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)
Meetup 콘텐츠 요약하기
Meetup 설명은 유익하지만 상당히 노이즈가 많을 수도 있으며, 보통 일정 정보, 이벤트 후원자, 장소/이벤트에 대한 다양한 규칙 등을 포함합니다. 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가 검색어를 이해할 수 있도록 해야 합니다. 검색어의 embedding을 생성해 보겠습니다.
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는 MLOps.community와 Neptune.ai가 주최한 Open-Source 및 ML Platform에 관한 세 개의 meetup을 반환했습니다.
세부 내용은 아래와 같습니다:
Search terms: The speaker speaks about Open Source and ML Platform
Results:
첫 번째 MLOps.community Berlin 밋업 ---- 0.5537542700767517
6월 30일 베를린에서 열리는 MLOps.community 밋업에서는 Wolt의 Stephen Batifol이 오픈소스 머신러닝 확장에 대한 메인 발표를 진행합니다. 이 행사에는 라이트닝 토크, 네트워킹, 음식과 음료도 포함됩니다. 일정은 오후 6:00 입장 시작, 오후 7:00 Stephen의 발표, 오후 7:50 라이트닝 토크, 오후 8:15 교류 시간으로 구성되어 있습니다. 참석자는 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은 6월 29일과 30일 Thoughtworks에서 특별판 행사를 개최합니다. 이 행사는 Women+ In Data and AI festival을 위한 워밍업입니다. 밋업에서는 Fiona Coath가 감시 자본주의에 대해 이야기하고, Magdalena Stenius가 머신러닝의 탄소 발자국에 대해 발표합니다. 일정에는 발표, 라이트닝 토크, 네트워킹 기회가 포함됩니다. 참석자는 포용적이고 존중하는 환경을 위해 행사의 행동 강령을 검토하고 준수할 것을 권장받습니다.
MLOps.community Berlin 밋업 02 ---- 0.41342616081237793
10월 6일 베를린에서 열리는 MLOps.community 밋업에서는 Lina Weichbrodt가 ML 모니터링에 대한 메인 발표를 진행하며, 라이트닝 토크와 네트워킹 기회도 제공됩니다. 행사는 Wolt 사무실에서 열리며 수용 인원은 150명으로 제한됩니다. Lina는 확장 가능한 머신러닝 모델 개발에 폭넓은 경험을 보유하고 있으며 Zalando와 DKB 같은 회사에서 근무한 바 있습니다. 일정에는 음식, 친목 활동, 메인 발표, 라이트닝 토크, 교류 시간이 포함됩니다. 참석자는 다양한 MLOps 관련 주제로 라이트닝 토크 발표를 신청할 수도 있습니다. 이 행사는 neptune.ai와 협력하여 진행됩니다.
Github에서 코드를 자유롭게 확인해 보세요.
계속 읽기

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

Zilliz Cloud Delivers Better Performance and Lower Costs with Arm Neoverse-based AWS Graviton
Zilliz Cloud adopts Arm-based AWS Graviton3 CPUs to cut costs, speed up AI vector search, and power billion-scale RAG and semantic search workloads.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



