6 คะแนน โดย sungmin330 2025-05-08 | 4 ความคิดเห็น | แชร์ทาง WhatsApp

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 แบบไดนามิกผ่านการสนทนากับผู้ใช้ และใช้ข้อมูลนั้นเพื่อสร้างคำตอบที่เกี่ยวข้องมากยิ่งขึ้น

วิธีการทำงานหลัก:

  1. การสร้าง knowledge graph:
    • จากบทสนทนากับผู้ใช้ ("ฉันชอบแฮมเบอร์เกอร์") ระบบจะใช้ LLM เพื่อดึงความสัมพันธ์ ((ผู้ใช้) --ชอบ--> (แฮมเบอร์เกอร์)) ออกมา
    • ข้อมูลที่ดึงได้จะถูกเก็บเป็นโหนดและเอดจ์ในกราฟ DB ของ Neo4j โดยในขั้นตอนนี้จะเก็บความสัมพันธ์ของแนวคิดระดับบนไว้ด้วย เช่น (แฮมเบอร์เกอร์) --รวมอยู่ใน--> (อาหาร) เพื่อให้อนุมานและค้นหาได้ยืดหยุ่นขึ้น ("ฉันชอบอาหารอะไรบ้าง?") (ใน lucia ใช้วิธีที่มีประสิทธิภาพกว่านี้เล็กน้อย)
  2. การสร้างคำตอบด้วย 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 ความคิดเห็น

 
sungmin330 2025-05-11

เนื่องจากเป็น LLM เลยไม่ได้ทำงานได้ตลอดเวลาเสมอไป (T_T)... ฝากลองใช้งานกันได้ตามสบายเยอะ ๆ นะครับ
เผื่อว่าจะมีคนสงสัย เลยขอเขียนสาเหตุของปัญหาด้านประสิทธิภาพที่เกิดขึ้นมาจนถึงตอนนี้ไว้ครับ

  • เขียนพรอมป์ต์ให้ดึง kw ออกมาเป็นภาษาอังกฤษ แต่บางครั้งกลับดึงออกมาเป็นภาษาไทย ทำให้เกิดข้อจำกัดในการค้นหา
  • มีบางกรณีที่ไม่สามารถดึงคีย์เวิร์ดที่เหมาะสมออกมาได้
  • หลังจากนำ kw ไปทำ embedding แล้ววัดความคล้ายคลึงเพื่อทำ semantic search แต่ประสิทธิภาพยังไม่ชัดเจน

ps) ประสิทธิภาพของ delos-lucia ดีกว่า PoC เว็บครับ ถ้าลองรัน delos-lucia แบบ shell-based น่าจะได้ผลลัพธ์ที่ดีกว่าอีกหน่อยครับ

ps) พอลองสร้างบริการขึ้นมาเองจริง ๆ แล้ว ก็รู้สึกว่าทั้ง QA และการนำ eval เข้ามาใช้นั้นยากเหมือนกันนะครับ ถึงจะรู้สึกว่าถ้าประสิทธิภาพของ LLM ดีขึ้นก็น่าจะแก้ได้ไม่ทางใดก็ทางหนึ่ง แต่ก็ได้ตระหนักว่ามีนอกเหนือจากตัวโมเดลแล้ว ยังต้องใช้แรงและเวลาในส่วนอื่นมากกว่าที่คิดครับ

 
1206good 2025-05-08

ช่วงนี้เพิ่งเห็นโปรเจกต์ที่คล้ายกันอยู่เหมือนกัน น่าสนใจดีนะครับ
เดี๋ยวจะลองดูสักครั้งครับ

website : https://www.secondme.io/
Github repo : https://github.com/mindverse/Second-Me

 
sungmin330 2025-05-11

โอ้ เป็นโปรเจกต์ที่น่าสนใจมากเลย!! ขอบคุณครับ

 
rlaehdus2003 2025-05-08

AI ที่อาจรู้จักตัวฉันดียิ่งกว่าตัวฉันเอง..?