AGI และ AI แห่งอนาคต

สร้างตัวแทน LLM สำหรับ RAG จากศูนย์และอื่น ๆ : คู่มือที่ครอบคลุม

mm
เพิ่ม Unite.AI ลงในแหล่งข้อมูลที่คุณต้องการบน Google

โมเดล LLM เช่น GPT-3, GPT-4 และคู่ที่เป็นโอเพ่นซอร์สของพวกเขามักจะดิ้นรนในการค้นหาข้อมูลที่ทันสมัยและบางครั้งสร้างข้อมูลที่ไม่ถูกต้องหรือ “hallucinations”

การสร้างแบบจำลองที่ช่วยในการค้นหาข้อมูล (Retrieval-Augmented Generation, RAG) เป็นเทคนิคที่รวมพลังของ LLM ด้วยการค้นหาข้อมูลจากภายนอก RAG ช่วยให้เราสามารถสร้างข้อความที่มีประสิทธิภาพและเชื่อถือได้โดยการค้นหาข้อมูลที่ถูกต้องและทันสมัย

ในบทความนี้ เราจะสำรวจวิธีการสร้างตัวแทน LLM สำหรับ RAG จากศูนย์ โดยการดูรายละเอียดเกี่ยวกับโครงสร้าง การใช้งาน และเทคนิคที่ทันสมัย เราจะครอบคลุมทุกอย่างตั้งแต่พื้นฐานของ RAG ไปจนถึงการสร้างตัวแทน LLM ที่ซับซ้อนซึ่งสามารถทำการให้เหตุผลและดำเนินการได้

ก่อนที่เราจะเริ่มสร้างตัวแทน LLM ของเรา มาทำความเข้าใจกันก่อนว่า RAG คืออะไรและทำไมมันจึงสำคัญ

RAG หรือ Retrieval-Augmented Generation เป็นแนวทางแบบผสมที่รวมการค้นหาข้อมูลเข้ากับการสร้างข้อความ ในระบบ RAG:

  • คำถามจะถูกใช้ในการค้นหาข้อมูลที่เกี่ยวข้องจากฐานข้อมูลความรู้
  • ข้อมูลเหล่านั้นจะถูกส่งเข้าไปในโมเดลภาษาพร้อมกับคำถามเดิม
  • โมเดลจะสร้างข้อความตอบกลับโดยอาศัยคำถามและข้อมูลที่ค้นหา
RAG

RAG

แนวทางนี้มีประโยชน์หลายประการ:

  • ความแม่นยำที่ดีขึ้น: โดยการสร้างข้อความที่อ้างอิงจากข้อมูลที่ค้นหา RAG ลดการ “hallucinations” และปรับปรุงความถูกต้องของข้อเท็จจริง
  • ข้อมูลที่ทันสมัย: ฐานข้อมูลความรู้สามารถอัปเดตได้บ่อยๆ ทำให้ระบบสามารถเข้าถึงข้อมูลที่ทันสมัย
  • ความโปร่งใส: ระบบสามารถให้แหล่งข้อมูลสำหรับข้อมูลของมัน ทำให้สามารถตรวจสอบข้อเท็จจริงได้

การทำความเข้าใจตัวแทน LLM

 

เมื่อคุณเผชิญกับปัญหาที่ไม่มีคำตอบง่ายๆ คุณมักจะต้องทำตามขั้นตอนหลายขั้นตอน คิดอย่างรอบคอบ และจดจำสิ่งที่คุณได้ลองแล้ว ตัวแทน LLM ได้รับการออกแบบมาเพื่อใช้ในสถานการณ์เหล่านี้โดยเฉพาะในแอปพลิเคชันของโมเดลภาษา พวกเขารวมการวิเคราะห์ข้อมูลอย่างละเอียด การวางแผนเชิงกลยุทธ์ การค้นหาข้อมูล และความสามารถในการเรียนรู้จากการกระทำในอดีตเพื่อแก้ปัญหาที่ซับซ้อน

