Skip to content

Latest commit

 

History

History
272 lines (164 loc) · 29.3 KB

File metadata and controls

272 lines (164 loc) · 29.3 KB

Retrieval Augmented Generation (RAG) และฐานข้อมูลเวกเตอร์

Retrieval Augmented Generation (RAG) and Vector Databases

ในบทเรียนแอปพลิเคชันการค้นหา เราได้เรียนรู้คร่าวๆ เกี่ยวกับวิธีการรวมข้อมูลของคุณเข้ากับโมเดลภาษาขนาดใหญ่ (LLMs) ในบทเรียนนี้ เราจะเจาะลึกมากขึ้นในแนวคิดของการวางรากฐานข้อมูลของคุณในแอปพลิเคชัน LLM ของคุณ กลไกของกระบวนการ และวิธีการจัดเก็บข้อมูล รวมถึงทั้ง embeddings และข้อความ

วีดีโอกำลังจะมาเร็วๆ นี้

บทนำ

ในบทเรียนนี้เราจะครอบคลุมเนื้อหาดังต่อไปนี้:

  • แนะนำเกี่ยวกับ RAG คืออะไร และทำไมจึงถูกใช้ใน AI (ปัญญาประดิษฐ์)

  • ทำความเข้าใจฐานข้อมูลเวกเตอร์และการสร้างฐานข้อมูลสำหรับแอปพลิเคชันของเรา

  • ตัวอย่างปฏิบัติว่าทำอย่างไรจึงจะรวม RAG เข้ากับแอปพลิเคชัน

เป้าหมายการเรียนรู้

หลังจากเรียนจบบทเรียนนี้ คุณจะสามารถ:

  • อธิบายความสำคัญของ RAG ในการดึงข้อมูลและประมวลผลข้อมูล

  • ตั้งค่าแอปพลิเคชัน RAG และวางรากฐานข้อมูลของคุณกับ LLM

  • การผสมผสาน RAG และฐานข้อมูลเวกเตอร์อย่างมีประสิทธิภาพในแอปพลิเคชัน LLM

กรณีของเรา: การเสริม LLM ของเราด้วยข้อมูลของเราเอง

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

  • Azure OpenAI: LLM ที่เราจะใช้สร้างแชทบอทของเรา

  • บทเรียน AI for beginners เรื่อง Neural Networks: นี่จะเป็นข้อมูลที่เราวางรากฐาน LLM ของเรา

  • Azure AI Search และ Azure Cosmos DB: ฐานข้อมูลเวกเตอร์เพื่อเก็บข้อมูลและสร้างดัชนีการค้นหา

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

Retrieval Augmented Generation (RAG)

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

วิธีการทำงานของ RAG (Retrieval Augmented Generation)

drawing showing how RAGs work

สมมติว่าคุณต้องการเผยแพร่แชทบอทที่สร้างแบบทดสอบจากบันทึกของคุณ คุณจะต้องมีการเชื่อมต่อกับฐานความรู้ ซึ่งนี่คือที่ที่ RAG เข้ามาช่วยทำงาน RAG ทำงานดังนี้:

  • ฐานความรู้: ก่อนการค้นคืนเอกสารเหล่านี้ต้องได้รับการนำเข้าและประมวลผลล่วงหน้า โดยปกติจะแบ่งเอกสารขนาดใหญ่เป็นชิ้นเล็กลง เปลี่ยนเป็น embeddings ของข้อความ และเก็บไว้ในฐานข้อมูล

  • คำถามผู้ใช้: ผู้ใช้ถามคำถาม

  • การค้นคืน: เมื่อผู้ใช้ถามคำถาม โมเดล embedding จะดึงข้อมูลที่เกี่ยวข้องจากฐานความรู้เพื่อให้บริบทมากขึ้น เพื่อนำมาใช้ใน prompt

  • การสร้างคำตอบเสริม: LLM ปรับปรุงคำตอบตามข้อมูลที่ดึงมา นี้ช่วยให้คำตอบที่สร้างขึ้นไม่เพียงแต่ขึ้นอยู่กับข้อมูลที่ฝึกมาเท่านั้น แต่ยังรวมถึงข้อมูลที่ดึงมาจากบริบทที่เพิ่มเข้ามา ข้อมูลที่ดึงมาจะใช้เสริมคำตอบของ LLM แล้ว LLM จะตอบคำถามผู้ใช้

