Legal Eagles in the Cloud: Hacking the Court System (Legally) with Google

1. บทนำ

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

Better Call Eagle

วันนี้เราจะมาเจาะลึกวิธีใช้เครื่องมือ AI อันทรงพลังของ Google เช่น Vertex AI, Firestore และฟังก์ชัน Cloud Run เพื่อประมวลผลและทำความเข้าใจข้อมูลทางกฎหมาย ทำการค้นหาที่รวดเร็วทันใจ และอาจช่วยลูกค้าในจินตนาการ (หรือตัวคุณเอง) ให้พ้นจากสถานการณ์ที่ยากลำบาก

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

2. สถาปัตยกรรม

โปรเจ็กต์นี้มุ่งเน้นการสร้างผู้ช่วยด้านกฎหมายโดยใช้เครื่องมือ AI ของ Google Cloud โดยเน้นวิธีประมวลผล ทำความเข้าใจ และค้นหาข้อมูลทางกฎหมาย ระบบได้รับการออกแบบมาเพื่อกรองข้อมูลจำนวนมาก สร้างข้อมูลสรุป และนำเสนอข้อมูลที่เกี่ยวข้องอย่างรวดเร็ว สถาปัตยกรรมของผู้ช่วยด้านกฎหมายประกอบด้วยองค์ประกอบสำคัญหลายอย่าง ดังนี้

การสร้างฐานความรู้จากข้อมูลที่ไม่มีโครงสร้าง: ใช้ Google Cloud Storage (GCS) เพื่อจัดเก็บเอกสารทางกฎหมาย Firestore ซึ่งเป็นฐานข้อมูล NoSQL จะทําหน้าที่เป็นที่เก็บเวกเตอร์ โดยจัดเก็บกลุ่มเอกสารและการฝังที่เกี่ยวข้อง ระบบเปิดใช้การค้นหาเวกเตอร์ใน Firestore เพื่ออนุญาตการค้นหาความคล้ายคลึง เมื่อมีการอัปโหลดเอกสารทางกฎหมายใหม่ไปยัง GCS แล้ว Eventarc จะทริกเกอร์ฟังก์ชัน Cloud Run ฟังก์ชันนี้จะประมวลผลเอกสารโดยการแยกเอกสารออกเป็นก้อนๆ และสร้างการฝังสำหรับแต่ละก้อนโดยใช้โมเดลการฝังข้อความของ Vertex AI จากนั้นระบบจะจัดเก็บการฝังเหล่านี้ไว้ใน Firestore พร้อมกับข้อความกระบวนการข้อมูล

แอปพลิเคชันที่ขับเคลื่อนโดย LLM และ RAG : หัวใจสำคัญของระบบถามตอบคือask_llmฟังก์ชัน ซึ่งใช้ไลบรารี Langchain เพื่อโต้ตอบกับโมเดลภาษาขนาดใหญ่ Gemini ของ Vertex AI โดยจะสร้าง HumanMessage จากคำค้นหาของผู้ใช้ และรวม SystemMessage ที่สั่งให้ LLM ทำหน้าที่เป็นผู้ช่วยด้านกฎหมายที่มีประโยชน์ ระบบใช้แนวทางการสร้างการดึงข้อมูลที่เพิ่มประสิทธิภาพ (RAG) ซึ่งก่อนที่จะตอบคำค้นหา ระบบจะใช้ฟังก์ชัน search_resource เพื่อดึงบริบทที่เกี่ยวข้องจากที่เก็บเวกเตอร์ Firestore จากนั้นบริบทนี้จะรวมอยู่ใน SystemMessage เพื่อให้คำตอบของ LLM อิงตามข้อมูลทางกฎหมายที่ระบุการอนุมาน

โปรเจ็กต์นี้มีเป้าหมายที่จะหลีกเลี่ยง "การตีความอย่างสร้างสรรค์" ของ LLM โดยใช้ RAG ซึ่งจะดึงข้อมูลที่เกี่ยวข้องจากแหล่งข้อมูลทางกฎหมายที่เชื่อถือได้ก่อนที่จะสร้างคำตอบ ซึ่งจะช่วยให้ได้คำตอบที่แม่นยำและมีข้อมูลมากขึ้นโดยอิงตามข้อมูลทางกฎหมายจริง ระบบนี้สร้างขึ้นโดยใช้บริการต่างๆ ของ Google Cloud เช่น Google Cloud Shell, Vertex AI, Firestore, Cloud Run และ Eventarc

3. ก่อนเริ่มต้น

ใน Google Cloud Console ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่

เปิดใช้ Gemini Code Assist ใน Cloud Shell IDE

👉 ในคอนโซล Google Cloud ให้ไปที่เครื่องมือ Gemini Code Assist แล้วเปิดใช้ Gemini Code Assist โดยไม่มีค่าใช้จ่ายด้วยการยอมรับข้อกำหนดและเงื่อนไข

Code Assist

ข้ามการตั้งค่าสิทธิ์และออกจากหน้านี้

ทำงานใน Cloud Shell Editor

👉 คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของ Google Cloud Console (เป็นไอคอนรูปเทอร์มินัลที่ด้านบนของแผง Cloud Shell)

Cloud Shell

👉 คลิกปุ่ม "เปิดตัวแก้ไข" (ปุ่มนี้มีลักษณะเป็นโฟลเดอร์ที่เปิดอยู่พร้อมดินสอ) ซึ่งจะเป็นการเปิด Cloud Shell Editor ในหน้าต่าง คุณจะเห็น File Explorer ทางด้านซ้าย

เปิดเครื่องมือแก้ไข

👉 คลิกปุ่มลงชื่อเข้าใช้ Cloud Code ในแถบสถานะด้านล่างตามที่แสดง ให้สิทธิ์ปลั๊กอินตามวิธีการ หากเห็น Cloud Code - ไม่มีโปรเจ็กต์ในแถบสถานะ ให้เลือกโปรเจ็กต์นั้น จากนั้นเลือก "เลือกโปรเจ็กต์ Google Cloud" ในเมนูแบบเลื่อนลง แล้วเลือกโปรเจ็กต์ Google Cloud ที่ต้องการจากรายการโปรเจ็กต์ที่คุณวางแผนจะใช้

Cloud Code

👉 เปิดเทอร์มินัลใน Cloud IDE เทอร์มินัลใหม่

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

gcloud auth list