ตัวแทน LLM คืออะไร?

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

พิจารณาคำถามในด้านกฎหมาย เช่น “ผลทางกฎหมายที่อาจเกิดขึ้นจากการละเมิดสัญญาแบบใดแบบหนึ่งในแคลิฟอร์เนียคืออะไร?” โมเดล LLM พื้นฐานพร้อมระบบ RAG สามารถค้นหาข้อมูลที่จำเป็นจากฐานข้อมูลกฎหมาย

สำหรับสถานการณ์ที่ซับซ้อนกว่านี้: “เมื่อพิจารณากฎหมายความเป็นส่วนตัวใหม่ อุปสรรคทางกฎหมายทั่วไปที่บริษัทต่างๆ เผชิญ และศาลตอบสนองต่อประเด็นเหล่านี้อย่างไร?” คำถามนี้ลึกกว่าการค้นหาข้อเท็จจริงเพียงอย่างเดียว มันเกี่ยวกับการทำความเข้าใจกฎใหม่ ผลกระทบต่อบริษัทต่างๆ และการตอบสนองของศาล ตัวแทน LLM จะแบ่งงานนี้ออกเป็นงานย่อย เช่น การค้นหากฎหมายล่าสุด การวิเคราะห์กรณีทางประวัติศาสตร์ การสรุปเอกสารทางกฎหมาย และการคาดการณ์แนวโน้มตามรูปแบบ

ส่วนประกอบของตัวแทน LLM

ตัวแทน LLM โดยทั่วไปประกอบด้วยส่วนประกอบ 4 ส่วน:

  1. ตัวแทน/สมอง: โมเดลภาษาหลักที่ประมวลผลและเข้าใจภาษา
  2. การวางแผน: ความสามารถในการให้เหตุผล การแบ่งงานออกเป็นงานย่อย และพัฒนาการวางแผน
  3. ความจำ: รักษาบันทึกของการโต้ตอบในอดีตและเรียนรู้จากพวกมัน
  4. การใช้เครื่องมือ: รวมเครื่องมือต่างๆ เพื่อทำงาน

ตัวแทน/สมอง

ที่แก่นกลางของตัวแทน LLM คือโมเดลภาษาที่ประมวลผลและเข้าใจภาษาโดยอาศัยข้อมูลจำนวนมากที่ได้รับการฝึกอบรม คุณเริ่มต้นด้วยการให้คำแนะนำเฉพาะเพื่อชี้นำตัวแทนเกี่ยวกับวิธีการตอบสนอง เครื่องมือที่จะใช้ และเป้าหมายที่ต้องการ คุณสามารถปรับแต่งตัวแทนได้ด้วยบุคลิกที่เหมาะสมสำหรับงานหรือการโต้ตอบที่เฉพาะเจาะจง ซึ่งจะเพิ่มประสิทธิภาพของตัวแทน

ความจำ

ส่วนประกอบความจำช่วยให้ตัวแทน LLM จัดการกับงานที่ซับซ้อนโดยการรักษาบันทึกของการกระทำในอดีต มีสองประเภทหลักของความจำ:

  • ความจำระยะสั้น: ทำหน้าที่เหมือนกระดาษจดบันทึก โดยติดตามการสนทนาอย่างต่อเนื่อง
  • ความจำระยะยาว: ทำหน้าที่เหมือนบันทึก โดยเก็บข้อมูลจากการสนทนาในอดีตเพื่อเรียนรู้รูปแบบและตัดสินใจที่ดีขึ้น

โดยการผสมผสานความจำทั้งสองประเภท ตัวแทนสามารถให้การตอบสนองที่เหมาะสมและจดจำความชอบของผู้ใช้ตามเวลา ทำให้เกิดการโต้ตอบที่เชื่อมโยงและเกี่ยวข้องมากขึ้น

การวางแผน