drawing showing how RAGs architecture

สถาปัตยกรรมของ RAG ถูกสร้างโดยใช้ transformers ประกอบด้วยสองส่วน คือ encoder และ decoder ตัวอย่างเช่น เมื่อผู้ใช้ถามคำถาม ข้อความอินพุตจะถูก 'เข้ารหัส' เป็นเวกเตอร์ที่จับความหมายของคำ และเวกเตอร์เหล่านั้นจะถูก 'ถอดรหัส' เข้าสู่ดัชนีเอกสารของเรา และสร้างข้อความใหม่ตามคำถามของผู้ใช้ LLM ใช้โมเดล encoder-decoder ทั้งสองเพื่อสร้างผลลัพธ์

มีสองวิธีในการใช้ RAG ตามบทความที่เสนอ: Retrieval-Augmented Generation for Knowledge intensive NLP (natural language processing software) Tasks:

  • RAG-Sequence ใช้เอกสารที่ดึงมาเพื่อทำนายคำตอบที่ดีที่สุดสำหรับคำถามผู้ใช้

  • RAG-Token ใช้เอกสารเพื่อสร้างโทเค็นถัดไป จากนั้นดึงข้อมูลเอกสารเพื่อใช้ตอบคำถามผู้ใช้

ทำไมจึงควรใช้ RAG?

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

  • ลดการสร้างข้อมูลเท็จโดยใช้ ข้อมูลที่ตรวจสอบได้ ในฐานความรู้เพื่อให้บริบทแก่คำถามของผู้ใช้

  • มี ความคุ้มค่า เนื่องจากมีราคาที่ถูกกว่าการปรับแต่งโมเดล LLM

การสร้างฐานความรู้

แอปพลิเคชันของเราอิงข้อมูลส่วนตัวของเรา เช่น บทเรียน Neural Network ในหลักสูตร AI For Beginners

ฐานข้อมูลเวกเตอร์

ฐานข้อมูลเวกเตอร์ แตกต่างจากฐานข้อมูลแบบดั้งเดิม เป็นฐานข้อมูลเฉพาะทางออกแบบมาเพื่อเก็บ จัดการ และค้นหา embeddings ของเวกเตอร์ มันเก็บการแทนค่าตัวเลขของเอกสาร การแบ่งข้อมูลเป็น embeddings ตัวเลขทำให้ระบบ AI ของเราเข้าใจและประมวลผลข้อมูลได้ง่ายขึ้น

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

ฐานข้อมูลเวกเตอร์ยอดนิยมได้แก่ Azure Cosmos DB, Clarifyai, Pinecone, Chromadb, ScaNN, Qdrant และ DeepLake คุณสามารถสร้างโมเดล Azure Cosmos DB ได้โดยใช้ Azure CLI ด้วยคำสั่งดังนี้:

az login
az group create -n <resource-group-name> -l <location>
az cosmosdb create -n <cosmos-db-name> -r <resource-group-name>
az cosmosdb list-keys -n <cosmos-db-name> -g <resource-group-name>

จากข้อความเป็น embeddings

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

def split_text(text, max_length, min_length):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(' '.join(current_chunk)) < max_length and len(' '.join(current_chunk)) > min_length:
            chunks.append(' '.join(current_chunk))
            current_chunk = []

    # หากส่วนสุดท้ายไม่ได้ถึงความยาวขั้นต่ำ ให้เพิ่มมันเข้าไปเช่นกัน
    if current_chunk:
        chunks.append(' '.join(current_chunk))

    return chunks

เมื่อแบ่งชิ้นเสร็จแล้ว เราสามารถฝังข้อความโดยใช้โมเดล embedding ต่างๆ โมเดลที่ใช้ได้รวมถึง: word2vec, ada-002 โดย OpenAI, Azure Computer Vision และอื่นๆ การเลือกโมเดลใช้ขึ้นอยู่กับภาษาที่ใช้ ประเภทเนื้อหาที่เข้ารหัส (ข้อความ/ภาพ/เสียง) ขนาดของอินพุตที่สามารถเข้ารหัสได้ และความยาวของผลลัพธ์ embedding

ตัวอย่าง embedding ข้อความโดยใช้โมเดล text-embedding-ada-002 ของ OpenAI คือ: an embedding of the word cat

