Personal AI Agent, ถ้า LLM เริ่มรู้จักตัวฉันล่ะ?
(delosplatform.com)TL;DR
LLM Chat Agent แบบปรับให้เหมาะกับแต่ละบุคคล เก็บข้อมูลผู้ใช้แบบไดนามิกเพื่อให้คำตอบที่ปรับเฉพาะบุคคลได้ในภายหลัง
Q) ฉันชอบมันฝรั่ง
A) โอเค
Q) ฉันชอบอะไร?
A) คุณชอบมันฝรั่ง~
ลิงก์เดโม: https://delosplatform.com
GitHub: https://github.com/sungminna/mcp_poc
ps) delos-lucia เป็นเวอร์ชันที่แพ็กเกจและปรับปรุงฟังก์ชันของบริการ velt โดย delos-lucia รองรับ response time ที่สั้นลง, LLM streaming และลอจิก asynchronous ที่ปรับปรุงแล้ว
สมัครสมาชิก (ล็อกอิน) แล้วใช้งานได้ทันที รบกวนช่วยทดลองและส่งฟีดแบ็กกันเข้ามาเยอะ ๆ นะครับ...
Lucia & Velt: Agent แชต LLM แบบปรับให้เหมาะกับแต่ละบุคคล
ช่วงหลังมานี้มีความพยายามเพิ่มขึ้นในการใช้ LLM เพื่อจัดโครงสร้างข้อมูลที่ได้จากการโต้ตอบกับผู้ใช้ แล้วนำข้อมูลนั้นกลับมาใช้ในคำตอบของ LLM เพื่อมอบประสบการณ์แบบเฉพาะบุคคล Lucia และ Velt คือโปรเจกต์โอเพนซอร์สที่มุ่งไปสู่เป้าหมายนี้ Lucia เป็นไลบรารี Python ที่โมดูลาร์ฟังก์ชัน AI หลักสำหรับการทำ Personalized LLM ส่วน Velt เป็นระบบแชต Personalized RAG ที่สร้างขึ้นโดยอาศัยแนวคิดของ Lucia
Lucia: โมดูล Personalized LLM
delos-lucia คือไลบรารี Python ที่นำฟังก์ชัน AI หลักซึ่งเดิมพัฒนาขึ้นสำหรับบริการ Velt มาจัดโครงสร้างใหม่และแพ็กเกจให้พร้อมใช้งาน ด้วยความที่ออกแบบแบบโมดูลาร์ จึงสามารถเลือกใช้เฉพาะความสามารถที่ต้องการหรือปรับแต่งได้ง่าย
ความสามารถหลัก:
- การดึงข้อมูลส่วนบุคคลและคีย์เวิร์ด: ใช้ LLM (เช่นโมเดล OpenAI) เพื่อระบุและดึงข้อมูลส่วนบุคคลของผู้ใช้ เช่น ความชอบ สถานะ และคีย์เวิร์ดสำคัญจากข้อความ
- การสร้าง Embedding: ใช้โมเดล Embedding ของ OpenAI เพื่อสร้างเวกเตอร์แทนข้อความ (embedding) โดย embedding ที่สร้างขึ้นสามารถแคชผ่าน Redis เพื่อลดต้นทุนจากการเรียก API ซ้ำ ๆ
- การจัดเก็บข้อมูล: ข้อมูลเชิงโครงสร้างที่ดึงออกมา (ข้อมูลส่วนบุคคล ความสัมพันธ์ ฯลฯ) จะถูกเก็บในกราฟดาต้าเบส (Neo4j หรือ Clickhouse) และเวกเตอร์ embedding ที่สร้างขึ้นจะถูกเก็บในเวกเตอร์สโตร์ (Milvus) เพื่อรองรับการค้นหาอย่างมีประสิทธิภาพ
- การมี Pipeline พร้อมใช้: มี pipeline ที่สร้างไว้ล่วงหน้าสำหรับงานทั่วไป เช่น
KnowledgePipeline(เวิร์กโฟลว์ตั้งแต่ดึงข้อมูล สร้าง embedding จนถึงการจัดเก็บ) และSearchPipeline(เวิร์กโฟลว์การค้นหาข้อมูลตามคีย์เวิร์ดและการเสริม context) เพื่อช่วยให้พัฒนาง่ายขึ้น - การปรับแต่ง: มีสถาปัตยกรรมแบบปลั๊กอินที่เปิดให้ผู้ใช้เปลี่ยนคอมโพเนนต์อย่างตัวดึงข้อมูล/คีย์เวิร์ด (Extractor), ไคลเอนต์ Embedding (EmbeddingClient), ที่เก็บข้อมูล (InfoStore) และเวกเตอร์สโตร์ (VectorStore) เป็นคอมโพเนนต์ที่พัฒนาเองได้
Lucia ช่วย abstract ลอจิกแบ็กเอนด์หลักที่จำเป็นต่อการสร้างแอปพลิเคชัน AI แบบเฉพาะบุคคล ได้แก่ การดึงข้อมูล การแปลงเป็นเวกเตอร์ การจัดเก็บ และการค้นหา ทำให้นักพัฒนาสามารถโฟกัสกับลอจิกของแอปพลิเคชันได้มากขึ้น (ไลเซนส์: Apache-2.0)
GitHub Repository: https://github.com/sungminna/mcp_poc/tree/main/lucia
Velt: PoC แชตบอต Personalized RAG ที่ใช้คอมโพเนนต์/แนวคิดของ Lucia
Velt คือแอปพลิเคชันแบ็กเอนด์บน FastAPI ที่สร้างขึ้นโดยใช้แนวคิดที่ไลบรารี Lucia มอบให้ โดยมีเป้าหมายเพื่อมอบประสบการณ์แชตบอต RAG (Retrieval-Augmented Generation) แบบเฉพาะบุคคลแก่ผู้ใช้ ผ่านการผสาน ReAct agent (LangGraph), Neo4j knowledge graph, Milvus vector store, PostgreSQL และ Redis เข้าด้วยกัน ระบบจะสร้างข้อมูล personalized ลงใน knowledge graph แบบไดนามิกผ่านการสนทนากับผู้ใช้ และใช้ข้อมูลนั้นเพื่อสร้างคำตอบที่เกี่ยวข้องมากยิ่งขึ้น
วิธีการทำงานหลัก:
- การสร้าง knowledge graph:
- จากบทสนทนากับผู้ใช้ ("ฉันชอบแฮมเบอร์เกอร์") ระบบจะใช้ LLM เพื่อดึงความสัมพันธ์ (
(ผู้ใช้) --ชอบ--> (แฮมเบอร์เกอร์)) ออกมา - ข้อมูลที่ดึงได้จะถูกเก็บเป็นโหนดและเอดจ์ในกราฟ DB ของ Neo4j โดยในขั้นตอนนี้จะเก็บความสัมพันธ์ของแนวคิดระดับบนไว้ด้วย เช่น
(แฮมเบอร์เกอร์) --รวมอยู่ใน--> (อาหาร)เพื่อให้อนุมานและค้นหาได้ยืดหยุ่นขึ้น ("ฉันชอบอาหารอะไรบ้าง?") (ใน lucia ใช้วิธีที่มีประสิทธิภาพกว่านี้เล็กน้อย)
- จากบทสนทนากับผู้ใช้ ("ฉันชอบแฮมเบอร์เกอร์") ระบบจะใช้ LLM เพื่อดึงความสัมพันธ์ (
- การสร้างคำตอบด้วย RAG:
- จากคำถามของผู้ใช้ ("ฉันชอบศิลปะไหม?") ระบบจะใช้ LLM เพื่อดึงคีย์เวิร์ด ("ศิลปะ", "ชอบ")
- ใช้คีย์เวิร์ดที่ดึงได้ค้นหาข้อมูลที่เกี่ยวข้องสูงจาก Milvus ด้วยการค้นหาเวกเตอร์
- พร้อมกันนั้นยังสำรวจโหนดและความสัมพันธ์ที่เชื่อมโยงกับผู้ใช้และคีย์เวิร์ดดังกล่าวใน Neo4j ด้วย (ทั้งความสัมพันธ์โดยตรง ความสัมพันธ์แบบ 1-2 hop และแนวคิดย่อย)
- ข้อมูลที่ค้นได้จาก Milvus และ Neo4j จะถูกนำมารวมเป็น context เพื่อเสริม prompt ของ ReAct agent ที่อิง LangGraph (+ ประวัติการสนทนาในเซสชัน)
- จากนั้น agent จะสร้างคำตอบแบบเฉพาะบุคคลให้กับคำถามของผู้ใช้โดยอิงจาก context ที่ถูกเสริมนี้
เทคสแต็ก:
- แบ็กเอนด์: FastAPI, Uvicorn, Python 3.13+
- AI/LLM: LangChain, LangGraph, langchain-openai, OpenAI Embeddings
- ฐานข้อมูล: Neo4j (Graph), Milvus (Vector), PostgreSQL (User/Chat Data), Redis (Cache)
- อื่น ๆ: SQLAlchemy (Async), JWT (Auth), slowapi (Rate Limiting), Poetry, Docker
- ฟรอนต์เอนด์: SvelteKit (ไดเรกทอรี
velt/แยกต่างหาก)
ผลลัพธ์หลักและข้อพิจารณา:
- ยืนยันความเป็นไปได้: ยืนยันความเป็นไปได้ในการสร้างบริการ LLM แบบ hyper-personalized โดยผสาน LLM เข้ากับกราฟ/เวกเตอร์ DB เพื่อสร้าง knowledge graph แบบเฉพาะบุคคลอย่างไดนามิกและนำไปใช้งาน
- ประสิทธิภาพ: ขณะนี้พบคอขวดในส่วนการเข้าถึงฐานข้อมูล (query) จึงจำเป็นต้องปรับแต่งเพิ่มเติม อีกทั้งยังต้องตรวจสอบประสิทธิภาพของ Neo4j ในสภาพแวดล้อมเรียลไทม์ขนาดใหญ่ด้วย (แก้ไปบางส่วนใน lucia)
- คุณภาพคำตอบ: แม้ LLM จะตอบโดยอิงจากข้อมูลที่ค้นพบ (context) แต่ยังต้องมีการตรวจสอบและปรับปรุงเพิ่มเติมว่าให้คำตอบที่เกี่ยวข้องสูง (relevant) และเป็นธรรมชาติได้สม่ำเสมอหรือไม่ โดยเฉพาะเมื่อใช้ RAG ยังมีแนวโน้มที่จะพึ่งพา context มากเกินไปจนได้คำตอบที่ไม่เป็นธรรมชาติ ซึ่งต้องแก้ไข
- Prompt Engineering: บางครั้ง LLM ไม่ทำตาม instruction จึงจำเป็นต้องปรับปรุง prompt และตรวจสอบประเด็นด้านประสิทธิภาพของโมเดล
- ความสามารถในการขยาย: สามารถเพิ่มความยืดหยุ่นได้ด้วยการแทนที่ query DB ที่ฮาร์ดโค้ดไว้ในปัจจุบันด้วย Text-to-Cypher/SQL เป็นต้น และหากไม่มีการวิเคราะห์ความสัมพันธ์ระหว่างผู้ใช้ ก็อาจพิจารณาความเป็นไปได้ของการสร้างบน RDB ได้เช่นกัน (ใน lucia ปรับปรุงให้ใช้ Clickhouse ได้)
GitHub Repository: https://github.com/sungminna/mcp_poc
Demo Service: https://delosplatform.com
Directory: https://my.surfit.io/w/528136765
สรุป:
Lucia คือไลบรารี Python แบบโมดูลาร์สำหรับการดึงข้อมูลส่วนบุคคล/คีย์เวิร์ดด้วย LLM, การทำ embedding และการจัดเก็บลงกราฟ/เวกเตอร์ DB ส่วน Velt คือ PoC บน FastAPI ที่ใช้แนวคิดของ Lucia ในการสร้าง knowledge graph แบบไดนามิก (Neo4j) จากบทสนทนากับผู้ใช้ แล้วผสานการค้นหาเวกเตอร์ (Milvus) กับ RAG (LangGraph ReAct agent) เพื่อมอบคำตอบแชตบอตแบบเฉพาะบุคคล ทั้งสองโปรเจกต์แสดงให้เห็นถึงศักยภาพของการสร้าง AI แบบ personalized แต่ก็ยังมีโจทย์เรื่องการปรับประสิทธิภาพและการทำให้คำตอบเป็นธรรมชาติมากขึ้นที่ต้องแก้ต่อไป
4 ความคิดเห็น
เนื่องจากเป็น LLM เลยไม่ได้ทำงานได้ตลอดเวลาเสมอไป (T_T)... ฝากลองใช้งานกันได้ตามสบายเยอะ ๆ นะครับ
เผื่อว่าจะมีคนสงสัย เลยขอเขียนสาเหตุของปัญหาด้านประสิทธิภาพที่เกิดขึ้นมาจนถึงตอนนี้ไว้ครับ
kwออกมาเป็นภาษาอังกฤษ แต่บางครั้งกลับดึงออกมาเป็นภาษาไทย ทำให้เกิดข้อจำกัดในการค้นหาkwไปทำ embedding แล้ววัดความคล้ายคลึงเพื่อทำ semantic search แต่ประสิทธิภาพยังไม่ชัดเจนps) ประสิทธิภาพของ delos-lucia ดีกว่า PoC เว็บครับ ถ้าลองรัน delos-lucia แบบ shell-based น่าจะได้ผลลัพธ์ที่ดีกว่าอีกหน่อยครับ
ps) พอลองสร้างบริการขึ้นมาเองจริง ๆ แล้ว ก็รู้สึกว่าทั้ง QA และการนำ eval เข้ามาใช้นั้นยากเหมือนกันนะครับ ถึงจะรู้สึกว่าถ้าประสิทธิภาพของ LLM ดีขึ้นก็น่าจะแก้ได้ไม่ทางใดก็ทางหนึ่ง แต่ก็ได้ตระหนักว่ามีนอกเหนือจากตัวโมเดลแล้ว ยังต้องใช้แรงและเวลาในส่วนอื่นมากกว่าที่คิดครับ
ช่วงนี้เพิ่งเห็นโปรเจกต์ที่คล้ายกันอยู่เหมือนกัน น่าสนใจดีนะครับ
เดี๋ยวจะลองดูสักครั้งครับ
website : https://www.secondme.io/
Github repo : https://github.com/mindverse/Second-Me
โอ้ เป็นโปรเจกต์ที่น่าสนใจมากเลย!! ขอบคุณครับ
AI ที่อาจรู้จักตัวฉันดียิ่งกว่าตัวฉันเอง..?