การวางแผนช่วยให้ตัวแทน LLM สามารถให้เหตุผล แบ่งงานออกเป็นงานย่อย และปรับแผนการทำงานตามความจำเป็น การวางแผนประกอบด้วยสองขั้นตอนหลัก:

  • การวางแผนการ: แบ่งงานออกเป็นงานย่อย
  • การสะท้อนแผน: ทบทวนและประเมินประสิทธิภาพของแผน โดยรวมข้อเสนอแนะเพื่อปรับปรุงกลยุทธ์

วิธีการเช่น Chain of Thought (CoT) และ Tree of Thought (ToT) ช่วยในการกระบวนการแบ่งงานนี้ ทำให้ตัวแทนสามารถสำรวจเส้นทางต่างๆ เพื่อแก้ปัญหา

เพื่อศึกษาข้อมูลเพิ่มเติมเกี่ยวกับตัวแทน AI รวมถึงความสามารถในปัจจุบันและศักยภาพในอนาคต ให้พิจารณาอ่าน “Auto-GPT & GPT-Engineer: คู่มือที่ครอบคลุมเกี่ยวกับตัวแทน AI ที่นำหน้าในปัจจุบัน”

การเตรียมสภาพแวดล้อม

เพื่อสร้างตัวแทน RAG ของเรา เราต้องเตรียมสภาพแวดล้อมในการพัฒนา เราจะใช้ Python และไลบรารี่หลักๆ ดังนี้:

  • LangChain: สำหรับการจัดการ LLM และส่วนประกอบการค้นหาของเรา
  • Chroma: เป็นร้านค้าเวกเตอร์สำหรับการฝังตัวของเอกสาร
  • โมเดล GPT ของ OpenAI: เป็น LLM พื้นฐาน (คุณสามารถแทนที่ด้วยโมเดลโอเพ่นซอร์สได้หากต้องการ)
  • FastAPI: สำหรับการสร้าง API ที่เรียบง่ายเพื่อโต้ตอบกับตัวแทนของเรา

มาทำการเตรียมสภาพแวดล้อมกัน:


<p># สร้างสภาพแวดล้อมเสมือนใหม่
python -m venv rag_agent_env
source rag_agent_env/bin/activate # บน Windows ใช้ `rag_agent_env\Scripts\activate`</p>

<p># ติดตั้งแพ็คเกจที่จำเป็น
pip install langchain chromadb openai fastapi uvicorn

ตอนนี้ มาทำไฟล์ Python ใหม่ชื่อ rag_agent.py และนำเข้าไลบรารี่ที่จำเป็น:


<p>from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
import os</p>

<p># ตั้งค่าキー API ของ OpenAI
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;your-api-key-here&quot;</p>

การสร้างระบบ RAG ที่เรียบง่าย

ตอนนี้เรามีสภาพแวดล้อมพร้อมแล้ว มาทำระบบ RAG พื้นฐานกัน เราจะเริ่มต้นด้วยการสร้างฐานความรู้จากชุดเอกสาร จากนั้นใช้ฐานความรู้นี้เพื่อตอบคำถาม

ขั้นตอนที่ 1: เตรียมเอกสาร

ก่อนอื่นเราต้องโหลดและเตรียมเอกสารของเรา ในตัวอย่างนี้ สมมติว่าเรามีไฟล์ข้อความชื่อ knowledge_base.txt ที่มีข้อมูลบางอย่างเกี่ยวกับ AI และการเรียนรู้ของเครื่อง


<p># โหลดเอกสาร
loader = TextLoader(&quot;knowledge_base.txt&quot;)
documents = loader.load()</p>

<p># แบ่งเอกสารออกเป็นชิ้น
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># สร้างการฝังตัว
embeddings = OpenAIEmbeddings()</p>

<p># สร้างร้านค้าเวกเตอร์
vectorstore = Chroma.from_documents(texts, embeddings)</p>

ขั้นตอนที่ 2: สร้างโซ่การค้นหาสอบถาม