การค้นคืนและการค้นหาเวกเตอร์

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

การค้นคืน

การค้นคืนเกิดขึ้นเมื่อระบบพยายามค้นหาเอกสารจากดัชนีอย่างรวดเร็วโดยตรงตามเกณฑ์การค้นหา เป้าหมายของ retriever คือการดึงเอกสารที่ใช้ให้บริบทและวางรากฐาน LLM บนข้อมูลของคุณ

มีหลายวิธีในการค้นหาภายในฐานข้อมูล เช่น:

  • การค้นหาด้วยคีย์เวิร์ด - ใช้สำหรับค้นหาข้อความ

  • การค้นหาเวกเตอร์ - แปลงเอกสารจากข้อความเป็นเวกเตอร์โดยใช้โมเดล embedding ทำให้สามารถค้นหาเชิงความหมาย (semantic search) โดยใช้ความหมายของคำ การค้นคืนจะทำโดยการสอบถามเอกสารที่เวกเตอร์ใกล้เคียงคำถามผู้ใช้ที่สุด

  • แบบผสมผสาน - รวมทั้งการค้นหาคีย์เวิร์ดและเวกเตอร์

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

ความเหมือนเวกเตอร์

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

นอกจากนี้ เรายังสามารถวัดความเหมือนโดยใช้วิธีอื่นๆ เช่น Euclidean distance ซึ่งเป็นเส้นตรงระหว่างปลายเวกเตอร์สองจุด และ dot product ซึ่งวัดผลรวมของผลคูณขององค์ประกอบที่ตรงกันของเวกเตอร์สองตัว

ดัชนีการค้นหา

เมื่อทำการค้นคืน เราต้องสร้างดัชนีการค้นหาสำหรับฐานความเห็นของเราก่อนที่จะทำการค้นหา ดัชนีจะเก็บ embeddings ของเราและสามารถดึงชิ้นข้อมูลที่คล้ายที่สุดได้อย่างรวดเร็วแม้ในฐานข้อมูลขนาดใหญ่ เราสามารถสร้างดัชนีนี้ในเครื่องโดยใช้คำสั่งนี้:

from sklearn.neighbors import NearestNeighbors

embeddings = flattened_df['embeddings'].to_list()

# สร้างดัชนีการค้นหา
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)

# ในการสืบค้นดัชนี คุณสามารถใช้วิธี kneighbors ได้
distances, indices = nbrs.kneighbors(embeddings)

การเรียงอันดับใหม่ (Re-ranking)

เมื่อคุณสอบถามฐานข้อมูลแล้ว อาจต้องจัดเรียงผลลัพธ์จากความเกี่ยวข้องมากที่สุด LLM สำหรับการเรียงอันดับใหม่จะใช้ Machine Learning เพื่อปรับปรุงความเกี่ยวข้องของผลการค้นหาโดยจัดลำดับจากความเกี่ยวข้องมากไปน้อย ด้วย Azure AI Search การเรียงอันดับใหม่ทำโดยอัตโนมัติผ่าน semantic reranker ตัวอย่างการทำงานของการเรียงอันดับใหม่โดยใช้เพื่อนบ้านที่ใกล้ที่สุด:

# ค้นหาเอกสารที่เหมือนกันมากที่สุด
distances, indices = nbrs.kneighbors([query_vector])

index = []
# พิมพ์เอกสารที่เหมือนกันมากที่สุด
for i in range(3):
    index = indices[0][i]
    for index in indices[0]:
        print(flattened_df['chunks'].iloc[index])
        print(flattened_df['path'].iloc[index])
        print(flattened_df['distances'].iloc[index])
    else:
        print(f"Index {index} not found in DataFrame")

นำทุกอย่างมารวมกัน

ขั้นตอนสุดท้ายคือเพิ่ม LLM ของเราเข้าไปเพื่อให้ได้คำตอบที่วางรากฐานบนข้อมูลของเรา เราสามารถดำเนินการได้ดังนี้:

user_input = "what is a perceptron?"