👉 คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud

gcloud config set project <YOUR_PROJECT_ID>

👉 เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดใช้ Google Cloud APIs ที่จำเป็น

gcloud services enable storage.googleapis.com  \
                        run.googleapis.com  \
                        artifactregistry.googleapis.com  \
                        aiplatform.googleapis.com \
                        eventarc.googleapis.com \
                        cloudresourcemanager.googleapis.com \
                        firestore.googleapis.com \
                        cloudaicompanion.googleapis.com

ในแถบเครื่องมือ Cloud Shell (ที่ด้านบนของบานหน้าต่าง Cloud Shell) ให้คลิกปุ่ม "เปิดตัวแก้ไข" (ปุ่มนี้มีลักษณะเป็นโฟลเดอร์ที่เปิดอยู่พร้อมดินสอ) ซึ่งจะเปิดตัวแก้ไขโค้ด Cloud Shell ในหน้าต่าง คุณจะเห็น File Explorer ทางด้านซ้าย

👉 ในเทอร์มินัล ให้ดาวน์โหลดโปรเจ็กต์โครงร่าง Bootstrap โดยทำดังนี้

git clone https://github.com/weimeilin79/legal-eagle.git

ไม่บังคับ: เวอร์ชันภาษาสเปน

👉 Existe una versión alternativa en español. Por favor, utilice la siguiente instrucción para clonar la versión correcta.

git clone -b spanish https://github.com/weimeilin79/legal-eagle.git

หลังจากเรียกใช้คำสั่งนี้ในเทอร์มินัล Cloud Shell แล้ว ระบบจะสร้างโฟลเดอร์ใหม่ที่มีชื่อที่เก็บ legal-eagle ในสภาพแวดล้อม Cloud Shell

4. การเขียนแอปพลิเคชันการอนุมานด้วย Gemini Code Assist

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

overview-01

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

ในแผง Explorer ของ Cloud Code Editor (มักจะอยู่ทางด้านซ้าย) คุณควรเห็นโฟลเดอร์ที่สร้างขึ้นเมื่อโคลนที่เก็บ Git legal-eagle เปิดโฟลเดอร์รูทของโปรเจ็กต์ใน Explorer คุณจะเห็นwebappโฟลเดอร์ย่อยภายใน ให้เปิดโฟลเดอร์นั้นด้วย Legal New

👉 แก้ไขไฟล์ legal.py ในโปรแกรมแก้ไข Cloud Code คุณสามารถใช้วิธีต่างๆ เพื่อแจ้ง Gemini Code Assist ได้

👉 คัดลอกพรอมต์ต่อไปนี้ไปที่ด้านล่างของ legal.py ที่อธิบายสิ่งที่คุณต้องการให้ Gemini Code Assist สร้างอย่างชัดเจน คลิกไอคอนหลอดไฟ 💡 ที่ปรากฏขึ้น แล้วเลือก Gemini: สร้างโค้ด (รายการเมนูที่แน่นอนอาจแตกต่างกันเล็กน้อยขึ้นอยู่กับเวอร์ชันของ Cloud Code)

"""
Write a Python function called `ask_llm` that takes a user `query` as input. This function should use the `langchain` library to interact with a Vertex AI Gemini Large Language Model.  Specifically, it should:
1.  Create a `HumanMessage` object from the user's `query`.
2.  Create a `ChatPromptTemplate` that includes a `SystemMessage` and the `HumanMessage`. The system message should instruct the LLM to act as a helpful assistant in a courtroom setting, aiding an attorney by providing necessary information. It should also specify that the LLM should respond in a high-energy tone, using no more than 100 words, and offer a humorous apology if it doesn't know the answer.  
3.  Format the `ChatPromptTemplate` with the provided messages.
4.  Invoke the Vertex AI LLM with the formatted prompt using the `VertexAI` class (assuming it's already initialized elsewhere as `llm`).
5.  Print the LLM's `response`.
6.  Return the `response`.
7.  Include error handling that prints an error message to the console and returns a user-friendly error message if any issues occur during the process.  The Vertex AI model should be "gemini-2.0-flash".
"""

สร้างรหัส

ตรวจสอบโค้ดที่สร้างขึ้นอย่างละเอียด

  • โดยประมาณแล้ววิดีโอทำตามขั้นตอนที่คุณระบุไว้ในความคิดเห็นหรือไม่
  • ระบบจะสร้าง ChatPromptTemplate ที่มี SystemMessage และ HumanMessage ไหม
  • มีฟีเจอร์การจัดการข้อผิดพลาดขั้นพื้นฐาน (try...except) ไหม

หากโค้ดที่สร้างขึ้นดีและถูกต้องเป็นส่วนใหญ่ คุณสามารถยอมรับโค้ดนั้นได้ (กด Tab หรือ Enter สำหรับคำแนะนำในบรรทัด หรือคลิก "ยอมรับ" สำหรับบล็อกโค้ดขนาดใหญ่)

หากโค้ดที่สร้างขึ้นไม่ตรงกับที่คุณต้องการหรือมีข้อผิดพลาด ไม่ต้องกังวล Gemini Code Assist เป็นเครื่องมือที่ช่วยคุณ ไม่ใช่เครื่องมือที่เขียนโค้ดได้อย่างสมบูรณ์แบบตั้งแต่ครั้งแรก

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

และหากคุณยังใหม่กับ SDK โปรดดูตัวอย่างการทำงานที่นี่

👉 คัดลอกและวางและแทนที่โค้ดต่อไปนี้ลงใน legal.py

import os
import signal
import sys
import vertexai
import random
from langchain_google_vertexai import VertexAI
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.messages import HumanMessage, SystemMessage
# Connect to resourse needed from Google Cloud
llm = VertexAI(model_name="gemini-2.0-flash")
def ask_llm(query):
    try:
        query_message = {
            "type": "text",
            "text": query,
        }

        input_msg = HumanMessage(content=[query_message])
        prompt_template = ChatPromptTemplate.from_messages(
            [
                SystemMessage(
                    content=(
                        "You are a helpful assistant, and you are with the attorney in a courtroom, you are helping him to win the case by providing the information he needs "
                        "Don't answer if you don't know the answer, just say sorry in a funny way possible"
                        "Use high engergy tone, don't use more than 100 words to answer"
                       # f"Here is some past conversation history between you and the user {relevant_history}"
                       # f"Here is some context that is relevant to the question {relevant_resource} that you might use"
                    )
                ),
                input_msg,
            ]
        )
        prompt = prompt_template.format()
        response = llm.invoke(prompt)
        print(f"response: {response}")
        return response
    except Exception as e:
        print(f"Error sending message to chatbot: {e}") # Log this error too!
        return f"Unable to process your request at this time. Due to the following reason: {str(e)}"

