วิธีการสร้าง Text-to-SQL เชื่อมต่อ Athena [พร้อม Code ตัวอย่าง]

Overview

ปัจจุบันได้มีการพัฒนา LLMs ขึ้นมาอย่างรวดเร็วนับจากการเปิดตัวของ Chat-GPT ซึ่ง LLMs ปัจจุบันมีหลากหลาย Model และจากหลากหลายบริษัท เช่น Meta, Google, Anthropic และอื่น ๆ

Use case ที่เราผ่านต่อส่วนใหญ่แล้วเป็นการนำ LLMs มาใช้ในงาน ถาม-ตอบ, คิดไอเดียใหม่, ช่วยเขียนโค้ด หรือแม้แต่ช่วยนำไปวิเคราะห์ข้อมูล

บทความนี้อยากนำเสนอตัวอย่างการ Integrate LLMs (OpenAI) สำหรับงาน Text-to-SQL หรือการเปลี่ยนจากคำถามในภาษาเขียน เพื่อให้ Query ผ่าน AWS Athena

Concept Text-to-SQL

https://medium.com/intuitionmath/text-to-sql-learning-to-query-tables-with-natural-language-7d714e60a70d

หลักการทำงานของ Text-to-SQL คือการสร้าง Prompt Template ซึ่งประกอบด้วยข้อมูลของ Prompt (User question) + Column header (Table header) เข้าด้วยกัน จากนั้นนำ Prompt ที่ได้มา ส่งให้กับ LLMs ประมวลผลเพื่อให้ได้มาซึ่ง SQL หรือ ผลลัพธ์ (SQL Interpreter)

Architecture

สำหรับ Architecture ดังกล่าว เราจะมี Library ที่เกี่ยวข้องด้วยกันทั้งหมด 4 Library ได้แก่

  1. LlamaIndex (Data framework)
  2. OpenAI, Boto3 (LLMs Agents)
  3. SQLAlchemy (SQL ORM)
  4. PyAthena (SQL Client)

แนะนำการใช้งาน LlamaIndex

LlamaIndex เป็น Data framework สำหรับสร้าง LLMs Application โดย Concept หลักของการใช้งาน LlamaIndex จะแบ่งออกเป็น 2 ส่วน ได้แก่

  1. Indexing stage
  2. Querying stage  

ซึ่งทั่วไปแล้วเราจะใช้ทั้ง 2 ส่วนนี้ในการสร้าง RAG (Retrieval Augmented Generation) แต่สำหรับการใช้ Text-to-SQL เราจะใช้แค่ Querying stage ในส่วนของ Query Engines

การใช้งาน Query Engines นั้นจำเป็นต้องมีส่วนประกอบสำคัญ ได้แก่

  1. Data source
  2. Agents

ซึ่งการสร้างทั้ง 2 ส่วนประกอบนี้ เราจะอธิบายตามตัวอย่าง Code ดังต่อไปนี้

การสร้างระบบ Text-to-SQL โดยเริ่มจากการใช้งาน LlamaIndex เพื่อเป็นการกำหนด Data Source, Agents (LLMs) และ Result ขึ้นมา

ในส่วนแรกที่สุดนั้น เป็นการ Config ค่าที่เกี่ยวข้องทั้งหมด โดยสิ่งที่เราต้องเตรียมทั้งหมดได้แก่

  1. OPENAI_API_KEY
  2. AWS_ACCESS_KEY
  3. AWS_SECRET_KEY  
  4. S3_STAGING_DIR (S3 สำหรับเก็บ Result)
  5. AWS_REGION
  6. DATABASE (Athena Database)
  7. WORKGROUP (Athena Workgroup)
  8. TABLE (Athena Database Table)

สำหรับการใช้งาน OpenAI เราสามารถเลือก Model ที่ต้องการใช้งานได้ผ่าน Parameter Model และสามารถปรับ Temperature และ Max token (Output limit) ให้เหมาะสมกับการใช้งานของเราได้

หลังจาก Config ในส่วนเริ่มต้นเสร็จเริ่มร้อยแล้ว เราต้องสร้าง engine ขึ้นมา โดยสร้างผ่าน SQLAlchemy ด้วย function create_engine เพื่อที่จะใช้ engine ดังกล่าวในการเชื่อมต่อกับ Athena ของเรา

จากนั้นเราจะนำ engine ดังกล่าวไปเป็น Data source สำหรับ LlamaIndex ผ่าน function SQLDatabase และทำการเชื่อม Datasource เข้ากับ Agent ด้วย functionNLSQLTableQueryEngine (Default Agent คือ OpenAI)

เมื่อทำการเชื่อม Data source เข้ากับ Agent เรียบร้อยแล้ว เราจะสามารถใช้งาน Query ได้จาก function query และสามารถแสดงผลลัพธ์การ Query ให้อยู่ในรูปแบบของภาษาเขียน (Human language) และสามารถแสดงผลลัพธ์ SQL Query ที่สร้างขึ้นมาได้

ข้อควรรู้

  • เนื่องจาก LLMs จะทำการใช้ Table header ในการหาความเกี่ยวข้องกับ User question ดังนั้นการกำหนดชื่อของ Column แต่ละ Column นั้นจึงมีผลโดยตรงต่อความถูกต้องของการสร้าง SQL และผลลัพธ์จากการ Query ข้อมูล
  • LLMs แต่ละตัวมีความสามารถในการสร้าง SQL ไม่เท่ากัน จำเป็นต้องศึกษาถึงประสิทธิของ LLMs ก่อนนำมาใช้งาน

Code

สำหรับตัวอย่าง Code สามารถดูได้ที่ https://github.com/vultureprime/deploy-ai-model/tree/main/aws-example/text-to-sql-openai


Aa

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