← work / index
Ø05

Dagorà ConnectAI

Describe the partner you need in a sentence and get the best matches from a 120-company membership, with a reason for each.

Ø1 Problem

Dagorà is a Swiss business community with a directory of more than 120 member companies. A directory is only useful if you already know who you are looking for, and most members do not. They know what they need: a logistics firm for cross-border e-commerce, a manufacturing partner in Ticino. Filtering by industry and country does not answer that question.

Ø2 Solution

A member types a sentence. It is embedded, ranked against every member profile by cosine similarity, and the top candidates go to a model with a strict brief: curate, do not summarise; only reference the data provided; never rank or criticise a company; and if none of the candidates fit, say so and suggest the member refine the query. The member gets two or three introductions with a plain-language reason for each, not a page of search results.

Ø3 Delivery

The first version was a Node.js prototype with a Qdrant vector database on a separate host. It proved the idea, and it also proved that a separate service was more than this needed. The production version lives inside the WordPress theme in PHP: embeddings sit in one MySQL table, vectors are L2-normalised on the way in so ranking is a dot product, and the index rebuilds from the admin screen in seconds. Companies arrive from HubSpot through a sync that publishes, updates, drafts or hides each one by rule, and the matcher re-embeds only profiles whose text has actually changed.

Notes from the build

  • Content-hashed embeddings: a rebuild skips every company whose profile text is unchanged and prunes the ones that have gone.
  • No vector database in production. Around 120 vectors of 1,536 floats rank in pure PHP faster than a network round trip.
  • The model curates, it does not rank. The prompt forbids scoring or criticising members, and treats anything that is not a genuine business need as off-topic.
  • Sync rules are written down in the admin screen: what happens to a new company, an updated one, a draft, an expired membership.
  • The Node and Qdrant prototype is kept as a record of what was tried and why it was retired.
dagora.ch/community
ConnectAI on the community site: describe the partner you need, then Find Matches
dagora.ch/community
Two matches for a cross-border logistics request, each with a match score, profile and a written reason
dagora.ch/community
The moment after submitting: 'Choosing the best matches'
dagora.ch/community
The admin screen: OpenAI configured, 123 companies indexed, last rebuild time, and a rebuild button
dagora.ch/community
The sync rules table: what happens to new, updated, draft and expired companies, and the status of each connected service