👉 ไม่บังคับ: เวอร์ชันภาษาสเปน

Sustituye el siguiente texto como se indica: You are a helpful assistant, to You are a helpful assistant that speaks Spanish,

จากนั้นสร้างฟังก์ชันเพื่อจัดการเส้นทางที่จะตอบคำถามของผู้ใช้

เปิด main.py ใน Cloud Shell Editor เช่นเดียวกับวิธีสร้าง ask_llm ใน legal.py ให้ใช้ Gemini Code Assist เพื่อสร้างฟังก์ชัน Flask Route และ ask_question พิมพ์ PROMPT ต่อไปนี้เป็นความคิดเห็นใน main.py: (ตรวจสอบว่าได้เพิ่ม ก่อนเริ่มแอป Flask ที่ if __name__ == "__main__":)

.....
@app.route('/',methods=['GET'])
def index():
    return render_template('index.html')
    

"""
PROMPT:
Create a Flask endpoint that accepts POST requests at the '/ask' route. 
The request should contain a JSON payload with a 'question' field. Extract the question from the JSON payload. 
Call a function named ask_llm (located in a file named legal.py) with the extracted question as an argument. 
Return the result of the ask_llm function as the response with a 200 status code. 
If any error occurs during the process, return a 500 status code with the error message.
"""

# Add this block to start the Flask app when running locally
if __name__ == "__main__":
.....

ยอมรับเฉพาะในกรณีที่โค้ดที่สร้างขึ้นดีและถูกต้องเป็นส่วนใหญ่ หากไม่คุ้นเคยกับ Python นี่คือตัวอย่างที่ใช้งานได้ ให้คัดลอกและวางลงใน main.py ใต้โค้ดที่มีอยู่แล้ว

👉 ตรวจสอบว่าคุณวางข้อความต่อไปนี้ก่อนเริ่มแอปพลิเคชันเว็บ (if name == "main":)

@app.route('/ask', methods=['POST'])
def ask_question():
    data = request.get_json()
    question = data.get('question')
    try:
        # call the ask_llm in legal.py
        answer_markdown = legal.ask_llm(question)
        
        print(f"answer_markdown: {answer_markdown}")
        # Return the Markdown as the response
        return answer_markdown, 200
    except Exception as e:
        return f"Error: {str(e)}", 500  # Handle errors appropriately

เมื่อทำตามขั้นตอนเหล่านี้ คุณจะเปิดใช้ Gemini Code Assist ตั้งค่าโปรเจ็กต์ และใช้เพื่อสร้างฟังก์ชัน ask ในไฟล์ main.py ได้สำเร็จ

5. การทดสอบในเครื่องใน Cloud Editor

👉 ในเทอร์มินัลของเอดิเตอร์ ให้ติดตั้งไลบรารีที่ขึ้นต่อกันและเริ่ม UI ของเว็บในเครื่อง

cd ~/legal-eagle/webapp
python -m venv env
source env/bin/activate
export PROJECT_ID=$(gcloud config get project)
pip install -r requirements.txt
python main.py

มองหาข้อความเริ่มต้นในเอาต์พุตเทอร์มินัลของ Cloud Shell โดยปกติแล้ว Flask จะพิมพ์ข้อความที่ระบุว่ากำลังทำงานและทำงานบนพอร์ตใด

  • ทำงานบน http://127.0.0.1:8080

แอปพลิเคชันต้องทำงานต่อไปเพื่อให้บริการคำขอ

👉 จากเมนู "ตัวอย่างเว็บ" ให้เลือกแสดงตัวอย่างบนพอร์ต 8080 Cloud Shell จะเปิดแท็บหรือหน้าต่างเบราว์เซอร์ใหม่พร้อมแสดงตัวอย่างเว็บของแอปพลิเคชัน รหัสโปรเจ็กต์

👉 ในอินเทอร์เฟซของแอปพลิเคชัน ให้พิมพ์คำถาม 2-3 ข้อที่เกี่ยวข้องกับการอ้างอิงคดีทางกฎหมายโดยเฉพาะ แล้วดูว่า LLM ตอบอย่างไร เช่น คุณอาจลองทำสิ่งต่อไปนี้

  • Michael Brown ถูกตัดสินจำคุกกี่ปี
  • การกระทำของเจน สมิธทำให้เกิดการเรียกเก็บเงินที่ไม่ได้รับอนุญาตเป็นจำนวนเท่าใด
  • คำให้การของเพื่อนบ้านมีบทบาทอย่างไรในการสืบสวนคดีของเอมิลี ไวท์

👉 ไม่บังคับ: เวอร์ชันภาษาสเปน

  • ¿A cuántos años de prisión fue sentenciado Michael Brown?
  • ¿Cuánto dinero en cargos no autorizados se generó como resultado de las acciones de Jane Smith?
  • ¿Qué papel jugaron los testimonios de los vecinos en la investigación del caso de Emily White?

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

👉 หยุดสคริปต์โดยกด Ctrl+C

👉 ออกจากสภาพแวดล้อมเสมือนจริงโดยเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล

deactivate

6. การตั้งค่าที่เก็บเวกเตอร์

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

หากต้องการสร้างระบบ RAG เราต้องมีที่จัดเก็บเอกสารทางกฎหมายทั้งหมด และที่สำคัญคือต้องทำให้ค้นหาได้ตามความหมาย Firestore จึงเข้ามามีบทบาทในส่วนนี้ Firestore คือฐานข้อมูลเอกสาร NoSQL ที่ยืดหยุ่นและปรับขนาดได้ของ Google Cloud

เราจะใช้ Firestore เป็นที่เก็บเวกเตอร์ เราจะจัดเก็บกลุ่มเอกสารทางกฎหมายไว้ใน Firestore และสำหรับแต่ละกลุ่ม เราจะจัดเก็บการฝัง ซึ่งเป็นการแสดงความหมายในรูปแบบตัวเลขด้วย

overview-02

