Q&A Document backend
November 23, 2023

Q&A Document backend

ผมเชื่อนะว่าคนที่อยู่ในวงการ AI หรือแม้แต่คนอื่นๆ ก็คงรู้จักคำกว่า GenerativeAI กันแทบทุกคนแล้ว ไม่ว่าจะผ่านการเล่นตัว ChatGPT หรือ application ที่เอาไว้สร้างรูป profile ที่ออกมาให้ทุกคนได้เล่นกันในทุกวันนี้ วันนี้หากเราลองมองไปดูในส่วนของการนำ AI มาช่วยในการพูดคุย หรือหาคำตอบจากโลก internet มันก็เป็นตัวช่วยได้ดีทีเดียวแหละ ทั้งความสามารถในการค้นหา รวมถึงสรุปข้อมูลที่ได้นั้นออกมาให้เราในรูปแบบที่เราอ่านและเข้าใจมากที่สุด แต่ความสามารถของมันยังไม่ได้หมดแค่นั้น

ในปัจจุบันเราสามารถนำพวก AI ที่เป็น LLM มาช่วยในการอ่านและสรุปข้อมูลจาก เอกสารที่อยู่ในองค์กรของเราได้ด้วย โดยการใช้เทคนิคที่เรียกว่า RAG (retrieval augmented generation) อธิบายให้ง่ายที่สุด คือเทคนิคที่ช่วยให้เราเอาข้อมูลที่อยู่ในเอกสารมาประมวลผล และจัดเก็บลง database จากนั้นเราก็จะสามารถตั้งคำถามกับข้อมูลชุดนั้น โดยที่จะมีเจ้าตัว AI มาเป็นคนช่วยประมวลผล และตอบออกมาในรูปแบบที่เราจะเข้าใจมากที่สุด

ทั้งหมดนี้เราสามารถเขียน script เพื่อให้มันทำงานได้อย่างไม่ยาก แต่ว่าการที่เราจะเอาไปให้คนอื่นใช้ด้วยยังไงดีหล่ะ การสร้าง API จึงเป็นอะไรที่น่าจะเอามาช่วยในงานนี้ได้ดีที่สุด

ทั้งหมดนี้เรามีตัวอย่าง code ให้ download มาใช้งานได้ที่

GitHub - vultureprime/deploy-ai-model

Design API Backend

ในการสร้าง API ของเรานั้น เราจะเลือกใช้เป็น FastAPI ที่เป็น framework การทำ api ด้วยภาษา python ก็เนื่องด้วยว่า Library ทั้งหมดในการทำ RAG นั้นส่วนมากจะเป็น python เป็นหลักดังนั้นการใช้ FastAPI จึงเป็นอะไรที่ง่าย และเข้ากันได้ดีกับส่วนอื่นๆที่เหลือ

ในส่วนการทำงานหลักๆที่เราควรมีจะประกอบไปด้วย

  1. upload document และจัดเก็บข้อมูลลง database
  2. เรียกดูข้อมูลที่จัดเก็บไว้
  3. ถามคำถามจากข้อมูลเหล่านั้น
  4. การแยกชุดข้อมูลของคนที่ upload เข้ามา ให้ตรงกับคำถามที่ต้องการ

ทั้งหมดนี้เป็นตัวอย่างการทำงานเบื้องต้นที่ควรมีสำหรับการทำ API ของ RAG ในเบื้องต้น

และถ้าหากใครสนใจที่อยากได้ source ไปทดลองเล่นเรามีให้บริการที่นี่

GitHub - vultureprime/deploy-ai-model

และสำหรับการ deployments ก็ทำได้ไม่ยาก เดี๋ยวเรามามีสิธีการนำไปติดตั้งใน server โดยในที่นี้เราจะยกตัวอย่างกันด้วย AWS EC2 และจะใช้งานตัว AWS API Gateway ในการ deploy ตัว application ของเรา

Set up EC2 Server

สิ่งที่เราจะขาดไม่ได้ในงานนี้ก็คือ Python ให้เราทำการเช็คก่อนเลยว่า python เราใช้งานได้หรือไม่โดย

python3 --version

