Intelligent matchmaking system for event attendees powered by AI, semantic search, and tool-based orchestration.
Intelligent Event Matchmaker helps event participants discover high-quality, relevant connections by understanding intent, analyzing profiles, and generating personalized introductions.
Unlike traditional filtering systems, this solution uses:
- AI-driven intent understanding
- Semantic similarity search
- Structured match scoring
- Automated outreach generation
- π€ AI Agent with Tool Orchestration
- π Semantic Search (pgvector)
- π§ Hybrid Match Scoring Engine
- βοΈ Personalized Intro Message Generator
- β‘ RESTful API (NestJS)
- π§ͺ End-to-End Testing (Jest)
- π Load Testing (k6)
| Layer | Technology |
|---|---|
| Backend | NestJS (Node.js 20) |
| Database | PostgreSQL + pgvector |
| ORM | TypeORM |
| AI | OpenAI API |
| Testing | Jest + Supertest |
| Load Testing | k6 |
This system follows a tool-based AI orchestration pattern, where the LLM is responsible for intent understanding and decision-making, while all business logic is handled by the backend.
-
User Request
- The user sends a message describing what they are looking for.
-
Concierge Service
- Acts as the central orchestrator.
- Sends the request to the LLM along with available tools.
-
LLM (Intent & Tool Selection)
- Interprets user intent.
- Decides which tools to call (e.g., search, scoring, intro generation).
-
Tool Execution
- Search Tool β retrieves relevant attendees (semantic or DB query)
- Score Tool β ranks candidates using deterministic logic
- Intro Tool β generates personalized introduction messages
-
Data Layer
- PostgreSQL stores attendees, conversations, and optional embeddings.
- Semantic search (pgvector) is used when available.
-
Final Response
- Results are aggregated into a structured JSON response.
- Returned to the user via the API.
-
LLM for reasoning, not logic Prevents hallucination and keeps behavior predictable.
-
Backend-driven decisions Scoring and filtering are deterministic and explainable.
-
Tool-based architecture Makes the system modular, testable, and extensible.
-
Hybrid retrieval approach Combines semantic search with rule-based ranking for better relevance.
This architecture ensures that the system is:
- Reliable β no hidden AI logic affecting core decisions
- Explainable β every match can be justified
- Scalable β tools can be extended independently
- Production-ready β avoids over-reliance on LLM responses
sequenceDiagram
participant U as User
participant API as NestJS API
participant LLM as OpenAI
participant Tool as Tools
participant DB as Database
U->>API: Send message
API->>LLM: Understand intent
LLM->>Tool: search_attendees
Tool->>DB: Query
DB-->>Tool: Candidates
Tool-->>LLM: Results
LLM->>Tool: score_match
LLM->>Tool: draft_intro
LLM-->>API: Structured output
API-->>U: JSON response
The system uses a hybrid approach:
- Embedding-based similarity search
- Finds relevant candidates beyond keyword matching
- Skill overlap
- Role alignment
- Intent compatibility
src/
βββ modules/
β βββ attendee/
β βββ event/
β βββ conversation/
β βββ concierge/
β β βββ tools/
β β βββ concierge.service.ts
β β βββ utils/
β
βββ scripts/
β βββ generate-embedding.ts
test/
βββ *.e2e-spec.tsnpm installCopy from .env.example using the following command:
cp .env.example .envThe database and required extensions are automatically initialized during the first run. No manual setup is required.
-- pgvector extension is enabled automaticallynpm run migration:run
# or rollback if needed
npm run migration:revertnpm run embedEmbeddings are used to enable semantic search, allowing the system to find relevant attendees based on meaning and intent rather than exact keyword matches.
docker-compose up --buildnpm run start:devPOST /events
{
"title": "AI Conference",
"location": "Jakarta"
}POST /events/:eventId/attendees
{
"name": "John Doe",
"role": "Backend Engineer",
"skills": ["nodejs", "ai"],
"lookingFor": "AI founder",
"openToChat": true
}POST /events/:eventId/concierge/messages
{
"attendeeId": "1",
"message": "Looking for AI co-founder"
}{
"summary": "Found 3 strong matches",
"matches": [
{
"name": "Sarah Lim",
"role": "AI Founder",
"score": 92,
"shared_ground": ["AI"],
"why_match": "Strong alignment in AI and startup interest",
"intro_message": "Hi Sarah..."
}
]
}Run E2E tests:
npm run test:e2eCoverage:
- Event API
- Attendee API
- Concierge API
- Edge cases
Run:
k6 run k6/concierge-load-test.jsSummary output:
{
"avg_duration": 320,
"p95": 600,
"error_rate": 0
}- Depends on OpenAI API latency
- Embedding generation is batch-based
- No multi-turn conversation memory yet
- Multi-turn conversation memory
- Real-time recommendation streaming
- Feedback loop (learning system)
- Embedding caching
- Advanced LLM ranking
- LLM handles intent, not business logic
- Backend ensures deterministic behavior
- Semantic search improves relevance
- Scoring ensures explainability
Built as part of AI Engineering Challenge.