def chatbot(user_input):
    # แปลงคำถามเป็นเวกเตอร์คำค้น
    query_vector = create_embeddings(user_input)

    # ค้นหาเอกสารที่เหมือนกันมากที่สุด
    distances, indices = nbrs.kneighbors([query_vector])

    # เพิ่มเอกสารลงในคำค้นเพื่อให้บริบท
    history = []
    for index in indices[0]:
        history.append(flattened_df['chunks'].iloc[index])

    # รวมประวัติและข้อมูลที่ผู้ใช้ป้อน
    history.append(user_input)

    # สร้างอ็อบเจ็กต์ข้อความ
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps with AI questions."},
        {"role": "user", "content": "\n\n".join(history) }
    ]

    # ใช้การเติมข้อความแชทเพื่อสร้างการตอบกลับ
    response = openai.chat.completions.create(
        model="gpt-4",
        temperature=0.7,
        max_tokens=800,
        messages=messages
    )

    return response.choices[0].message

chatbot(user_input)

การประเมินแอปพลิเคชันของเรา

ตัวชี้วัดการประเมิน

  • คุณภาพของคำตอบที่ได้รับให้แน่ใจว่าเสียงดูเป็นธรรมชาติ คล่องแคล่ว และเหมือนมนุษย์

  • การวางรากฐานของข้อมูล: ประเมินว่าคำตอบมาจากเอกสารที่ให้มาหรือไม่

  • ความเกี่ยวข้อง: ประเมินว่าคำตอบตรงกับคำถามและเกี่ยวข้องกับคำถามที่ถามหรือไม่

  • ความคล่องแคล่ว – ว่าคำตอบสมเหตุสมผลตามหลักไวยากรณ์หรือไม่

กรณีใช้งานสำหรับ RAG (Retrieval Augmented Generation) และฐานข้อมูลเวกเตอร์

มีกรณีใช้งานหลากหลายที่การเรียกใช้ฟังก์ชันสามารถปรับปรุงแอปของคุณได้ เช่น:

  • การถามตอบ: วางรากฐานข้อมูลบริษัทของคุณลงในแชทที่พนักงานสามารถใช้ถามคำถามได้

  • ระบบแนะนำ: สร้างระบบที่จับคู่ค่าที่เหมือนกันมากที่สุด เช่น ภาพยนตร์ ร้านอาหาร และอื่นๆ

  • บริการแชทบอท: คุณสามารถเก็บประวัติการแชทและปรับแต่งการสนทนาตามข้อมูลผู้ใช้

  • การค้นหาภาพโดยใช้ embeddings เวกเตอร์ ซึ่งมีประโยชน์สำหรับการจดจำภาพและการตรวจจับความผิดปกติ

สรุป

เราได้ครอบคลุมพื้นฐานของ RAG ตั้งแต่การเพิ่มข้อมูลของเราลงในแอปพลิเคชัน คำถามของผู้ใช้ และผลลัพธ์ เพื่อให้ง่ายต่อการสร้าง RAG คุณสามารถใช้เฟรมเวิร์ก เช่น Semanti Kernel, Langchain หรือ Autogen

แบบฝึกหัด

เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ Retrieval Augmented Generation (RAG) คุณสามารถสร้าง:

  • สร้างส่วนหน้าแอปพลิเคชันโดยใช้เฟรมเวิร์กที่คุณเลือก

  • ใช้เฟรมเวิร์ก เช่น LangChain หรือ Semantic Kernel และสร้างแอปพลิเคชันของคุณใหม่

ขอแสดงความยินดีที่เรียนจบบทเรียนนี้ 👏

การเรียนรู้ไม่มีวันหยุด ดำเนินการเรียนรู้ต่อไป

หลังจากเรียนจบบทเรียนนี้ แนะนำให้ดู คอลเลกชันการเรียนรู้ Generative AI ของเราเพื่อพัฒนาความรู้ด้าน Generative AI ของคุณต่อไป!


ข้อจำกัดความรับผิดชอบ: เอกสารฉบับนี้ได้รับการแปลโดยใช้บริการแปลภาษาอัตโนมัติ Co-op Translator แม้เราจะพยายามทำให้ถูกต้องแม่นยำที่สุดแล้ว แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้องได้ เอกสารต้นฉบับในภาษาดั้งเดิมถือเป็นแหล่งข้อมูลที่ถูกต้องและเชื่อถือได้ สำหรับข้อมูลสำคัญแนะนำให้ใช้การแปลโดยผู้เชี่ยวชาญด้านภาษาเท่านั้น เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่อาจเกิดขึ้นจากการใช้การแปลนี้