ການຈັດການໜ່ວຍຄວາມຈຳໃນ AI Chatbot: ເຕັກນິກການສະຫຼຸບປະຫວັດການສົນທະນາ
ການຈັດການໜ່ວຍຄວາມຈຳໃນ AI Chatbot: ເຕັກນິກການສະຫຼຸບປະຫວັດການສົນທະນາ
ລອງຈິນຕະນາການວ່າທ່ານກຳລັງພັດທະນາ AI Chatbot ສຳລັບຮ້ານຂາຍນ້ຳຫອມມົນຈຳປາ ຫຼື ຮ້ານຂາຍເຄື່ອງຫັດຖະກຳ (SME) ໃນນະຄອນຫຼວງວຽງຈັນ. ສິ່ງທີ່ລູກຄ້າບໍ່ມັກທີ່ສຸດຄື “ການຕ້ອງພິມບອກຂໍ້ມູນເດີມຊ້ຳແລ້ວຊ້ຳອີກ” ເພາະບັອດລືມສິ່ງທີ່ລົມກັນໄປກ່ອນໜ້ານີ້.
ໃນຖານະນັກພັດທະນາ, ພວກເຮົາມີບັນຫາໃຫຍ່ຄື: LLMs (Large Language Models) ເຊັ່ນ GPT-4, Claude ຫຼື ໂມເດວອື່ນໆ ລ້ວນແຕ່ມີຂໍ້ຈຳກັດຂອງ Context Window ຫຼື ຈຳນວນ Token ທີ່ມັນສາມາດອ່ານໄດ້ໃນແຕ່ລະຄັ້ງ. ຖ້າເຮົາສົ່ງປະຫວັດການແຊັດທັງໝົດໄປຫາ API ໃນທຸກໆຄັ້ງທີ່ລູກຄ້າພິມມາ, ນອກຈາກຈະເຮັດໃຫ້ Context ເຕັມແລ້ວ ຍັງເຮັດໃຫ້ຄ່າ API ແພງຂຶ້ນຢ່າງມະຫາສານ. ມື້ນີ້ເຮົາຈະມາເບິ່ງວິທີແກ້ໄຂບັນຫານີ້ດ້ວຍເຕັກນິກ “ການສະຫຼຸບປະຫວັດການສົນທະນາ” (Chat History Summarization).
Context Window ແມ່ນຫຍັງ ແລະ ເປັນຫຍັງຈຶ່ງສຳຄັນ?
Context Window ປຽບເໝືອນ “ຄວາມຈຳໄລຍະສັ້ນ” ຂອງ AI. ຖ້າລູກຄ້າຄົນໜຶ່ງລົມກັບ Chatbot ເພື່ອຈອງໂຮງແຮມໃນຫຼວງພະບາງ ແລະ ສອບຖາມຂໍ້ມູນການເດີນທາງເປັນເວລາຫຼາຍຊົ່ວໂມງ, ຈຳນວນຂໍ້ຄວາມຈະສະສົມເພີ່ມຂຶ້ນ. ເມື່ອປະຫວັດການສົນທະນາຍາວເກີນກວ່າ Context Limit, ຊອບແວມັກຈະຕັດຂໍ້ຄວາມເກົ່າໆຖິ້ມ (Trunation), ເຮັດໃຫ້ບັອດລືມວ່າລູກຄ້າເຄີຍບອກວ່າຢາກໄດ້ “ຫ້ອງພັກຕິດແຄມນ້ຳຂອງ”.
ເພື່ອຮັກສາຄວາມຕໍ່ເນື່ອງຂອງການສົນທະນາ ໂດຍບໍ່ເຮັດໃຫ້ Token ຫຼາຍເກີນໄປ, ເຮົາຈຶ່ງຕ້ອງໃຊ້ເຕັກນິກ Conversation Summary Buffer Memory.
ເຕັກນິກ Conversation Summary Buffer Memory
ແທນທີ່ຈະເກັບທຸກຄຳເວົ້າ (Standard Buffer Memory) ເຊິ່ງຈະເຮັດໃຫ້ Token ເຕັມໄວ, ເຮົາຈະໃຊ້ວິທີການເກັບຂໍ້ຄວາມລ່າສຸດໄວ້ຈຳນວນໜຶ່ງ ແລະ “ສະຫຼຸບ” (Summarize) ຂໍ້ຄວາມທີ່ເກົ່າກວ່ານັ້ນ ດ້ວຍ AI ອີກຕົວໜຶ່ງ ຫຼື ດ້ວຍ Prompt ພິເສດ ເພື່ອເກັບເປັນຄວາມຈຳລວມ (Core Background).
ເຄື່ອງມືທີ່ນິຍົມໃຊ້ໃນການຈັດການບັນຫານີ້ຢ່າງງ່າຍດາຍແມ່ນ LangChain, ເຊິ່ງເປັນ Framework ທີ່ຊ່ວຍໃຫ້ນັກພັດທະນາສາມາດຈັດການກັບ Memory ໄດ້ຢ່າງມີປະສິດທິພາບ.
ຕົວຢ່າງການຂຽນໂຄດດ້ວຍ Python ແລະ LangChain
ກ່ອນອື່ນໝົດ, ໃຫ້ຕິດຕັ້ງ Library ທີ່ຈຳເປັນ:
pip install langchain langchain-openai tiktoken
ຈາກນັ້ນ, ມາເບິ່ງວິທີການສ້າງ Chatbot ທີ່ສາມາດສະຫຼຸບການສົນທະນາເອງໄດ້:
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationSummaryBufferMemory
# 1. ກຳນົດ LLM ທີ່ຕ້ອງການໃຊ້ (ໃຊ້ແທນກັນທັງການຕອບຄຳຖາມ ແລະ ການສະຫຼຸບ)
llm = ChatOpenAI(temperature=0.7, model_name="gpt-3.5-turbo")
# 2. ສ້າງໜ່ວຍຄວາມຈຳແບບສະຫຼຸບປະສົມ (Summary Buffer)
# ກຳນົດຂອບເຂດ Token ສູງສຸດ (ຕົວຢ່າງ: 300 tokens)
# ຖ້າປະຫວັດໃກ້ຈະກາຍ 300 tokens, ລະບົບຈະເອົາຂໍ້ຄວາມເກົ່າມາສະຫຼຸບໂດຍອັດຕະໂນມັດ
memory = ConversationSummaryBufferMemory(
llm=llm,
max_token_limit=300,
return_messages=True
)
# 3. ສ້າງ Conversation Chain
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True # ເປີດ verbose ເພື່ອເບິ່ງເບື້ອງຫຼັງການເຮັດວຽກທີ່ Terminal
)
# 4. ຕົວຢ່າງການສົນທະນາ (ຈຳລອງການສັ່ງອາຫານໃນວຽງຈັນ)
print(conversation.predict(input="ສະບາຍດີ, ຂ້ອຍຊື່ ສົມຊາຍ. ຂ້ອຍຢາກສັ່ງຕຳໝາກຫຸ່ງ ແລະ ປີ້ງໄກ່ໜຶ່ງໂຕ."))
print(conversation.predict(input="ຕຳໝາກຫຸ່ງຂໍເຜັດໆເດີ້, ໃສ່ປູດອງນຳ."))
print(conversation.predict(input="ຊ່ວຍສົ່ງມາທີ່ບ້ານດົງປ່າລານ, ເມືອງສີສັດຕະນາກ ແນ່. ຮອດແລ້ວໂທຫາຂ້ອຍເດີ."))
# ເມື່ອ Token ເລີ່ມກາຍກຳນົດ, ຄວາມຈຳອັນເກົ່າຈະຖືກ AI ປ່ຽນເປັນສະຫຼຸບສັ້ນໆເຊັ່ນ:
# "ຜູ້ໃຊ້ຊື່ ສົມຊາຍ ຕ້ອງການສັ່ງຕຳໝາກຫຸ່ງ (ເຜັດ, ໃສ່ປູດອງ) ແລະ ປີ້ງໄກ່ ໃຫ້ໄປສົ່ງທີ່ບ້ານດົງປ່າລານ..."
ໃນໂຄດດ້ານເທິງ, ConversationSummaryBufferMemory ຈະເປັນຄືກັບຜູ້ຊ່ວຍທີ່ຄອຍກວດສອບປະລິມານ Token. ມັນຈະລົມກັບ tiktoken ຢູ່ເບື້ອງຫຼັງເພື່ອຕັດສິນໃຈວ່າຕອນໃດຄວນຫຍໍ້ຂໍ້ຄວາມ ເພື່ອປະຢັດພື້ນທີ່ສະໝອງຂອງ AI.
ຄວາມທ້າທາຍ ແລະ ຂໍ້ຄວນລະວັງ ໃນການໃຊ້ກັບ “ພາສາລາວ”
ການໃຊ້ງານເຕັກນິກນີ້ກັບພາສາອັງກິດອາດຈະລ່ຽນໄຫຼ ແຕ່ສຳລັບ ພາສາລາວ ນັກພັດທະນາຕ້ອງລະວັງເລື່ອງການນັບ Token.
- Token ຂອງພາສາລາວຈຳນວນຫຼວງຫຼາຍ: ເນື່ອງຈາກ LLM Tokenizers (ເຊັ່ນ BPE ຂອງ OpenAI) ບໍ່ໄດ້ຖືກຝຶກມາໃຫ້ເຂົ້າໃຈການຕັດຄຳພາສາລາວໄດ້ດີເທົ່າພາສາອັງກິດ. 1 ຄຳພາສາລາວ ອາດຈະຖືກແຍກອອກເປັນ 3 ຫາ 6 Tokens (ເປັນ Bytes).
- ການປັບປ່ຽນ (Adjustment): ເມື່ອທ່ານກຳນົດ
max_token_limit, ການຕັ້ງຄ່າໄວ້ທີ່ 100 tokens ສຳລັບພາສາອັງກິດອາດຈະຈື່ໄດ້ຫຼາຍປະໂຫຍກ, ແຕ່ສຳລັບພາສາລາວ 100 tokens ອາດຈະໄດ້ພຽງແຕ່ 1-2 ປະໂຫຍກເທົ່ານັ້ນ. ດັ່ງນັ້ນ, ທ່ານຄວນປັບmax_token_limitໃຫ້ສູງຂຶ້ນເລັກນ້ອຍ (ເຊັ່ນ 500 ຫຼື 1000) ເພື່ອປ້ອງກັນບໍ່ໃຫ້ LangChain ເອີ້ນໃຊ້ API ເພື່ອສະຫຼຸບຂໍ້ຄວາມ (Summarize) ຖີ່ເກີນໄປ ເຊິ່ງອາດເຮັດໃຫ້ເກີດອາການ “ຫຼົງລືມລາຍລະອຽດໄວ”.
ທາງເລືອກອື່ນທີ່ປັບໃຊ້ຮ່ວມກັນໄດ້ (Advanced Architecture)
ສຳລັບລະບົບທີ່ຕ້ອງການ ຄວາມຈຳໄລຍະຍາວ (Long-term Memory) ເຊັ່ນ ແອັບໃຫ້ຄຳປຶກສາດ້ານການກະເສດໃຫ້ກັບຊາວກະສິກອນຢູ່ປາກຊ່ອງ ທີ່ບັອດຈຳເປັນຕ້ອງຈື່ປະຫວັດການໃສ່ຝຸ່ນກາເຟຂອງລູກຄ້າໃນປີກາຍ, ການໃຊ້ພຽງແຕ່ Summary Memory ອາດບໍ່ພຽງພໍ.
ໃນກໍລະນີແບບນີ້, ໃຫ້ນັກພັດທະນາພິຈາລະນາການໃຊ້ Vector Database (ເຊັ່ນ: Pinecone, ChromaDB ຫຼື Milvus) ເພື່ອບັນທຶກທຸກໆ Logs ຂອງການສົນທະນາ. ເມື່ອຜູ້ໃຊ້ຖາມຄຳຖາມໃໝ່, ລະບົບຈະຄົ້ນຫາປະຫວັດທີ່ກ່ຽວຂ້ອງ (Semantic Search/RAG) ແລ້ວດຶງສະເພາະຂໍ້ຄວາມນັ້ນມາເປັນ Context ໃຫ້ກັບ AI. ເຊິ່ງເຕັກນິກນີ້ຈະຊ່ວຍແກ້ບັນຫາ Context Window ໄດ້ຢ່າງຍືນຍົງທີ່ສຸດສຳລັບ Application ຂະໜາດໃຫຍ່.
ສິ່ງສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)
- ຍິ່ງສົ່ງ Context ຍາວ, ຄ່າ API ຍິ່ງແພງ: ການຫຼຸດຂະໜາດປະຫວັດການແຊັດຜ່ານການສະຫຼຸບ ຊ່ວຍປະຢັດຕົ້ນທຶນໄດ້ຈິງ.
- ໃຊ້ LangChain Library:
ConversationSummaryBufferMemoryເປັນຕົວຊ່ວຍທີ່ດີ ເພາະມັນເກັບຂໍ້ຄວາມໃໝ່ແບບເຕັມແຖວ ແລະ ສະຫຼຸບຂໍ້ຄວາມເກົ່າໂດຍອັດຕະໂນມັດ. - ລະວັງ Token Cost ຂອງພາສາລາວ: ພາສາລາວກິນ Token ຫຼາຍກວ່າພາສາອັງກິດ, ສະນັ້ນຄວນປັບຄ່າ Token Limit ໃນການຕັດສະຫຼຸບໃຫ້ເໝາະສົມ.
ບົດສະຫຼຸບ
ການຈັດການໜ່ວຍຄວາມຈຳໃຫ້ດີ ບໍ່ພຽງແຕ່ຊ່ວຍໃຫ້ Chatbot ຂອງທ່ານສະຫຼາດຂຶ້ນ ແລະ ຮູ້ຈັກຜູ້ໃຊ້ງານດີຂຶ້ນ ແຕ່ຍັງຊ່ວຍຫຼຸດຕົ້ນທຶນ (API Cost) ໃຫ້ທຸລະກິດການພັດທະນາຊອບແວຂອງທ່ານໄດ້ຢ່າງຫຼວງຫຼາຍ. ບໍ່ວ່າທ່ານຈະສ້າງບັອດບໍລິການລູກຄ້າໃຫ້ກັບ SME ທ້ອງຖິ່ນ ຫຼື ລະບົບທີ່ປຶກສາຂະໜາດໃຫຍ່, ລອງນຳເອົາເທັກນິກ Conversation Summarization ນີ້ໄປປັບໃຊ້ກັບໂປຣເຈັກ AI ທີ່ກຳລັງພັດທະນາຢູ່ ເພື່ອມອບປະສົບການທີ່ລ່ຽນໄຫຼ ແລະ ເປັນທຳມະຊາດທີ່ສຸດໃຫ້ກັບຜູ້ໃຊ້ງານໃນປະເທດລາວ.