技術堆疊與架構

完整展示 AI 驅動的人才媒合系統技術實作細節

展示 8 項核心技術能力
15
API 端點
4
資料表設計
1536
向量維度
4
評分維度

1 技術堆疊

後端技術

核心框架

Node.js v18 TypeScript 5.3 Express.js 4.18

資料庫

Supabase PostgreSQL

AI/ML 服務

OpenAI API Pinecone

前端技術

核心技術

HTML5 Tailwind CSS JavaScript ES6+

設計模式

響應式設計 AJAX

部署

Nginx PM2 SSL/HTTPS

2 系統架構

前端層
• HTML/CSS/JS
• Tailwind CSS
• Fetch API
• 響應式設計
API 層
• Express.js
• RESTful API
• CORS 配置
• 錯誤處理
服務層
• 資料庫服務
• OpenAI 服務
• Pinecone 服務
• 匹配演算法
資料層
Supabase (PostgreSQL)
• talents 表
• jobs 表
• matches 表
• embeddings_cache 表
Pinecone (向量資料庫)
• 向量索引
• 相似度搜尋
• 元資料過濾
OpenAI
• Embeddings API
• GPT-4 API
• Prompt Engineering

3 AI 媒合工作流程

1
獲取人才資料

從 Supabase 查詢人才的技能描述、經驗、薪資期望等資訊

2
生成/獲取 Embedding

檢查快取,如不存在則呼叫 OpenAI text-embedding-3-small API 生成 1536 維向量

embedding = openai.embeddings.create( model="text-embedding-3-small", input=talent.skills_description )
3
向量相似度搜尋

在 Pinecone 中使用餘弦相似度搜尋最相似的職位向量(Top K)

results = pinecone.query( vector=embedding, top_k=10, filter={"type": "job"} )
4
多維度評分計算

結合向量相似度與其他維度進行加權計算

總分 = 技能匹配(40%) + 經驗匹配(30%) + 薪資匹配(20%) + 地點匹配(10%) 技能分 = 向量相似度 × 0.4 × 100 經驗分 = experienceScore() × 0.3 × 100 薪資分 = salaryOverlap() × 0.2 × 100 地點分 = locationMatch() × 0.1 × 100
5
AI 推理生成

使用 GPT-4 分析媒合結果,生成專業的推理建議

response = openai.chat.completions.create( model="gpt-4", messages=[{ "role": "system", "content": "你是專業的人才媒合顧問..." }, { "role": "user", "content": `分析以下媒合情況... 人才技能: ${talent.skills} 職位需求: ${job.requirements} 匹配分數: ${score}` }] )
6
儲存與返回結果

將媒合結果儲存到 matches 表,返回排序後的 Top N 結果

4 資料庫設計

talents (人才表)
id (UUID, PK) name (VARCHAR) email (VARCHAR, UNIQUE) skills_description (TEXT) experience_years (INTEGER) expected_salary_min (INTEGER) expected_salary_max (INTEGER) location (VARCHAR) available (BOOLEAN) created_at (TIMESTAMP) updated_at (TIMESTAMP)
索引: email, location, available
jobs (職位表)
id (UUID, PK) title (VARCHAR) company (VARCHAR) description (TEXT) required_skills (TEXT) required_experience_years (INTEGER) salary_min (INTEGER) salary_max (INTEGER) location (VARCHAR) is_active (BOOLEAN) created_at (TIMESTAMP) updated_at (TIMESTAMP)
索引: company, location, is_active
matches (媒合表)
id (UUID, PK) talent_id (UUID, FK → talents) job_id (UUID, FK → jobs) match_score (DECIMAL) skill_match_score (DECIMAL) experience_match_score (DECIMAL) salary_match_score (DECIMAL) location_match_score (DECIMAL) vector_similarity (DECIMAL) ai_reasoning (TEXT) created_at (TIMESTAMP)
約束: UNIQUE(talent_id, job_id)
embeddings_cache (快取表)
id (UUID, PK) content_type (VARCHAR) content_id (UUID) content_hash (VARCHAR) embedding_vector (TEXT) pinecone_id (VARCHAR) created_at (TIMESTAMP)
約束: UNIQUE(content_type, content_id)
用途: 避免重複生成 embeddings,降低成本