จากนั้นเมื่อคุณถามคำถามกับ Legal Eagle เราจะใช้การค้นหาเวกเตอร์ของ Firestore เพื่อค้นหาข้อความทางกฎหมายที่เกี่ยวข้องกับคำถามของคุณมากที่สุด บริบทที่ดึงมานี้คือสิ่งที่ RAG ใช้เพื่อให้คำตอบที่อิงตามข้อมูลทางกฎหมายจริง ไม่ใช่แค่จินตนาการของ LLM

👉 ในแท็บ/หน้าต่างใหม่ ให้ไปที่ Firestore ในคอนโซล Google Cloud

👉 คลิกสร้างฐานข้อมูล

สร้างฐานข้อมูล

👉 เลือก Native mode และชื่อฐานข้อมูลเป็น (default)

👉 เลือกรายการเดียว region: us-central1 แล้วคลิกสร้างฐานข้อมูล Firestore จะจัดสรรฐานข้อมูลของคุณ ซึ่งอาจใช้เวลาสักครู่

ฐานข้อมูลการกำหนดค่า

👉 กลับไปที่เทอร์มินัลของ Cloud IDE ให้สร้างดัชนีเวกเตอร์ในช่อง embedding_vector เพื่อเปิดใช้การค้นหาเวกเตอร์ในคอลเล็กชัน legal_documents

export PROJECT_ID=$(gcloud config get project)
gcloud firestore indexes composite create \
--collection-group=legal_documents \
--query-scope=COLLECTION \
--field-config field-path=embedding,vector-config='{"dimension":"768", "flat": "{}"}' \
--project=${PROJECT_ID}

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

7. การโหลดข้อมูลลงใน Vector Store

ตอนนี้เราเข้าใจ RAG และ Vector Store แล้ว ก็ถึงเวลาสร้างเครื่องมือที่จะเติมข้อมูลในคลังกฎหมายของเรา เราจะทำให้เอกสารทางกฎหมาย "ค้นหาตามความหมาย" ได้อย่างไร การฝังคือเคล็ดลับสำคัญ การฝังคือการแปลงคำ ประโยค หรือแม้แต่ทั้งเอกสารเป็นเวกเตอร์เชิงตัวเลข ซึ่งก็คือรายการตัวเลขที่บันทึกความหมายเชิงความหมายของคำ ประโยค หรือเอกสารนั้นๆ แนวคิดที่คล้ายกันจะมีเวกเตอร์ที่ "ใกล้" กันในปริภูมิเวกเตอร์ เราใช้โมเดลที่มีประสิทธิภาพ (เช่น โมเดลจาก Vertex AI) เพื่อทำการแปลงนี้

และเราจะใช้ฟังก์ชัน Cloud Run และ Eventarc เพื่อทำให้การโหลดเอกสารเป็นอัตโนมัติ ฟังก์ชัน Cloud Run เป็นคอนเทนเนอร์แบบ Serverless ที่ใช้งานง่ายซึ่งเรียกใช้โค้ดเมื่อจำเป็นเท่านั้น เราจะแพ็กเกจสคริปต์ Python สำหรับการประมวลผลเอกสารลงในคอนเทนเนอร์และทำให้ใช้งานได้เป็นฟังก์ชัน Cloud Run

overview-03

👉 ในแท็บ/หน้าต่างใหม่ ให้ไปที่ Cloud Storage

👉 คลิก "Buckets" ในเมนูด้านซ้าย

👉 คลิกปุ่ม "+ สร้าง" ที่ด้านบน

👉 กำหนดค่าที่เก็บข้อมูล (การตั้งค่าที่สำคัญ)

  • ชื่อที่เก็บข้อมูล: ‘yourprojectID'-doc-bucket (คุณต้องมีคำต่อท้าย -doc-bucket ที่ส่วนท้าย)
  • region: เลือกภูมิภาค us-central1
  • คลาสพื้นที่เก็บข้อมูล: "Standard" มาตรฐานเหมาะสำหรับข้อมูลที่มีการเข้าถึงบ่อย
  • การควบคุมการเข้าถึง: เลือก "การควบคุมการเข้าถึงแบบเดียวกัน" ที่เป็นค่าเริ่มต้นไว้ ซึ่งจะช่วยให้การควบคุมการเข้าถึงระดับที่เก็บข้อมูลสอดคล้องกัน
  • ตัวเลือกขั้นสูง: สำหรับบทแนะนำนี้ การตั้งค่าเริ่มต้นมักจะเพียงพอ

สร้างที่เก็บข้อมูล

👉 คลิกปุ่มสร้างเพื่อสร้างที่เก็บข้อมูล

👉 คุณอาจเห็นป๊อปอัปเกี่ยวกับการป้องกันการเข้าถึงแบบสาธารณะ เลือกช่องไว้แล้วคลิก "ยืนยัน"

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

8. ตั้งค่าฟังก์ชัน Cloud Run

👉 ในโปรแกรมแก้ไขโค้ดของ Cloud Shell ให้ไปที่ไดเรกทอรีการทำงาน legal-eagle: ใช้คำสั่ง cd ในเทอร์มินัลของ Cloud Editor เพื่อสร้างโฟลเดอร์

cd ~/legal-eagle
mkdir loader
cd loader

👉 สร้างไฟล์ main.py,requirements.txt และ Dockerfile ในเทอร์มินัล Cloud Shell ให้ใช้คำสั่ง touch เพื่อสร้างไฟล์

touch main.py requirements.txt Dockerfile

คุณจะเห็นโฟลเดอร์ที่สร้างใหม่ชื่อ *loader และไฟล์ทั้ง 3 ไฟล์

👉 แก้ไข main.py ในโฟลเดอร์ loader ใน File Explorer ทางด้านซ้าย ให้ไปที่ไดเรกทอรีที่คุณสร้างไฟล์ แล้วดับเบิลคลิก main.py เพื่อเปิดในโปรแกรมแก้ไข

วางโค้ด Python ต่อไปนี้ลงใน main.py

แอปพลิเคชันนี้จะประมวลผลไฟล์ใหม่ที่อัปโหลดไปยังที่เก็บข้อมูล GCS, แยกข้อความเป็นก้อน, สร้างการฝังสำหรับแต่ละก้อน และจัดเก็บก้อนและการฝังของก้อนเหล่านั้นใน Firestore