จะได้ค่าคืนกลับมาเป็น version ที่ใช้งานอยู่ และถ้าหากข้อมูลไม่มาตามนัดให้ทำการติดตั้งให้เรียบร้อยก่อน

ทำการติดตั้ง library เบื้องต้นที่จำเป็นต้องใช้งาน

pip install langchain
pip install chromadb
pip install fastapi
pip install "uvicorn[standard]"

เพียงเท่านี้เครื่อง EC2 ของเราก็พร้อมที่จะใช้งานในเบื้องต้นแล้วครับ ระหว่างการทำงานถ้ามี library ต้องใช้งานเพิ่มเติมก็สามารถติดตั้งเพิ่มได้เลยนะครับ

Develop FastAPI

การ initial FastAPi project นั้นง่ายมากๆ เริ่มต้นด้วยการสร้าง main.py และเขียน code ดังนี้ครับ

from fastapi import FastAPI, UploadFile, Form

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello World"} 

อันนี้จะเป็น code เริ่มต้นในการสร้าง API ที่จะ return ค่า {"message": "Hello World"}  คืนกลับมาให้เราในการเรียกที่ root path

และถ้าต้องการจะเพิ่ม method อื่นๆก็สามารถทำได้ดังนี้ เช่นเราจะทำการเพิ่ม method POST สำหรับ upload file

@app.post("/upload")
def update():
    ...your code....
    return {"message": "Uploaded"}

และสำหรับสั่งให้ตัว FastAPI ทำงาน ให้เราใช้คำสั่ง

uvicorn main:app

เป็นการสั่งให้ app=FastAPI()ในไฟล์ main.py ทำงาน

Integrate with RAG

ในการเอา FastAPI มาใช้งานร่วมกับ RAG เราจำเป็นต้องเข้าใจก่อนกว่า Step ในการทำงานนั้นเป็นอย่างไรบ้าง RAG จะมีขั้นตอนในการทำงานหลักๆคือ

การนำเข้าข้อมูล

  1. Load data หรือการดึงเรา Text จากไฟล์ต้นทางไม่ว่าจะเป็น PDF,Word,Excel
  2. ทำการ Embedding data ที่ load เข้ามาเป็น vector data
  3. นำ vector data ที่ได้ ไปบันทึกลง vector database

การ query ข้อมูล

  1. input ค่าที่ต้องการค้นหา
  2. นำค่าที่ต้องการไปค้นหาข้อมูลที่ใกล้เคียงที่สุดใน database
  3. นำข้อมูลที่ได้มาให้ API สร้างคำตอบให้

เมื่อเราเข้าใจตรงนี้แล้วเราจะสามารถสร้างเป็น function ออกมาได้หลักๆ 2 ตัวคือ function ที่ใช้ในการ upload ข้อมูลเข้า และ function ที่ใช้ในการถามคำถามจากข้อมูลที่ upload สุดท้ายแล้วเราจะสามารถเอา method มาจับกับ function เหล่านั้นได้เลย

Chroma vector database

อีกหนึ่งตัวเอกในงานนี้ของเราหนีไม่พ้นเจ้า database ตัวช่วยที่ให้เราค้นหาข้อมูลจากความคล้ายกันของข้อมูลได้ ด้วยความสามารถของ vector นั้นช่วยให้เราหาความคล้ายกันของข้อมูลได้ง่ายและรวดเร็ว ซึ่งส่วนนี้เป็นส่วนสำคัญของ RAG เลยก็ว่าได้ โดยการใช้งานเราจะติดตั้งตัว chromadb ก่อนโดย

pip install chromadb

แล้วทำการ import เข้ามาใช้งานใน code โดยเราจะต้องทำการประกาศให้เจ้าตัว chroma เป็น vector database ให้กับตัว langchain ในการใช้งานด้วย

Allow CORS

เพื่อเพิ่มความปลอดภัยในการ integrate กับหน้าบ้าน สิ่งที่เราต้องมีการ config เพิ่มเลยก็คือ CORS และใน FastAPI การ config ก็ทำได้ง่ายมากเพียงแค่ config ส่วนนี้เพิ่มเติมเข้าไป

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