5 RESTful API 端點 (15 個)

人才相關 API (6 個)
GET /api/talents 獲取所有人才
GET /api/talents/:id 獲取單一人才
POST /api/talents 新增人才
PUT /api/talents/:id 更新人才
DELETE /api/talents/:id 刪除人才
POST /api/talents/:id/matches AI 媒合 (核心功能)
GET /api/talents/:id/matches 獲取媒合記錄
職位相關 API (5 個)
GET /api/jobs 獲取所有職位
GET /api/jobs/:id 獲取單一職位
POST /api/jobs 新增職位
PUT /api/jobs/:id 更新職位
DELETE /api/jobs/:id 刪除職位
系統相關 API (4 個)
GET /api/system/health 健康檢查
GET /api/system/stats 系統統計
POST /api/system/index-all 索引所有資料
DELETE /api/system/cache 清除快取

6 多維度匹配演算法

加權評分公式

總分 = 技能匹配分數 × 40% + 經驗匹配分數 × 30% + 薪資匹配分數 × 20% + 地點匹配分數 × 10% 範圍: 0 - 100 分
技能匹配 (40%)

使用向量相似度計算技能匹配程度

技能分 = 餘弦相似度 × 0.4 × 100 相似度計算: cos(θ) = (A · B) / (||A|| × ||B||) A: 人才技能向量 (1536維) B: 職位需求向量 (1536維)
經驗匹配 (30%)

非線性評分,考慮過度資格

差距 = 人才經驗 - 職位要求 if 差距 >= 0: 分數 = 1.0 // 符合或超出 elif 差距 >= -2: 分數 = 0.7 // 略低但可接受 elif 差距 >= -4: 分數 = 0.4 // 明顯不足 else: 分數 = 0.1 // 嚴重不足 經驗分 = 分數 × 0.3 × 100
薪資匹配 (20%)

計算薪資範圍重疊程度

重疊區間 = max(0, min(職位最高, 期望最高) - max(職位最低, 期望最低) ) 總範圍 = max(職位最高, 期望最高) - min(職位最低, 期望最低) 重疊率 = 重疊區間 / 總範圍 薪資分 = 重疊率 × 0.2 × 100
地點匹配 (10%)

布林匹配或模糊匹配

if 人才地點 == "不限地點": 分數 = 1.0 elif 人才地點 == "遠端工作": 分數 = 1.0 elif 人才地點 == 職位地點: 分數 = 1.0 elif 同一縣市(人才, 職位): 分數 = 0.7 else: 分數 = 0.3 地點分 = 分數 × 0.1 × 100

7 性能優化策略

Embedding 快取
  • ✓ 使用 content hash 判斷是否重新生成
  • ✓ 避免重複呼叫 OpenAI API
  • ✓ 降低成本達 95% 以上
  • ✓ 加快響應速度 (從 2秒 到 0.1秒)
並行處理
  • ✓ Promise.all 並行生成 AI 推理
  • ✓ 批次處理 embeddings
  • ✓ 減少總處理時間 50%+
  • ✓ 更好的用戶體驗
資料庫優化
  • ✓ 適當的索引設計
  • ✓ UNIQUE 約束避免重複
  • ✓ 外鍵關聯保證一致性
  • ✓ 查詢效能優化
向量搜尋優化
  • ✓ Pinecone Serverless 自動擴展
  • ✓ 元資料過濾減少搜尋範圍
  • ✓ Top-K 參數調優
  • ✓ 毫秒級響應時間

8 安全性措施

HTTPS/SSL

Let's Encrypt 免費 SSL 證書,全站加密傳輸

CORS 配置

適當的跨域資源共享設定,允許前端訪問

環境變數

敏感資訊 (API Keys) 儲存在 .env,不提交版控

錯誤處理

完善的 try-catch,不洩漏內部資訊

資料驗證

使用 Zod 進行輸入驗證,防止注入攻擊

安全 Headers

X-Frame-Options, X-Content-Type-Options 等

技術能力總結

Full Stack 開發
AI/ML 整合
向量搜尋
演算法設計
資料庫設計
API 開發
雲端部署
系統架構

完整的產品級系統實作經驗