import os
import json
from google.cloud import storage
import functions_framework
from langchain_google_vertexai import VertexAI, VertexAIEmbeddings
from langchain_google_firestore import FirestoreVectorStore
from langchain.text_splitter import RecursiveCharacterTextSplitter
import vertexai
PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT")  # Get project ID from env
embedding_model = VertexAIEmbeddings(
    model_name="text-embedding-004" ,
    project=PROJECT_ID,)
COLLECTION_NAME = "legal_documents"
# Create a vector store
vector_store = FirestoreVectorStore(
    collection="legal_documents",
    embedding_service=embedding_model,
    content_field="original_text",
    embedding_field="embedding",
)
@functions_framework.cloud_event
def process_file(cloud_event):
    print(f"CloudEvent received: {cloud_event.data}")  # Print the parsed event data
     
    """Triggered by a Cloud Storage event.
       Args:
            cloud_event (functions_framework.CloudEvent): The CloudEvent
                containing the Cloud Storage event data.
    """
    try:
        event_data = cloud_event.data
        bucket_name = event_data['bucket']
        file_name = event_data['name']
    except (json.JSONDecodeError, AttributeError, KeyError) as e:  # Catch JSON errors
        print(f"Error decoding CloudEvent data: {e} - Data: {cloud_event.data}")
        return "Error processing event", 500  # Return an error response
   
    print(f"New file detected in bucket: {bucket_name}, file: {file_name}")
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(file_name)
    try:
        # Download the file content as string (assuming UTF-8 encoded text file)
        file_content_string = blob.download_as_string().decode("utf-8")
        print(f"File content downloaded. Processing...")
        # Split text into chunks using RecursiveCharacterTextSplitter
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=500,
            chunk_overlap=100,
            length_function=len,
        )
        text_chunks = text_splitter.split_text(file_content_string)
        print(f"Text split into {len(text_chunks)} chunks.")
 
        # Add the docs to the vector store
        vector_store.add_texts(text_chunks)    
        print(f"File processing and Firestore upsert complete for file: {file_name}")
        return "File processed successfully", 200  #  Return success response
    except Exception as e:
        print(f"Error processing file {file_name}: {e}")

แก้ไข requirements.txt วางบรรทัดต่อไปนี้ลงในไฟล์

Flask==2.3.3
requests==2.31.0
google-generativeai>=0.2.0
langchain
langchain_google_vertexai
langchain-community
langchain-google-firestore
google-cloud-storage
functions-framework

9. ทดสอบและสร้างฟังก์ชัน Cloud Run

👉 เราจะเรียกใช้คำสั่งนี้ในสภาพแวดล้อมเสมือนและติดตั้งไลบรารี Python ที่จำเป็นสำหรับฟังก์ชัน Cloud Run

cd ~/legal-eagle/loader
python -m venv env
source env/bin/activate
pip install -r requirements.txt

👉 เริ่มโปรแกรมจำลองในเครื่องสำหรับฟังก์ชัน Cloud Run

functions-framework --target process_file --signature-type=cloudevent --source main.py

👉 เปิดเทอร์มินัลล่าสุดไว้ เปิดเทอร์มินัลใหม่ แล้วเรียกใช้คำสั่งเพื่ออัปโหลดไฟล์ไปยังที่เก็บข้อมูล

export DOC_BUCKET_NAME=$(gcloud storage buckets list --format="value(name)" | grep doc-bucket)
gsutil cp ~/legal-eagle/court_cases/case-01.txt gs://$DOC_BUCKET_NAME/

2 เทอร์มินัล

👉 ขณะที่โปรแกรมจำลองทำงานอยู่ คุณจะส่ง CloudEvent ทดสอบไปยังโปรแกรมจำลองได้ คุณต้องมีเทอร์มินัลแยกต่างหากใน IDE สำหรับการดำเนินการนี้

curl -X POST -H "Content-Type: application/json" \
     -d "{
       \"specversion\": \"1.0\",
       \"type\": \"google.cloud.storage.object.v1.finalized\",
       \"source\": \"//storage.googleapis.com/$DOC_BUCKET_NAME\",
       \"subject\": \"objects/case-01.txt\",
       \"id\": \"my-event-id\",
       \"time\": \"2024-01-01T12:00:00Z\",
       \"data\": {
         \"bucket\": \"$DOC_BUCKET_NAME\",
         \"name\": \"case-01.txt\"
       }
     }" http://localhost:8080/

ซึ่งควรแสดงผลเป็น OK

👉 คุณจะยืนยันข้อมูลใน Firestore ได้โดยไปที่ Google Cloud Console แล้วไปที่ "ฐานข้อมูล" จากนั้นไปที่ "Firestore" แล้วเลือกแท็บ "ข้อมูล" จากนั้นเลือกคอลเล็กชัน legal_documents คุณจะเห็นว่าระบบได้สร้างเอกสารใหม่ในคอลเล็กชันของคุณ โดยแต่ละเอกสารจะแสดงข้อความส่วนหนึ่งจากไฟล์ที่อัปโหลด Upsort NoSQLDB

👉 ในเทอร์มินัลที่เรียกใช้โปรแกรมจำลอง ให้พิมพ์ Ctrl+C เพื่อออก แล้วปิดเทอร์มินัลที่ 2

👉 เรียกใช้ deactivate เพื่อออกจากสภาพแวดล้อมเสมือน

deactivate

10. สร้างอิมเมจคอนเทนเนอร์และพุชไปยังที่เก็บ Artifacts

👉 ได้เวลาติดตั้งใช้งานในระบบคลาวด์แล้ว ใน File Explorer ให้ดับเบิลคลิก Dockerfile ขอให้ Gemini สร้าง Dockerfile ให้คุณ เปิด Gemini Code Assist แล้วใช้พรอมต์ต่อไปนี้เพื่อสร้างไฟล์

In the loader folder, 
Generate a Dockerfile for a Python 3.12 Cloud Run service that uses functions-framework. It needs to:
1. Use a Python 3.12 slim base image.
2. Set the working directory to /app.
3. Copy requirements.txt and install Python dependencies.
4. Copy main.py.
5. Set the command to run functions-framework, targeting the 'process_file' function on port 8080

แนวทางปฏิบัติแนะนำคือคลิก Diff with Open File(ลูกศร 2 อันชี้ไปในทิศทางตรงกันข้าม แล้วยอมรับการเปลี่ยนแปลง) Gemini Docker