แล้ว CORS คืออะไร CORS (Cross-Origin Resource Sharing) คือ กลไกที่ทำให้ server สามารถกำหนดสิทธิการเข้าถึงทรัพยากรได้ เมื่อมีเว็บไซต์ที่มี origin (domain) อื่น ใช้ HTTP request มายัง server ที่เรา deploy หลังบ้านอยู่ เพื่อให้แค่คนที่ต้องใช้งานเท่านั้นเข้ามาใช้งานได้ โดยเราสามารถระบุได้ตั้งแต่ domain_name, method และ headers เลยว่าค่าไหนคือสิ่งที่เราอยากให้เข้าเรียกใช้งาน

Deploy your code

สุดท้ายเราจะมา deploy ตัว application นี้ให้คนอื่นๆได้ใช้งานกัน ซึ่งวิธีการนั้นก็มีตัวช่วยที่ให้เรา deploy ได้อยู่มากมายไม่ว่าจะเป็น

  1. screen
  2. tmux
  3. nohup
  4. Docker container

แต่ว่าในครั้งนี้ผมจะขอยกตัวอย่างการ deploy โดยใช้ screen นะครับ ซึ่งผมมองว่าเป็นหนึ่งในวิธีที่ใช้งานไม่ยาก และทุกๆคนน่าจะใช้งานกันได้ เริ่มต้นจาก

Step 1: สร้าง session โดยค่า name ให้เราเปลี่ยนเป็นชื่อที่เราต้องการได้

screen -S name

Step 2: เข้าไปยัง folder ของ api

cd path/to/api

Step 3: สั่ง start FastAPI

uvicorn main:app

Step 4: ออกจาก session screen ปัจจุบัน (detach)

Ctrl+a d

โดย default ของ FastAPI จะเรียกใช้งานได้ผ่าน port 8000 ดังนั้นก่อนเข้าใช้งาน อย่าลืมตรวจสอบ security group ของ Instance ด้วยนะครับว่าได้ allow port ไว้แล้วหรือยัง ไม่อย่างนั้นเดี๋ยวจะเข้าใช้งานไม่ได้นะครับ

Link FastAPI with API Gateway

ส่วนสุดท้ายก่อนนำ api ไปใช้งานจริงเราก็ควรเพิ่มสิ่งที่จะมาเป็นตัวจัดการให้กับมันซักหน่อย โดยใช้งานตัว AWS API Gateway ที่จะเป็นตัวช่วยให้เราจัดการ traffic หรือ authentication ต่างๆได้ เพื่อเพิ่มทั้งความปลอดภัย และ feature ในการใช้งาน โดยวิธีการสร้างนั้นสามารถดูได้จาก

API Gateway · VulturePrime โดยเราสามารถใช้ api gateway integrate มายัง url ของ server และใช้งานผ่าน ตัว gateway ได้เลยโดยตรง

Test and Tuning

ในการทดสอบเราอาจจะทำการตั้งคำถามให้กับข้อมูลที่เรา upload ขึ้นไปแล้วมาดูว่าคำตอบที่ได้มันตรงกับใจเราหรือยัง หากยังรู้สึกว่าคำตอบที่ได้มันยังแปลกๆ เราก็จำเป็นที่ต้อง Tuning ให้กับตัว RAG ของเรา ไม่ว่าจะเป็นการเก็บข้อมูล เราควรแบ่งข้อมูลอย่างไร การค้นหาข้อมูลเราต้องการจำนวนข้อมูลที่ใกล้เคียงมากน้อยขนาดไหน รวมไปถึงความคิดสร้างสรรค์ของ AI ว่าจะให้มีมากน้อยเท่าไหร่ ทั้งหมดนี้ขึ้นอยู่กับการตั้งค่าของผู้พัฒนา เพื่อให้ได้ผลลัพธ์ที่ตรงใจเราหรือคนที่จะใช้งานเราบบของเราได้มากที่สุด

ทิ้งท้ายบทความสำหรับ Q&A bot

Q&A Document frontend

Q&A Document backend

Github Frontend

Github Backend

FAQ Facebook Group

Aa

© 2023, All Rights Reserved, VulturePrime co., ltd.