1 · What this system is
The Location Copilot is a location-intelligence assistant for Thailand. Its flagship use case is EV charging-station site selection; the same engine answers site questions for other business types. Every answer is produced from two live data APIs plus one AI model, all called at question time:
1 · ระบบนี้คืออะไร
Location Copilot คือผู้ช่วยวิเคราะห์ทำเลสำหรับประเทศไทย — use case หลักคือการเลือกทำเลสถานีชาร์จ EV และเครื่องยนต์เดียวกันตอบคำถามทำเลของธุรกิจอื่นได้ด้วย ทุกคำตอบสร้างจาก API ข้อมูลสด 2 ชุด บวกโมเดล AI หนึ่งตัว ซึ่งถูกเรียก ณ เวลาที่ถามเสมอ:
2 · How we prevent AI hallucination
The model is not allowed to answer from its own memory. Controls are enforced in code, not only in prompts:
- Tool-grounded numbers. Every number, coordinate and place name must come from an API call made in the same turn. Ranking, scoring and distances are computed by our deterministic code — the model reports them, it does not invent them.
- The “Behind this answer” panel. Every answer ships with the full list of API calls that produced it (system, endpoint, result). Users can audit any answer themselves, on screen.
- “Not measured” is never rendered as zero. Supply data is always in one of three states — measured (real distances from a live search), empty (searched, none found), or unknown (not measured — the score falls back to demand-only and no distance is ever claimed).
- Mandatory geocoding. The model is forbidden from recalling coordinates; addresses and place names must go through HERE Geocoding, and unresolvable places are reported as not found — never guessed.
- Server-side output scrubbing. Responses are filtered server-side before display (internal identifiers are stripped) — a code-level guard, independent of the model's behaviour.
- Scope refusal. General-knowledge questions (news, history, coding…) are declined. If it cannot be traced to an API call, the system does not answer it.
2 · เรากัน hallucination ของ AI อย่างไร
โมเดลไม่ได้รับอนุญาตให้ตอบจากความจำของตัวเอง — มาตรการบังคับในโค้ด ไม่ใช่แค่ในพรอมป์ต:
- ตัวเลขต้องมาจากเครื่องมือ — ตัวเลข พิกัด และชื่อสถานที่ทุกตัวต้องมาจาก API call ในเทิร์นนั้น การจัดอันดับ คะแนน และระยะทางคำนวณโดยโค้ด deterministic ของเรา — โมเดลมีหน้าที่รายงาน ไม่ใช่แต่งเอง
- แผง «เบื้องหลังคำตอบนี้» — ทุกคำตอบแนบรายการ API call ที่ใช้ (ระบบ endpoint ผลลัพธ์) ผู้ใช้ตรวจสอบเองได้ทุกคำตอบบนหน้าจอ
- "ยังไม่ได้วัด" ไม่มีวันถูกแสดงเป็นศูนย์ — ข้อมูล supply มี 3 สถานะเสมอ: วัดแล้ว (ระยะจริงจากการค้นสด) · ค้นแล้วไม่พบ (ผลค้นจริง) · ยังไม่ได้วัด (คะแนนถอยเป็นดีมานด์ล้วน และจะไม่อ้างระยะทางใด ๆ)
- บังคับ geocode — ห้ามโมเดลนึกพิกัดจากความจำ ที่อยู่/ชื่อสถานที่ต้องผ่าน HERE Geocoding หาไม่เจอ = บอกตรง ๆ ว่าไม่เจอ ไม่เดาต่อ
- ยามกรองคำตอบฝั่ง server — คำตอบถูกกรองก่อนแสดงผล (ตัดรหัสภายในทิ้ง) เป็นยามระดับโค้ด ไม่พึ่งพฤติกรรมโมเดล
- ปฏิเสธนอกขอบเขต — คำถามความรู้ทั่วไป (ข่าว ประวัติศาสตร์ โค้ด ฯลฯ) ถูกปฏิเสธ อะไรที่สืบกลับ API call ไม่ได้ ระบบไม่ตอบ
3 · No internet access at answer time
When answering, the system can reach exactly two data sources: the HERE API and the DataProteins API. The model has no web-browsing or search capability in this application. Nothing is pulled from the open internet, so answers cannot be contaminated by unverified web content.
3 · ไม่มีการค้น internet ตอนตอบ
ขณะตอบ ระบบเข้าถึงแหล่งข้อมูลได้เพียง 2 ชุด: HERE API และ DataProteins API — โมเดลไม่มีความสามารถท่องเว็บ/ค้นเว็บในแอปพลิเคชันนี้ จึงไม่มีทางที่คำตอบจะปนเปื้อน เนื้อหาจากอินเทอร์เน็ตที่ตรวจสอบไม่ได้
4 · Is customer data used to train the AI?
No — not by default, per Anthropic's published policy. This system calls the Claude model through the commercial Anthropic API. Anthropic's data policy states:
The stated exception is when a customer explicitly submits feedback/bug reports to Anthropic — this application has no such feedback channel, so no conversation is ever shared for training through it. If a user pastes business data (e.g. real sales figures) into the chat, it is used in-context only to answer that conversation: it is not written into DataProteins' analytical database and not used to train any model.
4 · ข้อมูลลูกค้าถูกนำไปเทรน AI หรือไม่
ไม่ — โดยค่าเริ่มต้น ตามนโยบายที่ Anthropic ประกาศเป็นลายลักษณ์อักษร ระบบนี้เรียกโมเดล Claude ผ่าน Anthropic API เชิงพาณิชย์ ซึ่งนโยบายของ Anthropic ระบุว่า:
ข้อยกเว้นเดียวที่นโยบายระบุคือกรณีลูกค้ากดส่ง feedback/รายงานบั๊กให้ Anthropic เอง — แอปนี้ไม่มีช่องทาง feedback แบบนั้น จึงไม่มีบทสนทนาใดถูกส่งไปเทรนผ่านช่องทางนี้ ถ้าผู้ใช้วางข้อมูลธุรกิจ (เช่น ยอดขายจริง) ลงในแชต ข้อมูลนั้นถูกใช้เฉพาะในบริบทของบทสนทนานั้น เพื่อตอบคำถาม — ไม่ถูกบันทึกเข้าฐานข้อมูลวิเคราะห์ของ DataProteins และไม่ถูกใช้เทรนโมเดลใด ๆ
5 · What we store, and for how long
| Data | Where | Purpose |
|---|---|---|
| User accounts (username, salted PBKDF2-SHA256 password hash, role) | App database (SQLite, server-side) | Authentication; admin-managed, no self-signup |
| Usage audit log — timestamp, user, question text, tools used, duration, token counts, HERE-call count, client IP | App database | Security audit and usage accounting (a customer requirement) |
| API keys entered by the user (⚙ panel) | Browser localStorage only — attached per request, never persisted server-side, never logged | Bring-your-own-key testing |
| Map/POI results from HERE | Server RAM cache, 5-minute TTL — never written to disk (per HERE's terms: no offline bulk storage) | Latency + quota efficiency |
Accounts and audit entries can be deactivated/deleted by the administrator on request.
5 · เราเก็บอะไร นานแค่ไหน
| ข้อมูล | ที่เก็บ | วัตถุประสงค์ |
|---|---|---|
| บัญชีผู้ใช้ (username, รหัสผ่านแบบ salted PBKDF2-SHA256 hash, role) | ฐานข้อมูลของแอป (SQLite ฝั่ง server) | ยืนยันตัวตน — admin สร้างบัญชีให้ ไม่มี self-signup |
| บันทึกการใช้งาน — เวลา ผู้ใช้ ข้อความคำถาม เครื่องมือที่ใช้ ระยะเวลา จำนวนโทเคน จำนวน HERE call และ IP | ฐานข้อมูลของแอป | ตรวจสอบความปลอดภัย + บัญชีการใช้งาน (ข้อกำหนดของลูกค้า) |
| API key ที่ผู้ใช้ใส่เอง (แผง ⚙) | localStorage ของเบราว์เซอร์เท่านั้น — แนบไปต่อ request ไม่บันทึกฝั่ง server ไม่ลง log | ทดสอบด้วย key ของผู้ใช้เอง |
| ผลลัพธ์แผนที่/POI จาก HERE | cache ใน RAM ของ server อายุ 5 นาที — ไม่เขียนลงดิสก์ (ตามข้อกำหนดของ HERE: ห้ามเก็บ bulk แบบ offline) | ความเร็ว + ประหยัด quota |
บัญชีและรายการ log ปิดใช้งาน/ลบได้โดยผู้ดูแลระบบเมื่อร้องขอ
6 · Access control & application security
- Per-user accounts with roles (admin / user); accounts are created by the administrator only.
- Passwords hashed with PBKDF2-HMAC-SHA256 (200,000 iterations, per-user salt); never stored in plain text.
- Sessions via HttpOnly, SameSite cookies; only a SHA-256 hash of the session token is stored server-side; sessions are revoked on password change or account deactivation.
- Login rate limiting per source IP; failed attempts are logged.
- Server-held API keys (HERE / Anthropic / DataProteins) are never exposed to the browser — map tiles are proxied server-side specifically so the HERE key cannot leak.
- All traffic over HTTPS/TLS in production; per-user daily usage caps limit abuse and cost exposure.
6 · การควบคุมสิทธิ์และความปลอดภัยของแอป
- บัญชีรายบุคคลพร้อม role (admin / user) — ผู้ดูแลระบบเป็นผู้สร้างบัญชีเท่านั้น
- รหัสผ่าน hash ด้วย PBKDF2-HMAC-SHA256 (200,000 รอบ + salt ต่อคน) — ไม่เก็บ plain text
- session ใช้ cookie แบบ HttpOnly + SameSite · ฝั่ง server เก็บเฉพาะ SHA-256 ของ token · เปลี่ยนรหัส/ปิดบัญชี = session เดิมหลุดทันที
- จำกัดความถี่การ login ต่อ IP และบันทึกการพยายามที่ล้มเหลว
- API key ฝั่ง server (HERE / Anthropic / DataProteins) ไม่หลุดถึงเบราว์เซอร์ — แผนที่วิ่งผ่าน proxy ฝั่ง server โดยเฉพาะเพื่อไม่ให้ key ของ HERE รั่ว
- การรับส่งทั้งหมดผ่าน HTTPS/TLS บน production · มีเพดานการใช้งานรายวันต่อผู้ใช้
7 · Scope & known limitations (POC honesty)
- No SSO/SAML integration yet (available in an enterprise engagement).
- No third-party penetration test has been performed yet on this POC.
- The demand index is calibrated for the EV use case; other verticals are answered with the same urban-activity index, clearly labelled as such in the answers. Vertical-specific calibration is an engagement deliverable.
- Availability is best-effort for the testing period.
7 · ขอบเขตและข้อจำกัดที่ทราบ (ความตรงไปตรงมาแบบ POC)
- ยังไม่มี SSO/SAML (ทำได้ในงาน enterprise engagement)
- ยังไม่ผ่านการทดสอบเจาะระบบ (pen test) โดยบุคคลที่สาม
- ดัชนีดีมานด์ปรับเทียบมาสำหรับ use case EV — vertical อื่นตอบด้วยดัชนีกิจกรรมเมืองตัวเดียวกัน และคำตอบจะระบุข้อนี้ชัดเจน · การปรับเทียบเฉพาะ vertical เป็นงานส่งมอบใน engagement
- ความพร้อมใช้งานเป็นแบบ best-effort ในช่วงทดสอบ
8 · Contact
Security questions and disclosure: dataproteins@gmail.com. We answer security review questionnaires as part of any evaluation.
8 · ติดต่อ
คำถามด้านความปลอดภัย: dataproteins@gmail.com — เรายินดีตอบแบบสอบถาม security review ประกอบการประเมิน