👉 หากคุณเพิ่งเริ่มใช้คอนเทนเนอร์ โปรดดูตัวอย่างที่ใช้งานได้ต่อไปนี้

# Use a Python 3.12 slim base image
FROM python:3.12-slim
# Set the working directory to /app
WORKDIR /app
# Copy requirements.txt and install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy main.py
COPY main.py .
# Set the command to run functions-framework
CMD ["functions-framework", "--target", "process_file", "--port", "8080"]

👉 สร้างที่เก็บที่เก็บอาร์ติแฟกต์ในเทอร์มินัลเพื่อจัดเก็บอิมเมจ Docker ที่เราจะสร้าง

gcloud artifacts repositories create my-repository \
    --repository-format=docker \
    --location=us-central1 \
    --description="My repository"

คุณควรเห็นข้อความสร้างที่เก็บ [my-repository] แล้ว

👉 เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างอิมเมจ Docker

cd ~/legal-eagle/loader
export PROJECT_ID=$(gcloud config get project)
docker build -t gcr.io/${PROJECT_ID}/legal-eagle-loader .

👉 ตอนนี้คุณจะพุชไปยังรีจิสทรี

export PROJECT_ID=$(gcloud config get project)
docker tag gcr.io/${PROJECT_ID}/legal-eagle-loader us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-loader
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-loader

ตอนนี้อิมเมจ Docker พร้อมใช้งานในที่เก็บ my-repository ที่เก็บ Artifact แล้ว

Gemini Docker

11. สร้างฟังก์ชัน Cloud Run และตั้งค่าทริกเกอร์ Eventarc

ก่อนที่จะเจาะลึกรายละเอียดของการติดตั้งใช้งานโปรแกรมโหลดเอกสารทางกฎหมาย มาทำความเข้าใจคร่าวๆ เกี่ยวกับคอมโพเนนต์ที่เกี่ยวข้องกันก่อน Cloud Run เป็นแพลตฟอร์มแบบไม่มีเซิร์ฟเวอร์ที่มีการจัดการเต็มรูปแบบ ซึ่งช่วยให้คุณติดตั้งใช้งานแอปพลิเคชันที่มีคอนเทนเนอร์ได้อย่างรวดเร็วและง่ายดาย ซึ่งตัดการจัดการโครงสร้างพื้นฐานออก เพื่อให้คุณมุ่งเน้นเฉพาะการเขียนและการติดตั้งใช้งานโค้ดเท่านั้น

เราจะทำให้โปรแกรมโหลดเอกสารใช้งานได้เป็นบริการ Cloud Run ตอนนี้มาตั้งค่าฟังก์ชัน Cloud Run กัน

👉 ใน Google Cloud Console ให้ไปที่ Cloud Run

👉 ไปที่ติดตั้งใช้งานคอนเทนเนอร์ แล้วคลิก SERVICE ในเมนูแบบเลื่อนลง

👉 กำหนดค่าบริการ Cloud Run ดังนี้

  • อิมเมจคอนเทนเนอร์: คลิก "เลือก" ในช่อง URL ค้นหา URL ของรูปภาพที่คุณพุชไปยัง Artifact Registry (เช่น us-central1-docker.pkg.dev/your-project-id/my-repository/legal-eagle-loader/yourimage)
  • ชื่อบริการ: legal-eagle-loader
  • ภูมิภาค: เลือกภูมิภาค us-central1
  • การตรวจสอบสิทธิ์: สำหรับเวิร์กช็อปนี้ คุณสามารถเลือก "อนุญาตการเรียกใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์" ได้ สำหรับเวอร์ชันที่ใช้งานจริง คุณอาจต้องจำกัดการเข้าถึง
  • คอนเทนเนอร์ เครือข่าย ความปลอดภัย : ค่าเริ่มต้น

👉 คลิกสร้าง Cloud Run จะทำให้บริการใช้งานได้ Cloud Run

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

overview-04

การตั้งค่า Eventarc จะทำให้บริการ Cloud Run โหลดเอกสารที่เพิ่มใหม่ลงใน Firestore โดยอัตโนมัติทันทีที่มีการอัปโหลด ซึ่งจะช่วยให้แอปพลิเคชัน RAG ของเราอัปเดตข้อมูลแบบเรียลไทม์ได้

👉 ในคอนโซล Google Cloud ให้ไปที่ทริกเกอร์ใน EventArc คลิก "+ สร้างทริกเกอร์" 👉 กำหนดค่าทริกเกอร์ Eventarc:

  • ชื่อทริกเกอร์: legal-eagle-upload-trigger
  • TriggerType: แหล่งที่มาของ Google
  • ผู้ให้บริการเหตุการณ์: เลือก Cloud Storage
  • ประเภทกิจกรรม: เลือก google.cloud.storage.object.v1.finalized
  • ที่เก็บข้อมูล Cloud Storage: เลือกที่เก็บข้อมูล GCS จากเมนูแบบเลื่อนลง
  • ประเภทปลายทาง: "บริการ Cloud Run"
  • บริการ: เลือก legal-eagle-loader
  • ภูมิภาค: us-central1
  • เส้นทาง: เว้นว่างไว้ก่อน
  • ให้สิทธิ์ทั้งหมดที่ระบบแจ้งในหน้าเว็บ

👉 คลิกสร้าง ตอนนี้ Eventarc จะตั้งค่าทริกเกอร์

บริการ Cloud Run ต้องมีสิทธิ์อ่านไฟล์จากคอมโพเนนต์ต่างๆ เราต้องให้สิทธิ์บัญชีบริการของบริการตามที่จำเป็น

สร้างทริกเกอร์

สร้างทริกเกอร์

12. อัปโหลดเอกสารทางกฎหมายไปยังที่เก็บข้อมูล GCS

👉 อัปโหลดไฟล์คดีในศาลไปยังที่เก็บข้อมูล GCS อย่าลืมแทนที่ชื่อที่เก็บข้อมูล

export DOC_BUCKET_NAME=$(gcloud storage buckets list --format="value(name)" | grep doc-bucket)
gsutil cp ~/legal-eagle/court_cases/case-02.txt gs://$DOC_BUCKET_NAME/
gsutil cp ~/legal-eagle/court_cases/case-03.txt gs://$DOC_BUCKET_NAME/
gsutil cp ~/legal-eagle/court_cases/case-06.txt gs://$DOC_BUCKET_NAME/