ตอนนี้เรามีร้านค้าเวกเตอร์แล้ว เราสามารถสร้างโซ่การค้นหาสอบถามได้:


<p># สร้างโซ่การค้นหาสอบถาม
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type=&quot;stuff&quot;, retriever=vectorstore.as_retriever())</p>

ขั้นตอนที่ 3: สอบถามระบบ

เราสามารถสอบถามระบบ RAG ของเราได้แล้ว:


<p>query = &quot;การประยุกต์ใช้หลักการของการเรียนรู้ของเครื่องมีอะไรบ้าง?&quot;
result = qa.run(query)
print(result)

ขั้นตอนที่ 4: การสร้างตัวแทน LLM

ในขณะที่ระบบ RAG พื้นฐานของเรามีประโยชน์ แต่ก็ยังจำกัดอยู่มาก มาทำให้มันสมบูรณ์แบบโดยการสร้างตัวแทน LLM ที่สามารถทำงานที่ซับซ้อนและให้เหตุผลเกี่ยวกับข้อมูลที่ค้นหาได้

ตัวแทน LLM เป็นระบบ AI ที่สามารถใช้เครื่องมือและตัดสินใจเกี่ยวกับการกระทำที่จะทำได้ เราจะสร้างตัวแทนซึ่งไม่เพียงแต่ตอบคำถามเท่านั้น แต่ยังสามารถค้นหาทางอินเทอร์เน็ตและคำนวณพื้นฐานได้

ก่อนอื่น มาทำเครื่องมือสำหรับตัวแทนของเรา:


<p>from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.tools import BaseTool
from langchain.agents import initialize_agent
from langchain.agents import AgentType</p>

<p># นิยามเครื่องมือตัวเลข
class CalculatorTool(BaseTool):
name = &quot;Calculator&quot;
description = &quot;สำหรับคำถามทางคณิตศาสตร์&quot;</p>

<p>def _run(self, query: str)
try:
return str(eval(query))
except:
return &quot;ไม่สามารถคำนวณได้ โปรดตรวจสอบว่าข้อมูลของคุณถูกต้อง&quot;</p>

<p># สร้างตัวแทนเครื่องมือ
search = DuckDuckGoSearchRun()
calculator = CalculatorTool()</p>

<p># นิยามเครื่องมือ
tools = [Tool(name=&quot;ค้นหา&quot;,func=search.run,description=&quot;สำหรับคำถามทั่วไป&quot;),
Tool(name=&quot;RAG-QA&quot;,func=qa.run,description=&quot;สำหรับคำถามเกี่ยวกับ AI และการเรียนรู้ของเครื่อง&quot;),
Tool(name=&quot;Calculator&quot;,func=calculator._run,description=&quot;สำหรับการคำนวณพื้นฐาน&quot;)
]</p>

<p># นิยามตัวแทน
agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

ตอนนี้เรามีตัวแทนซึ่งสามารถใช้ระบบ RAG ของเรา ค้นหาทางอินเทอร์เน็ต และคำนวณพื้นฐานได้ มาทดสอบมัน:


<p>result = agent.run(&quot;ความแตกต่างระหว่างการเรียนรู้แบบมีผู้สอนและไม่มีผู้สอนคืออะไร? และ 15% ของ 80 คือเท่าไร?&quot;)
print(result)</p>

ตัวแทนแสดงให้เห็นถึงข้อได้เปรียบที่สำคัญของตัวแทน LLM: สามารถรวมเครื่องมือและขั้นตอนการให้เหตุผลเพื่อตอบคำถามที่ซับซ้อน

การปรับปรุงตัวแทนโดยใช้เทคนิค RAG ที่ทันสมัย

ในขณะที่ระบบ RAG ของเรามีประสิทธิภาพ แต่ก็มีเทคนิคที่ทันสมัยหลายอย่างที่เราสามารถใช้เพื่อปรับปรุงมัน:

a) การค้นหาที่มีความหมายโดยใช้ Dense Passage Retrieval (DPR)

