Embedchain + Line: สร้างแชทบอทตอบคำถามจากข้อมูลของคุณ!

Thanabhas Ubonjit
Devfinite Solutions
3 min readOct 21, 2023

การต่อ LINE Bot เข้ากับ GPT3.5 หรือ 4 นั้นได้กลายเป็นข่าวเก่าไปเสียแล้ว

ซึ่งผลที่ได้ก็คือน้อง ChatGPT อาจจะไม่น่ารักกับคุณเท่าไหร่ เช่น ไม่รู้ข้อมูลบริษัทของคุณเอง :(

ปัจจุบันตอนนี้เชื่อว่ามีหลายๆคนทดลองกับการใช้ Knowledge Embedding เข้ากับโมเดลเพื่อเพิ่มข้อมูลของตัวเองเข้าสู่ Bot โดยใช้ Langchain (ซึ่งก็ไม่ได้ใช้ยากนะ แต่มันก็มี learning curve)

แต่!!! วันนี้มี library ตัวใหม่เข้าสนามมาเพื่อช่วยให้ทั้งหมดนั้นง่ายขึ้นอีกระดับ Embedchain!!!!!

Github Link (Embedchain)

แต่ก่อนอื่นเรามา Recap กันสั้นๆก่อนถึงขั้นตอนปกติในการทำ Knowledge Embedding และสร้างบอท RAG (Retrieval augmented generation) *เวอร์ชั่นสั้นและละเอียดน้อยที่สุด ตกหล่นตรงใดกรุณาโปรดอย่าหัวร้อน ขอบคุณครับ*

  1. Load Data (ซึ่งแล้วแต่ประเภทข้อมูลอาจต้องใช้วิธีต่างกัน)
  2. Chunk Data (แบ่งออกเป็นส่วนๆให้ใส่ใน model ได้)
  3. Embeddings (แปลงข้อมูลเป็น Vector ให้สามารถใช้กับ NLP ได้)
  4. Vector Database (นำข้อมูลที่ได้ไปใส่ใน Database เฉพาะเพื่อเก็บ Vector)

ซึ่งหลังจากนั้นก็จะตามมาด้วยขั้นตอนในการต่อเข้า model ต่างๆและ query ข้อมูล

Embedchain นั้นนำ 4 step นี้มาทำให้แบบเกือบจะอัตโนมัติทั้งหมด

ทีนี้ในวันนี้ผมจะมาแสดงขั้นตอนคร่าวๆในการใช้งาน Embedchain กับ LINE Messaging API (รอบนี้ใช้ python เด้อ ** Version 3.11.5)

pip install --upgrade embedchain
pip install flask
pip install line-bot-sdk

ก่อนอื่นก็ทำการลงสิ่งเหล่านี้ก่อนนะครับ

from flask import Flask, request, abort
import os
from embedchain import App
from linebot.v3 import (
WebhookHandler
)
from linebot.v3.exceptions import (
InvalidSignatureError
)
from linebot.v3.messaging import (
Configuration,
ApiClient,
MessagingApi,
ReplyMessageRequest,
TextMessage
)
from linebot.v3.webhooks import (
MessageEvent,
TextMessageContent
)

configuration = Configuration(access_token='ใส่ของตัวเองครับ')
handler = WebhookHandler('ใส่ของตัวเองครับ')


os.environ['OPENAI_API_KEY'] = 'ใส่ของตัวเองครับ'

ai_bot = App()



app = Flask(__name__)

@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']

# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)

# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
app.logger.info("Invalid signature. Please check your channel access token/channel secret.")
abort(400)

return 'OK'


@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
response = ai_bot.query(event.message.text)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=response)]
)
)


if __name__ == "__main__":
app.run()

จากด้านบนจะเห็นได้ว่าผมได้ทำการลอก quickstart ของ line-bot-sdk มาทั้งดุ้นนะครับ (เพื่อการศึกษาเนอะ เอาหน่า) แต่จะมีอยู่บางจุดที่ได้มีการเปลี่ยนไปมาดูตรงนั้นกันครับ

from embedchain import App

os.environ['OPENAI_API_KEY'] = 'ใส่ของตัวเองครับ'

ai_bot = App()

3 บรรทัดนี้ได้ทำงานให้เราไปแล้วครึ่งนึงครับ คือสร้าง instance ของ GPT3.5 ที่ใช้ตอบคำถามได้แล้ว

@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
response = ai_bot.query(event.message.text)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=response)]
)
)

ในส่วน handle message event ผมได้ทำการต่อให้เข้ากับโมเดล GPT นะครับโดยเอา text จาก message event มาเรียก response เพียงแค่ใช้ .query()

ทีนี้มาดูในส่วนการใส่ข้อมูลให้บอทกันครับ

ai_bot.add("https://devfinite.solutions/about-us/")
ai_bot.add("https://devfinite.solutions/our-service/")
ai_bot.add("https://devfinite.solutions")

ผมได้เพิ่มสามบรรทัดนี้เข้าไปในโค้ดหลังเขียน ai_bot = App() ซึ่งเพียงสามบรรทัดนี้ก็จะทำให้ Embedchain จัดการกับ 4 ขั้นตอนของ Knowledge Embedding ให้เราได้ทันทีเลย มาดูผลกันครับผมจะทำการรัน API ตัวนี้ขึ้นมา

และ Port Forward เพื่อสร้างลิ้ง webhook ไปใส่ใน LINE OA ของผมนะครับ สำหรับท่านที่ยังไม่ทราบเรื่อง Port Forwarding ใน VS Code สามารถอ่านได้ที่นี่ครับ

หมายเหตุ: Embedchain ยังใหม่มากครับ เวลารันอาจขึ้น error ให้ pip install ส่วนนู้นนี้ ก็ install ตามๆมันไปนะครับจนกว่าจะรันเซิฟได้ จากที่ผมทดลองยังไม่มีอันที่ทำให้เจ๊งใช้ไม่ได้ครับ

ผลลัพธ์:

โอ้โห นอกจากจะรู้ข้อมูลแล้วยังอวยบริษัทให้เสียด้วย น่ารักจริงๆ

มันรู้ลึกรู้จริงนะ :0

บทสรุปและข้อความปิดท้าย

เนื้อหาในบทความนี้เป็นเพียงตัวอย่างเล็กๆในความสามารถของ Embedchain ตัว Embedchain แท้จริงแล้วสามารถปรับแต่งได้อีกหลายอย่างครับ ใส่ system prompt ก็ได ตั้ง Config LLM อื่นๆเช่น temperature, top_p ใดๆได้ไม่ต่างกับ Langchain และรองรับข้อมูลได้ทั้ง CSV, Docx, Text, Website, Sitemap, Documentation, Youtube Video และอื่นๆ รวมถึงยังรองรับ LLM, Embedding Model, Vector Database อีกหลายๆตัวครับ ซึ่งผมแนะนำให้ทุกท่านทดลองกับหลายๆรูปแบบดูเพื่อหาอันที่ตรง Use Case ที่สุดครับ

ลิ้งค์ Documentation: Embedchain

หมายเหตุ: ในการใช้งานจริงโปรดทุกท่านอย่าเรียงโค้ดเขียนแบบในตัวอย่างนะครับ จะปวดหัวเพื่อร่วมงานเปล่าๆ กรุณา Refactor และวาง Architecture ดีๆสำหรับการใ้ช้งานจริงนะครับ

ขอบพระคุณ: Line Messaging API, linebot-python-sdk, embedchain, open-ai

--

--