ตรวจสอบบันทึกบริการ Cloud Run โดยไปที่ Cloud Run -> บริการ legal-eagle-loader -> "บันทึก" ตรวจสอบบันทึกเพื่อดูข้อความการประมวลผลที่สําเร็จ ซึ่งรวมถึง

xxx
POST200130 B8.3 sAPIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) https://legal-eagle-loader-bmngrueyta-uc.a.run.app/?__GCP_CloudEventsMode=GCS_NOTIFICATION
xxx
POST200130 B520 msAPIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) https://legal-eagle-loader-bmngrueyta-uc.a.run.app/?__GCP_CloudEventsMode=GCS_NOTIFICATION
xxx
POST200130 B514 msAPIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) https://legal-eagle-loader-bmngrueyta-uc.a.run.app/?__GCP_CloudEventsMode=GCS_NOTIFICATION

และคุณจะเห็นบันทึกโดยละเอียดเพิ่มเติมที่นี่ด้วย โดยขึ้นอยู่กับความเร็วในการตั้งค่าการบันทึก

    "CloudEvent received:"
    "New file detected in bucket:"
    "File content downloaded. Processing..."
    "Text split into ... chunks."
    "File processing and Firestore upsert complete..."

มองหาข้อความแสดงข้อผิดพลาดในบันทึกและแก้ปัญหาหากจำเป็น บันทึกฟังก์ชัน

👉 ตรวจสอบข้อมูลใน Firestore แล้วเปิดคอลเล็กชัน legal_documents

👉 คุณควรเห็นเอกสารใหม่ที่สร้างขึ้นในคอลเล็กชัน เอกสารแต่ละฉบับจะแสดงข้อความส่วนหนึ่งจากไฟล์ที่คุณอัปโหลด และจะมีข้อมูลต่อไปนี้

metadata: currently empty
original_text_chunk: The text chunk content.
embedding_: A list of floating-point numbers (the Vertex AI embedding).

การแทรก/อัปเดต NoSQL

13. การใช้ RAG

LangChain เป็นเฟรมเวิร์กที่มีประสิทธิภาพซึ่งออกแบบมาเพื่อเพิ่มประสิทธิภาพการพัฒนาแอปพลิเคชันที่ขับเคลื่อนโดยโมเดลภาษาขนาดใหญ่ (LLM) LangChain มีเลเยอร์การแยกข้อมูลระดับสูงแทนที่จะต้องต่อสู้กับความซับซ้อนของ API ของ LLM, การออกแบบพรอมต์ และการจัดการข้อมูลโดยตรง โดยมีคอมโพเนนต์และเครื่องมือที่สร้างไว้ล่วงหน้าสำหรับงานต่างๆ เช่น การเชื่อมต่อกับ LLM ต่างๆ (เช่น LLM จาก OpenAI, Google หรืออื่นๆ) การสร้างเชนการดำเนินการที่ซับซ้อน (เช่น การดึงข้อมูลตามด้วยการสรุป) และการจัดการหน่วยความจำในการสนทนา

สำหรับ RAG โดยเฉพาะนั้น ร้านค้าเวกเตอร์ใน LangChain เป็นสิ่งจำเป็นในการเปิดใช้ลักษณะการดึงข้อมูลของ RAG ซึ่งเป็นฐานข้อมูลเฉพาะที่ออกแบบมาเพื่อจัดเก็บและค้นหาการฝังเวกเตอร์อย่างมีประสิทธิภาพ โดยจะแมปข้อความที่มีความคล้ายกันทางความหมายกับจุดที่อยู่ใกล้กันในพื้นที่เวกเตอร์ LangChain จะจัดการการเชื่อมต่อระดับล่าง เพื่อให้นักพัฒนาแอปมุ่งเน้นที่ตรรกะและฟังก์ชันหลักของแอปพลิเคชัน RAG ได้ ซึ่งช่วยลดเวลาในการพัฒนาและความซับซ้อนได้อย่างมาก ทำให้คุณสามารถสร้างต้นแบบและทำให้แอปพลิเคชันที่ใช้ RAG ใช้งานได้รวดเร็ว พร้อมทั้งใช้ประโยชน์จากความแข็งแกร่งและความสามารถในการปรับขนาดของโครงสร้างพื้นฐาน Google Cloud

overview-05

เมื่อทราบเกี่ยวกับ LangChain แล้ว ตอนนี้คุณจะต้องอัปเดตไฟล์ legal.py ในโฟลเดอร์ webapp เพื่อการติดตั้งใช้งาน RAG ซึ่งจะช่วยให้ LLM ค้นหาเอกสารที่เกี่ยวข้องใน Firestore ก่อนที่จะให้คำตอบได้

👉 นำเข้า FirestoreVectorStore และโมดูลอื่นๆ ที่จำเป็นจาก langchain และ vertexai เพิ่มรายการต่อไปนี้ลงใน legal.py ปัจจุบัน

from langchain_google_vertexai import VertexAIEmbeddings
from langchain_google_firestore import FirestoreVectorStore

👉 เริ่มต้น Vertex AI และโมเดลการฝัง คุณจะใช้ text-embedding-004 เพิ่มโค้ดต่อไปนี้หลังจากนำเข้าโมดูล

PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT")  # Get project ID from env
embedding_model = VertexAIEmbeddings(
    model_name="text-embedding-004" ,
    project=PROJECT_ID,)

👉 สร้าง FirestoreVectorStore ที่ชี้ไปยังคอลเล็กชัน legal_documents โดยใช้โมเดลการฝังที่เริ่มต้นแล้ว และระบุช่องเนื้อหาและการฝัง เพิ่มโค้ดนี้ต่อจากโค้ดโมเดลการฝังก่อนหน้า

COLLECTION_NAME = "legal_documents"
# Create a vector store
vector_store = FirestoreVectorStore(
    collection="legal_documents",
    embedding_service=embedding_model,
    content_field="original_text",
    embedding_field="embedding",
)

👉 กำหนดฟังก์ชันชื่อ search_resource ที่รับคำค้นหา ดำเนินการค้นหาความคล้ายคลึงโดยใช้ vector_store.similarity_search และแสดงผลลัพธ์ที่รวมกัน

def search_resource(query):
    results = []
    results = vector_store.similarity_search(query, k=5)
    
    combined_results = "\n".join([result.page_content for result in results])
    print(f"==>{combined_results}")
    return combined_results