แทนที่จะใช้การค้นหาที่อาศัยการฝังตัวแบบง่ายๆ เราสามารถใช้ DPR เพื่อค้นหาที่มีความแม่นยำมากขึ้น:


<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p>

<p>question_encoder = DPRQuestionEncoder.from_pretrained(&quot;facebook/dpr-question_encoder-single-nq-base&quot;)
context_encoder = DPRContextEncoder.from_pretrained(&quot;facebook/dpr-ctx_encoder-single-nq-base&quot;)</p>

<p># ฟังก์ชันในการฝังตัวผ่าน
def encode_passages(passages):
return context_encoder(passages, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

<p># ฟังก์ชันในการฝังตัวคำถาม
def encode_query(query):
return question_encoder(query, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

b) การขยายคำถาม

เราสามารถใช้การขยายคำถามเพื่อปรับปรุงประสิทธิภาพการค้นหา:


<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>

<p>model = T5ForConditionalGeneration.from_pretrained(&quot;t5-small&quot;)
tokenizer = T5Tokenizer.from_pretrained(&quot;t5-small&quot;)</p>

<p>def expand_query(query):
input_text = f&quot;ขยายคำถาม: {query}&quot;
input_ids = tokenizer.encode(input_text, return_tensors=&quot;pt&quot;)
outputs = model.generate(input_ids, max_length=50, num_return_sequences=3)
expanded_queries = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs]
return expanded_queries</p>

c) การปรับปรุงแบบก้าวหน้า

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


<p>def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f&quot;ตามผลลัพธ์นี้: &#039;{result}&#039; คำถามที่ควรถามเพื่อให้ได้ข้อมูลที่เฉพาะเจาะจงกว่านี้คืออะไร?&quot;)
if clarification.lower().strip() == &quot;ไม่มี&quot;:
break
query = clarification
return result</p>

# ใช้สิ่งนี้ในกระบวนการของตัวแทน

การนำระบบหลายตัวแทนมาใช้

เพื่อจัดการกับงานที่ซับซ้อนมากขึ้น เราสามารถนำระบบหลายตัวแทนมาใช้ โดยที่ตัวแทนแต่ละตัวเชี่ยวชาญในด้านที่แตกต่างกัน มาทำตัวอย่างง่ายๆ กัน:


<p>class SpecialistAgent:
def __init__(self, name, tools):
self.name = name
self.agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

<p>def run(self, query):
return self.agent.run(query)</p>

<p># สร้างตัวแทนผู้เชี่ยวชาญ
research_agent = SpecialistAgent(&quot;การวิจัย&quot;, [Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;สำหรับคำถามเกี่ยวกับ AI และการเรียนรู้ของเครื่อง&quot;)])
math_agent = SpecialistAgent(&quot;คณิตศาสตร์&quot;, [Tool(name=&quot;Calculator&quot;, func=calculator._run, description=&quot;สำหรับการคำนวณพื้นฐาน&quot;)])
general_agent = SpecialistAgent(&quot;ทั่วไป&quot;, [Tool(name=&quot;ค้นหา&quot;, func=search.run, description=&quot;สำหรับคำถามทั่วไป&quot;)])</p>

<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>

