Make smarter dining decisions by cutting through Dianping's noise. Detect fake reviews, extract genuine sentiment signals, and get personalized restaurant recommendations with dish-level ordering guides.
Input: User provides:
Output: Structured dining profile. Logic: Fill missing fields with sensible defaults (budget = ¥50-150, radius = 3km). Ask clarifying questions for ambiguous inputs.
Input: Dining profile. Action: Search Dianping for restaurants matching criteria. Filters:
Output: Candidate list (typically 10–30 restaurants). Logic: Deduplicate chain locations unless user prefers them. Track "hidden gems" (high real-review score despite moderate overall rating).
Input: Candidate restaurant list. Action: Scrape recent reviews (sample ≥30 per restaurant, prioritized by recency). Data extracted per review:
Output: Raw review corpus per restaurant. Logic: Respect Dianping rate limits. Cache for 1 hour.
Input: Review corpus per restaurant. Detection signals (multi-dimensional scoring):
SignalRed Flag PatternWeightTime cluster≥5 reviews within 30 minHighReviewer ageAccount <7 days oldHighReview frequency>10 reviews/day across restaurantsMediumText similarityHigh cosine similarity with other reviewsHighPhoto EXIFIdentical camera/settings across "different" usersMediumGeneric language"环境不错""味道很好" without specificsLowRating patternAll 5-star, no detailLowReviewer historyOnly 5-star reviews, never criticalMedium
Output: Each review tagged: genuine | suspicious | likely_fake. Restaurant scored with authenticity index (0–100).
Logic: Ensemble scoring with weighted signals. Flag entire restaurant as "suspicious" if >40% reviews are likely_fake. This is the key differentiator from any existing tool.
Input: Filtered genuine reviews. Action: LLM-based sentiment extraction across 4 dimensions:
Output: Structured sentiment summary per restaurant.
text
=== 老王川菜 (Rating: 4.3, Authenticity: 92%) ===
👍 Taste: Mapo Tofu (must-order, 38 mentions), 回锅肉 (authentic, 25 mentions)
👎 Taste: 水煮鱼 (bland, 7 complaints)
👍 Environment: Cozy but cramped (expect wait at peak)
👎 Service: Slow during dinner rush (12 mentions)
💰 Value: ¥65/person, "great value" (22 mentions vs 3 "overpriced")
Input: Sentiment summaries + user dining profile. Scoring formula:
text
Score = w1 × cuisine_match + w2 × sentiment_score + w3 × value_score + w4 × occasion_fit + w5 × authenticity_bonus
Output: Ranked top 5–10 restaurants with:
Input: Top-ranked restaurant + dish sentiment data. Output: Ready-to-use ordering card:
text
=== 老王川菜 · 2人点菜指南 ===
预算: ¥120-150
必点 (Must Order):
☑ 麻婆豆腐 ¥28 — 38人推荐,招牌菜
☑ 回锅肉 ¥42 — 25人推荐,正宗
可点 (Recommended):
○ 蒜泥白肉 ¥32 — 18人推荐
避雷 (Skip):
✕ 水煮鱼 ¥88 — 7人评价"不入味",性价比低
💡 人均参考: ¥60-75
🕐 建议时间: 11:30前或13:30后避开高峰
Logic: Adjust portion recommendations based on party size. For group dinners, suggest "大份" or double-ordering popular dishes.
Input: Multiple restaurants worth visiting + starting location. Output: Geographically optimized route:
text
🍽️ 静安寺美食探店路线 (步行可达):
1. 老王川菜 (午餐, 11:30) → 步行3分钟
2. 弄堂小馄饨 (下午茶, 14:00) → 步行5分钟
3. 福1088 (晚餐, 18:00)
Logic: Group restaurants by proximity clusters. Factor in operating hours (some close between lunch and dinner).
User: "上海静安寺附近,想吃川菜,人均100左右,约会,推荐3家靠谱的" Expected Output: 3 ranked restaurants with authenticity scores, must-order dishes, date-suitability notes.
User: "这家网红店评分4.8但我觉得不好吃,帮我看看评价是不是刷的 —— [Dianping URL]" Expected Output: Fake review detection report: what % of reviews look fake, specific suspicious patterns found, genuine review sentiment summary.
User: "今晚去吃XX火锅,帮我看看哪些菜必点,哪些是雷" Expected Output: Detailed ordering guide with specific dish recommendations sourced from genuine reviews.
User: "XX餐厅评分3.8,有人狂推有人狂骂,到底是什么情况?" Expected Output: Analysis of both camps: "5-star reviewers love the authentic taste and value; 1-star reviewers complain about slow service and cramped space. Verdict: go for the food, not the ambiance."
User: "下周去成都出差3天,住春熙路附近,帮我规划一个探店路线,要正宗川菜和小吃" Expected Output: 3-day exploration route: lunch + dinner + snack recommendations, geographically clustered, with ordering guides.
User: "8个人聚餐,北京国贸附近,预算人均150-200,要有包间,适合聊天的" Expected Output: 5 restaurant options with private room availability notes, group-friendly dish combos, per-person budget breakdown.
Scenario: User planning a third date, wants to impress without being too formal. Input: "上海法租界附近,人均200-300,约会,氛围好但不要太正式,最好是西餐或日料" Steps:
Scenario: First time in Chengdu, wants authentic local food, not tourist traps. Input: "刚到成都,住宽窄巷子附近,想吃地道川菜和小吃,避开网红店,人均50-100" Steps:
Scenario: Hosting 6 clients, needs upscale private dining with guaranteed quality. Input: "北京朝阳区,商务宴请6人,人均400-600,要有包间,粤菜或淮扬菜,服务要专业" Steps:
ConditionBehavior<50 total reviews for a restaurantFlag as "insufficient data"; still show but with low-confidence warningAll reviews flagged as suspiciousMark restaurant "⚠️ High fake review risk"; still show genuine sentiment if anyUser location outside Dianping coverageInform; Dianping covers mainland China primarilyCuisine type has <3 candidatesExpand radius or suggest adjacent cuisinesBudget too low for area (<¥30/person)Suggest street food / food court alternativesRestaurant chain with >10 locationsDe-duplicate; show 2-3 closest locationsDianping blocks scrapingFall back to cached data; show staleness timestampParty size >12Suggest banquet/private dining only; filter out small-table venuesOccasion = "proposal" or "anniversary"Add extra weight to environment + service; flag "special occasion" friendly venues
Error CodeScenarioHandlingE-SCRAPE-BLOCKEDDianping anti-scraping triggersUse cached data, flag staleness, retry after cooldownE-INSUFFICIENT-REVIEWSRestaurant has <30 reviewsShow with "low confidence" badge; limit recommendationsE-LOCATION-UNKNOWNLocation string can't be resolvedAsk user for district or landmark clarificationE-NO-CANDIDATESZero restaurants match criteriaRelax filters iteratively: expand radius → budget → cuisineE-FAKE-OVERWHELM>60% reviews detected as fakeStrong warning; recommend skipping this restaurantE-PHOTO-PARSE-FAILCan't extract photo metadataDegrade gracefully; skip photo-based fake detection signals
FilePurposeSKILL.mdFull design document (this file)skill.jsonSkill metadata with script/schema referencesscripts/dianping-guide.pyMain Python CLI — implements all workflow stepsschemas/input.schema.jsonJSON Schema for dining profile and restaurant dataschemas/output.schema.jsonJSON Schema for all output types (authenticity/sentiment/ranking/ordering/route)references/signals.jsonFake review detection signal definitions, weights, and thresholds
bash
# Step 1: Define dining context
./scripts/dianping-guide.py profile --location "上海静安寺" --cuisine 川菜 --budget-max 100
# Step 2: Discover candidates (uses built-in sample data)
./scripts/dianping-guide.py discover --cuisine 川菜 --budget-max 100
# Step 3+4+5: Analyze a restaurant (fake detection + sentiment)
./scripts/dianping-guide.py analyze "老王川菜"
# Step 6: Personalized ranking
./scripts/dianping-guide.py rank --cuisine 川菜 --occasion date
# Step 7: Ordering guide
./scripts/dianping-guide.py order "老王川菜" --party-size 2
# Step 8: Exploration route
./scripts/dianping-guide.py route --start "静安寺"
0.25×cuisine_match + 0.20×value + 0.20×occasion + 0.30×authenticity_bonus.references/signals.json loaded at runtime for detection thresholdsAll analysis uses built-in sample restaurant data. For production use, replace SAMPLE_RESTAURANTS with scraped Dianping data (respecting rate limits and robots.txt).