👉 แทนที่ฟังก์ชัน ask_llm แล้วใช้ฟังก์ชัน search_resource เพื่อดึงบริบทที่เกี่ยวข้องตามคำค้นหาของผู้ใช้

def ask_llm(query):
    try:
        query_message = {
            "type": "text",
            "text": query,
        }
        relevant_resource = search_resource(query)
       
        input_msg = HumanMessage(content=[query_message])
        prompt_template = ChatPromptTemplate.from_messages(
            [
                SystemMessage(
                    content=(
                        "You are a helpful assistant, and you are with the attorney in a courtroom, you are helping him to win the case by providing the information he needs "
                        "Don't answer if you don't know the answer, just say sorry in a funny way possible"
                        "Use high engergy tone, don't use more than 100 words to answer"
                        f"Here is some context that is relevant to the question {relevant_resource} that you might use"
                    )
                ),
                input_msg,
            ]
        )
        prompt = prompt_template.format()
        
        response = llm.invoke(prompt)
        print(f"response: {response}")
        return response
    except Exception as e:
        print(f"Error sending message to chatbot: {e}") # Log this error too!
        return f"Unable to process your request at this time. Due to the following reason: {str(e)}"

👉 ไม่บังคับ: เวอร์ชันภาษาสเปน

Sustituye el siguiente texto como se indica: You are a helpful assistant, to You are a helpful assistant that speaks Spanish,

👉 หลังจากติดตั้งใช้งาน RAG ใน legal.py แล้ว คุณควรทดสอบในเครื่องก่อนที่จะนำไปใช้งาน โดยเรียกใช้แอปพลิเคชันด้วยคำสั่งต่อไปนี้

cd ~/legal-eagle/webapp
source env/bin/activate
python main.py

👉 ใช้ webpreview เพื่อเข้าถึงแอปพลิเคชัน พูดคุยกับผู้ช่วย และพิมพ์ ctrl+c เพื่อออกจากกระบวนการที่ทำงานในเครื่อง แล้วเรียกใช้ deactivate เพื่อออกจากสภาพแวดล้อมเสมือน

deactivate

👉 หากต้องการทําให้เว็บแอปพลิเคชันใช้งานได้ใน Cloud Run ก็จะคล้ายกับฟังก์ชันโปรแกรมโหลด คุณจะสร้าง ติดแท็ก และพุชอิมเมจ Docker ไปยัง Artifact Registry โดยทำดังนี้

export PROJECT_ID=$(gcloud config get project)
docker build -t gcr.io/${PROJECT_ID}/legal-eagle-webapp .
docker tag gcr.io/${PROJECT_ID}/legal-eagle-webapp us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-webapp
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-webapp

👉 ได้เวลาทำให้เว็บแอปพลิเคชันใช้งานได้ใน Google Cloud แล้ว เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล

export PROJECT_ID=$(gcloud config get project)
gcloud run deploy legal-eagle-webapp \
  --image us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/legal-eagle-webapp \
  --region us-central1 \
  --set-env-vars=GOOGLE_CLOUD_PROJECT=${PROJECT_ID}  \
  --allow-unauthenticated

ยืนยันการติดตั้งใช้งานโดยไปที่ Cloud Run ใน Google Cloud Console คุณควรเห็นบริการใหม่ชื่อ legal-eagle-webapp แสดงอยู่

02-10-run-webapp.png

คลิกบริการเพื่อไปยังหน้ารายละเอียด คุณจะเห็น URL ที่ใช้งานได้ที่ด้านบน การแทรก/อัปเดต NoSQL

👉 ตอนนี้ให้เปิด URL ที่ติดตั้งใช้งานในแท็บเบราว์เซอร์ใหม่ คุณสามารถโต้ตอบกับผู้ช่วยด้านกฎหมายและถามคำถามที่เกี่ยวข้องกับคดีในศาลที่คุณโหลดไว้(ในโฟลเดอร์ court_cases) ได้โดยทำดังนี้

  • Michael Brown ถูกตัดสินจำคุกกี่ปี
  • การกระทำของเจน สมิธทำให้เกิดการเรียกเก็บเงินที่ไม่ได้รับอนุญาตเป็นจำนวนเท่าใด
  • คำให้การของเพื่อนบ้านมีบทบาทอย่างไรในการสืบสวนคดีของเอมิลี ไวท์

👉 ไม่บังคับ: เวอร์ชันภาษาสเปน

  • ¿A cuántos años de prisión fue sentenciado Michael Brown?
  • ¿Cuánto dinero en cargos no autorizados se generó como resultado de las acciones de Jane Smith?
  • ¿Qué papel jugaron los testimonios de los vecinos en la investigación del caso de Emily White?

คุณจะเห็นว่าตอนนี้คำตอบมีความแม่นยำมากขึ้นและอิงตามเนื้อหาของเอกสารทางกฎหมายที่คุณอัปโหลด ซึ่งแสดงให้เห็นถึงประสิทธิภาพของ RAG

ขอแสดงความยินดีที่เข้าร่วมเวิร์กช็อปจนจบ คุณสร้างและใช้งานแอปพลิเคชันวิเคราะห์เอกสารทางกฎหมายโดยใช้ LLM, LangChain และ Google Cloud ได้สำเร็จแล้ว คุณได้เรียนรู้วิธีการนำเข้าและประมวลผลเอกสารทางกฎหมาย เพิ่มคำตอบของ LLM ด้วยข้อมูลที่เกี่ยวข้องโดยใช้ RAG และติดตั้งใช้งานแอปพลิเคชันเป็นบริการแบบไร้เซิร์ฟเวอร์ ความรู้และแอปพลิเคชันที่สร้างขึ้นนี้จะช่วยให้คุณสำรวจศักยภาพของ LLM สำหรับงานด้านกฎหมายได้มากยิ่งขึ้น เยี่ยมไปเลย"

14. ความท้าทาย

ประเภทสื่อที่หลากหลาย:

วิธีนำเข้าและประมวลผลสื่อประเภทต่างๆ เช่น วิดีโอในศาลและไฟล์บันทึกเสียง รวมถึงแยกข้อความที่เกี่ยวข้อง

ชิ้นงานออนไลน์:

วิธีประมวลผลชิ้นงานออนไลน์ เช่น หน้าเว็บแบบเรียลไทม์