<p>def run(self, query):
# ระบุตัวแทนให้ใช้
if &quot;คำนวณ&quot; in query.lower() or any(op in query for op in [&#039;+&#039;, &#039;-&#039;, &#039;*&#039;, &#039;/&#039;]):
return self.agents[&#039;คณิตศาสตร์&#039;].run(query)
elif any(term in query.lower() for term in [&#039;ai&#039;, &#039;การเรียนรู้ของเครื่อง&#039;, &#039;การเรียนรู้ลึก&#039;]):
return self.agents[&#039;การวิจัย&#039;].run(query)
else:
return self.agents[&#039;ทั่วไป&#039;].run(query)</p>

<p>coordinator = Coordinator({&#039;การวิจัย&#039;: research_agent, &#039;คณิตศาสตร์&#039;: math_agent, &#039;ทั่วไป&#039;: general_agent})</p>

<p># ทดสอบระบบหลายตัวแทน
result = coordinator.run(&quot;ความแตกต่างระหว่าง CNN และ RNN คืออะไร? และคำนวณ 25% ของ 120&quot;)
print(result)</p>

ระบบหลายตัวแทนช่วยให้สามารถเชี่ยวชาญและจัดการกับช่วงคำถามที่กว้างขึ้นได้อย่างมีประสิทธิภาพ

การประเมินและปรับปรุงตัวแทน RAG

เพื่อให้แน่ใจว่าตัวแทน RAG ของเรามีประสิทธิภาพ เราต้องใช้มาตรการประเมินและเทคนิคการปรับปรุง:

a) การประเมินความเกี่ยวข้อง

เราสามารถใช้มาตรการเช่น BLEU, ROUGE หรือ BERTScore เพื่อประเมินความเกี่ยวข้องของเอกสารที่ค้นหา:


<p>from bert_score import score</p>

<p>def evaluate_relevance(query, retrieved_doc, generated_answer):
P, R, F1 = score([generated_answer], [retrieved_doc], lang=&quot;en&quot;)
return F1.mean().item()</p>

b) การประเมินคุณภาพคำตอบ

เราสามารถใช้การประเมินของมนุษย์หรือมาตรการอัตโนมัติเพื่อประเมินคุณภาพคำตอบ:


<p>from nltk.translate.bleu_score import sentence_bleu</p>

<p>def evaluate_answer_quality(reference_answer, generated_answer):
return sentence_bleu([reference_answer.split()], generated_answer.split())</p>

<p># ใช้สิ่งนี้เพื่อประเมินการตอบสนองของตัวแทน

ทิศทางและความท้าทายในอนาคต

เมื่อเรามองไปสู่อนาคตของตัวแทน RAG มีทิศทางและความท้าทายที่น่าสนใจหลายอย่าง:

a) RAG แบบหลายโหมด: การขยาย RAG เพื่อรวมข้อมูลภาพ เสียง และวิดีโอ

b) RAG แบบกระจาย: การใช้ RAG ในฐานความรู้ที่กระจายและรักษาความเป็นส่วนตัว

c) การเรียนรู้อย่างต่อเนื่อง: การพัฒนาวิธีการให้ตัวแทน RAG อัปเดตฐานความรู้และโมเดลของมัน

d) ข้อพิจารณาด้านจริยธรรม: การแก้ไขปัญหาความลำเอียง ความยุติธรรม และความโปร่งใสในระบบ RAG

e) ความสามารถในการปรับขนาด: การปรับปรุง RAG สำหรับการใช้งานในระดับใหญ่และแบบเรียลไทม์

สรุป

การสร้างตัวแทน LLM สำหรับ RAG จากศูนย์เป็นกระบวนการที่ซับซ้อนแต่น่าพึงพอใจ เราได้ครอบคลุมพื้นฐานของ RAG การใช้งาน การสร้างตัวแทน LLM การปรับปรุงด้วยเทคนิคที่ทันสมัย การใช้ระบบหลายตัวแทน และกลยุทธ์ในการประเมินและปรับปรุง

ฉันใช้เวลาที่ผ่านมา 5 ปีในการศึกษาสิ่งที่น่าสนใจเกี่ยวกับ Machine Learning และ Deep Learning ความเชี่ยวชาญและความหลงใหลของฉันทำให้ฉันเข้าร่วมในโครงการพัฒนาซอฟต์แวร์มากกว่า 50 โครงการที่มีความหลากหลาย โดยมุ่งเน้นไปที่ AI/ML ความอยากรู้อยากเห็นของฉันยังทำให้ฉันสนใจในด้าน Natural Language Processing ซึ่งเป็นสาขาที่ฉันต้องการสำรวจต่อไป