AGI และ AI แห่งอนาคต
สร้างตัวแทน LLM สำหรับ RAG จากศูนย์และอื่น ๆ : คู่มือที่ครอบคลุม
โมเดล LLM เช่น GPT-3, GPT-4 และคู่ที่เป็นโอเพ่นซอร์สของพวกเขามักจะดิ้นรนในการค้นหาข้อมูลที่ทันสมัยและบางครั้งสร้างข้อมูลที่ไม่ถูกต้องหรือ “hallucinations”
การสร้างแบบจำลองที่ช่วยในการค้นหาข้อมูล (Retrieval-Augmented Generation, RAG) เป็นเทคนิคที่รวมพลังของ LLM ด้วยการค้นหาข้อมูลจากภายนอก RAG ช่วยให้เราสามารถสร้างข้อความที่มีประสิทธิภาพและเชื่อถือได้โดยการค้นหาข้อมูลที่ถูกต้องและทันสมัย
ในบทความนี้ เราจะสำรวจวิธีการสร้างตัวแทน LLM สำหรับ RAG จากศูนย์ โดยการดูรายละเอียดเกี่ยวกับโครงสร้าง การใช้งาน และเทคนิคที่ทันสมัย เราจะครอบคลุมทุกอย่างตั้งแต่พื้นฐานของ RAG ไปจนถึงการสร้างตัวแทน LLM ที่ซับซ้อนซึ่งสามารถทำการให้เหตุผลและดำเนินการได้
ก่อนที่เราจะเริ่มสร้างตัวแทน LLM ของเรา มาทำความเข้าใจกันก่อนว่า RAG คืออะไรและทำไมมันจึงสำคัญ
RAG หรือ Retrieval-Augmented Generation เป็นแนวทางแบบผสมที่รวมการค้นหาข้อมูลเข้ากับการสร้างข้อความ ในระบบ RAG:
- คำถามจะถูกใช้ในการค้นหาข้อมูลที่เกี่ยวข้องจากฐานข้อมูลความรู้
- ข้อมูลเหล่านั้นจะถูกส่งเข้าไปในโมเดลภาษาพร้อมกับคำถามเดิม
- โมเดลจะสร้างข้อความตอบกลับโดยอาศัยคำถามและข้อมูลที่ค้นหา
แนวทางนี้มีประโยชน์หลายประการ:
- ความแม่นยำที่ดีขึ้น: โดยการสร้างข้อความที่อ้างอิงจากข้อมูลที่ค้นหา RAG ลดการ “hallucinations” และปรับปรุงความถูกต้องของข้อเท็จจริง
- ข้อมูลที่ทันสมัย: ฐานข้อมูลความรู้สามารถอัปเดตได้บ่อยๆ ทำให้ระบบสามารถเข้าถึงข้อมูลที่ทันสมัย
- ความโปร่งใส: ระบบสามารถให้แหล่งข้อมูลสำหรับข้อมูลของมัน ทำให้สามารถตรวจสอบข้อเท็จจริงได้
การทำความเข้าใจตัวแทน LLM
เมื่อคุณเผชิญกับปัญหาที่ไม่มีคำตอบง่ายๆ คุณมักจะต้องทำตามขั้นตอนหลายขั้นตอน คิดอย่างรอบคอบ และจดจำสิ่งที่คุณได้ลองแล้ว ตัวแทน LLM ได้รับการออกแบบมาเพื่อใช้ในสถานการณ์เหล่านี้โดยเฉพาะในแอปพลิเคชันของโมเดลภาษา พวกเขารวมการวิเคราะห์ข้อมูลอย่างละเอียด การวางแผนเชิงกลยุทธ์ การค้นหาข้อมูล และความสามารถในการเรียนรู้จากการกระทำในอดีตเพื่อแก้ปัญหาที่ซับซ้อน
ตัวแทน LLM คืออะไร?
ตัวแทน LLM เป็นระบบ AI ที่ซับซ้อนซึ่งได้รับการออกแบบมาเพื่อสร้างข้อความที่ซับซ้อนซึ่งต้องการการให้เหตุผลแบบลำดับ พวกเขาสามารถคิดล่วงหน้า จดจำการสนทนาที่ผ่านมา และใช้เครื่องมือต่างๆ เพื่อปรับเปลี่ยนการตอบสนองตามสถานการณ์และรูปแบบที่ต้องการ
พิจารณาคำถามในด้านกฎหมาย เช่น “ผลทางกฎหมายที่อาจเกิดขึ้นจากการละเมิดสัญญาแบบใดแบบหนึ่งในแคลิฟอร์เนียคืออะไร?” โมเดล LLM พื้นฐานพร้อมระบบ RAG สามารถค้นหาข้อมูลที่จำเป็นจากฐานข้อมูลกฎหมาย
สำหรับสถานการณ์ที่ซับซ้อนกว่านี้: “เมื่อพิจารณากฎหมายความเป็นส่วนตัวใหม่ อุปสรรคทางกฎหมายทั่วไปที่บริษัทต่างๆ เผชิญ และศาลตอบสนองต่อประเด็นเหล่านี้อย่างไร?” คำถามนี้ลึกกว่าการค้นหาข้อเท็จจริงเพียงอย่างเดียว มันเกี่ยวกับการทำความเข้าใจกฎใหม่ ผลกระทบต่อบริษัทต่างๆ และการตอบสนองของศาล ตัวแทน LLM จะแบ่งงานนี้ออกเป็นงานย่อย เช่น การค้นหากฎหมายล่าสุด การวิเคราะห์กรณีทางประวัติศาสตร์ การสรุปเอกสารทางกฎหมาย และการคาดการณ์แนวโน้มตามรูปแบบ
ส่วนประกอบของตัวแทน LLM
ตัวแทน LLM โดยทั่วไปประกอบด้วยส่วนประกอบ 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["OPENAI_API_KEY"] = "your-api-key-here"</p>
การสร้างระบบ RAG ที่เรียบง่าย
ตอนนี้เรามีสภาพแวดล้อมพร้อมแล้ว มาทำระบบ RAG พื้นฐานกัน เราจะเริ่มต้นด้วยการสร้างฐานความรู้จากชุดเอกสาร จากนั้นใช้ฐานความรู้นี้เพื่อตอบคำถาม
ขั้นตอนที่ 1: เตรียมเอกสาร
ก่อนอื่นเราต้องโหลดและเตรียมเอกสารของเรา ในตัวอย่างนี้ สมมติว่าเรามีไฟล์ข้อความชื่อ knowledge_base.txt ที่มีข้อมูลบางอย่างเกี่ยวกับ AI และการเรียนรู้ของเครื่อง
<p># โหลดเอกสาร loader = TextLoader("knowledge_base.txt") 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="stuff", retriever=vectorstore.as_retriever())</p>
ขั้นตอนที่ 3: สอบถามระบบ
เราสามารถสอบถามระบบ RAG ของเราได้แล้ว:
<p>query = "การประยุกต์ใช้หลักการของการเรียนรู้ของเครื่องมีอะไรบ้าง?" 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 = "Calculator" description = "สำหรับคำถามทางคณิตศาสตร์"</p> <p>def _run(self, query: str) try: return str(eval(query)) except: return "ไม่สามารถคำนวณได้ โปรดตรวจสอบว่าข้อมูลของคุณถูกต้อง"</p> <p># สร้างตัวแทนเครื่องมือ search = DuckDuckGoSearchRun() calculator = CalculatorTool()</p> <p># นิยามเครื่องมือ tools = [Tool(name="ค้นหา",func=search.run,description="สำหรับคำถามทั่วไป"), Tool(name="RAG-QA",func=qa.run,description="สำหรับคำถามเกี่ยวกับ AI และการเรียนรู้ของเครื่อง"), Tool(name="Calculator",func=calculator._run,description="สำหรับการคำนวณพื้นฐาน") ]</p> <p># นิยามตัวแทน agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )</p>
ตอนนี้เรามีตัวแทนซึ่งสามารถใช้ระบบ RAG ของเรา ค้นหาทางอินเทอร์เน็ต และคำนวณพื้นฐานได้ มาทดสอบมัน:
<p>result = agent.run("ความแตกต่างระหว่างการเรียนรู้แบบมีผู้สอนและไม่มีผู้สอนคืออะไร? และ 15% ของ 80 คือเท่าไร?") 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("facebook/dpr-question_encoder-single-nq-base") context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")</p> <p># ฟังก์ชันในการฝังตัวผ่าน def encode_passages(passages): return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output</p> <p># ฟังก์ชันในการฝังตัวคำถาม def encode_query(query): return question_encoder(query, max_length=512, return_tensors="pt").pooler_output</p>
b) การขยายคำถาม
เราสามารถใช้การขยายคำถามเพื่อปรับปรุงประสิทธิภาพการค้นหา:
<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>
<p>model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")</p>
<p>def expand_query(query):
input_text = f"ขยายคำถาม: {query}"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
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"ตามผลลัพธ์นี้: '{result}' คำถามที่ควรถามเพื่อให้ได้ข้อมูลที่เฉพาะเจาะจงกว่านี้คืออะไร?")
if clarification.lower().strip() == "ไม่มี":
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("การวิจัย", [Tool(name="RAG-QA", func=qa.run, description="สำหรับคำถามเกี่ยวกับ AI และการเรียนรู้ของเครื่อง")])
math_agent = SpecialistAgent("คณิตศาสตร์", [Tool(name="Calculator", func=calculator._run, description="สำหรับการคำนวณพื้นฐาน")])
general_agent = SpecialistAgent("ทั่วไป", [Tool(name="ค้นหา", func=search.run, description="สำหรับคำถามทั่วไป")])</p>
<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>
<p>def run(self, query):
# ระบุตัวแทนให้ใช้
if "คำนวณ" in query.lower() or any(op in query for op in ['+', '-', '*', '/']):
return self.agents['คณิตศาสตร์'].run(query)
elif any(term in query.lower() for term in ['ai', 'การเรียนรู้ของเครื่อง', 'การเรียนรู้ลึก']):
return self.agents['การวิจัย'].run(query)
else:
return self.agents['ทั่วไป'].run(query)</p>
<p>coordinator = Coordinator({'การวิจัย': research_agent, 'คณิตศาสตร์': math_agent, 'ทั่วไป': general_agent})</p>
<p># ทดสอบระบบหลายตัวแทน
result = coordinator.run("ความแตกต่างระหว่าง CNN และ RNN คืออะไร? และคำนวณ 25% ของ 120")
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="en") 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 การปรับปรุงด้วยเทคนิคที่ทันสมัย การใช้ระบบหลายตัวแทน และกลยุทธ์ในการประเมินและปรับปรุง














