Legal Eagles in the Cloud: هک کردن سیستم دادگاه (به صورت قانونی) با گوگل

1. مقدمه

من همیشه مجذوب شدت دادگاه بودم و تصور می‌کردم که ماهرانه پیچیدگی‌های آن را مرور می‌کنم و استدلال‌های پایانی قدرتمندی را ارائه می‌دهم. در حالی که مسیر شغلی من من را به جای دیگری سوق داده است، من هیجان زده هستم که با کمک هوش مصنوعی به اشتراک بگذارم، ممکن است همه ما به تحقق رویای دادگاه نزدیکتر باشیم.

بهتر است با عقاب تماس بگیرید

امروز، ما در حال بررسی نحوه استفاده از ابزارهای قدرتمند هوش مصنوعی Google هستیم - مانند Vertex AI، Firestore، و توابع Cloud Run برای پردازش و درک داده‌های قانونی، انجام جستجوهای سریع رعد و برق، و شاید، شاید، کمک به مشتری خیالی خود (یا خودتان) از یک موقعیت چسبنده.

ممکن است شاهد بازجویی متقابل نباشید، اما با سیستم ما، می‌توانید کوه‌هایی از اطلاعات را بررسی کنید، خلاصه‌های واضحی تولید کنید و مرتبط‌ترین داده‌ها را در چند ثانیه ارائه کنید.

2. معماری

این پروژه بر ساخت یک دستیار حقوقی با استفاده از ابزارهای هوش مصنوعی Google Cloud تمرکز دارد و بر نحوه پردازش، درک و جستجوی داده های حقوقی تاکید دارد. این سیستم برای غربال کردن مقادیر زیادی از اطلاعات، تولید خلاصه و ارائه سریع داده های مربوطه طراحی شده است. معماری دستیار حقوقی شامل چندین جزء کلیدی است:

ایجاد پایگاه دانش از داده‌های بدون ساختار : Google Cloud Storage (GCS) برای ذخیره اسناد قانونی استفاده می‌شود. Firestore، یک پایگاه داده NoSQL، به عنوان یک ذخیره ساز عمل می کند و تکه های سند و جاسازی های مربوط به آنها را نگه می دارد. جستجوی برداری در Firestore فعال است تا امکان جستجوهای مشابه را فراهم کند. هنگامی که یک سند قانونی جدید در GCS آپلود می شود، Eventarc یک عملکرد Cloud Run را راه اندازی می کند. این تابع، سند را با تقسیم آن به تکه‌ها و ایجاد جاسازی برای هر تکه با استفاده از مدل جاسازی متن Vertex AI پردازش می‌کند. سپس این تعبیه‌ها در Firestore در کنار تکه‌های متن ذخیره می‌شوند. فرآیند داده

برنامه ارائه شده توسط LLM & RAG : هسته سیستم پاسخگویی به سوال تابع ask_llm است که از کتابخانه langchain برای تعامل با مدل زبان بزرگ Vertex AI Gemini استفاده می کند. این یک پیام انسانی از درخواست کاربر ایجاد می کند و شامل یک پیام سیستم است که به LLM دستور می دهد تا به عنوان یک دستیار حقوقی مفید عمل کند. این سیستم از یک رویکرد Retrieval-Augmented Generation (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 Tools بروید، با موافقت با شرایط و ضوابط، Gemini Code Assist را بدون هیچ هزینه ای فعال کنید.

کمک کد

تنظیمات مجوز را نادیده بگیرید، این صفحه را ترک کنید.

روی Cloud Shell Editor کار کنید

👉 روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید (این نماد شکل ترمینال در بالای صفحه Cloud Shell است)

پوسته ابری

👉 روی دکمه "Open Editor" کلیک کنید (به نظر می رسد یک پوشه باز با مداد است). با این کار ویرایشگر Cloud Shell در پنجره باز می شود. در سمت چپ یک فایل کاوشگر خواهید دید.

ویرایشگر را باز کنید

👉 همانطور که نشان داده شده روی دکمه Cloud Code Sign-in در نوار وضعیت پایین کلیک کنید. پلاگین را طبق دستورالعمل مجاز کنید. اگر کد Cloud - بدون پروژه را در نوار وضعیت می‌بینید، آن را در منوی کشویی «انتخاب یک پروژه Google Cloud» انتخاب کنید و سپس پروژه Google Cloud خاص را از لیست پروژه‌هایی که قصد دارید با آنها کار کنید انتخاب کنید.

کد ابری

👉 ترمینال را در IDE ابری باز کنید، ترمینال جدید

👉 در ترمینال جدید، با استفاده از دستور زیر بررسی کنید که قبلا احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است:

gcloud auth list

👉 روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.

gcloud config set project <YOUR_PROJECT_ID>

👉 برای فعال کردن API های Google Cloud لازم دستور زیر را اجرا کنید:

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)، روی دکمه "Open Editor" کلیک کنید (به نظر می رسد یک پوشه باز با یک مداد است). با این کار ویرایشگر کد Cloud Shell در پنجره باز می شود. در سمت چپ یک فایل کاوشگر خواهید دید.

👉 در ترمینال پروژه Bootstrap Skeleton را دانلود کنید:

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

اختیاری: نسخه اسپانیایی

👉 یک نسخه جایگزین در اسپانیا وجود دارد. به‌خوبی، دستورالعمل‌های مربوط به نسخه‌های اصلاحی کلونار را مورد استفاده قرار دهید.

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

پس از اجرای این دستور در ترمینال Cloud Shell، یک پوشه جدید با نام مخزن legal-eagle در محیط Cloud Shell شما ایجاد می شود.

4. نوشتن برنامه استنتاج با Gemini Code Assist

در این بخش، ما بر روی ساختن هسته اصلی دستیار حقوقی خود تمرکز خواهیم کرد - برنامه وب که سوالات کاربران را دریافت می کند و با مدل هوش مصنوعی برای ایجاد پاسخ در تعامل است. ما از Gemini Code Assist برای کمک به نوشتن کد پایتون برای این بخش استنتاج استفاده خواهیم کرد.

نمای کلی-01

در ابتدا، ما یک برنامه Flask ایجاد می کنیم که از کتابخانه LangChain برای ارتباط مستقیم با مدل Vertex AI Gemini استفاده می کند. این نسخه اول بر اساس دانش عمومی مدل به عنوان یک دستیار حقوقی مفید عمل می کند، اما هنوز به اسناد پرونده قضایی خاص ما دسترسی نخواهد داشت. این به ما این امکان را می دهد که عملکرد پایه LLM را قبل از اینکه بعداً آن را با RAG افزایش دهیم، ببینیم.

در پنجره اکسپلورر ویرایشگر کد ابری (معمولاً در سمت چپ)، اکنون باید پوشه ای را ببینید که هنگام کلون کردن مخزن Git legal-eagle ایجاد شده است، پوشه ریشه پروژه خود را در Explorer باز کنید. یک زیرپوشه webapp در آن پیدا خواهید کرد، آن را نیز باز کنید. حقوقی جدید

👉 فایل legal.py را در ویرایشگر کد ابری ویرایش کنید، می‌توانید از روش‌های مختلفی برای درخواست Gemini Code Assist استفاده کنید.

👉 اعلان زیر را در پایین legal.py کپی کنید که به وضوح آنچه را که می‌خواهید Gemini Code Assist ایجاد کند، کپی کنید، روی نماد لامپ 💡 کلیک کنید و Gemini را انتخاب کنید: Generate Code (ممکن است آیتم منوی دقیق بسته به نسخه 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 ابزاری است برای کمک به شما، نه نوشتن کد کامل در اولین تلاش.

کد تولید شده را ویرایش و اصلاح کنید تا آن را اصلاح کنید، خطاها را تصحیح کنید و بهتر با نیازهای خود مطابقت دهید. می‌توانید با اضافه کردن نظرات بیشتر یا پرسیدن سؤالات خاص در پانل چت Code Assist، از Gemini 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, به You are a helpful assistant that speaks Spanish,

در مرحله بعد، یک تابع ایجاد کنید تا مسیری را مدیریت کند که به سؤالات کاربر پاسخ دهد.

main.py در Cloud Shell Editor باز کنید. مشابه نحوه ایجاد ask_llm در legal.py ، از Gemini Code Assist برای ایجاد مسیر فلاسک و تابع 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 خود تحت کدی که از قبل وجود دارد کپی و جایگذاری کنید .

👉 حتما موارد زیر را قبل از شروع برنامه وب (اگر نام == "اصلی":) جایگذاری کنید.

@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. تست محلی در ویرایشگر ابری

👉 در ترمینال ویرایشگر، کتابخانه های وابسته را نصب کنید و رابط کاربری وب را به صورت محلی راه اندازی کنید.

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

برنامه برای ارائه درخواست ها باید به کار خود ادامه دهد.

👉 از منوی "Web preview"، Preview در پورت 8080 را انتخاب کنید. Cloud Shell یک برگه یا پنجره جدید مرورگر را با پیش نمایش وب برنامه شما باز می کند. شناسه پروژه

👉 در رابط برنامه، چند سوال به طور خاص مربوط به مراجع پرونده حقوقی را تایپ کنید و ببینید LLM چگونه پاسخ می دهد. به عنوان مثال، می توانید امتحان کنید:

  • مایکل براون به چند سال زندان محکوم شد؟
  • در نتیجه اقدامات جین اسمیت چقدر پول در هزینه های غیرمجاز ایجاد شد؟
  • شهادت همسایه ها در بررسی پرونده امیلی وایت چه نقشی داشت؟

👉 اختیاری: نسخه اسپانیایی

  • ¿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 investigation del caso de Emily White؟

اگر به پاسخ‌ها دقت کنید، احتمالاً متوجه خواهید شد که مدل ممکن است توهم داشته باشد، مبهم یا عمومی باشد و گاهی اوقات سؤالات شما را اشتباه تفسیر کند، به خصوص که هنوز به اسناد قانونی خاصی دسترسی ندارد.

👉 ادامه دهید و اسکریپت را با فشار دادن Ctrl+C متوقف کنید.

👉 خروج از محیط مجازی، در ترمینال اجرا:

deactivate

6. راه اندازی فروشگاه وکتور

زمان پایان دادن به این "تفسیرهای خلاقانه" LLM از قانون است. اینجاست که Retrieval-Augmented Generation (RAG) به کمک می آید! به این فکر کنید که به LLM ما دسترسی به یک کتابخانه حقوقی فوق العاده قدرتمند را درست قبل از اینکه به سوالات شما پاسخ دهد فکر کنید. RAG به جای تکیه صرف بر دانش عمومی خود (که بسته به مدل می تواند مبهم یا قدیمی باشد)، ابتدا اطلاعات مربوطه را از یک منبع قابل اعتماد - در مورد ما، اسناد قانونی - واکشی می کند و سپس از آن زمینه برای ایجاد پاسخ بسیار آگاهانه و دقیق تر استفاده می کند. مثل این است که LLM قبل از ورود به دادگاه تکالیف خود را انجام می دهد!

برای ساختن سیستم RAG خود، ما به مکانی نیاز داریم تا همه آن اسناد قانونی را ذخیره کنیم و مهمتر از همه، آنها را قابل جستجو کنیم. اینجاست که Firestore وارد می شود! Firestore پایگاه داده اسناد NoSQL انعطاف پذیر و مقیاس پذیر Google Cloud است.

ما از Firestore به عنوان فروشگاه برداری خود استفاده می کنیم. ما تکه‌هایی از اسناد قانونی خود را در Firestor ذخیره می‌کنیم، و برای هر تکه، جاسازی آن را نیز ذخیره می‌کنیم - آن نمایش عددی معنای آن.

نمای کلی-02

سپس، هنگامی که از Legal Eagle ما سؤالی می‌پرسید، از جستجوی برداری Firestore برای یافتن تکه‌هایی از متن قانونی که بیشترین ارتباط را با درخواست شما دارد، استفاده می‌کنیم. این زمینه بازیابی شده همان چیزی است که RAG برای دادن پاسخ‌هایی به شما استفاده می‌کند که مبتنی بر اطلاعات قانونی واقعی است، نه فقط تخیل LLM!

👉 در یک برگه/پنجره جدید، به Firestore در کنسول Google Cloud بروید.

👉 روی ایجاد پایگاه داده کلیک کنید

ایجاد پایگاه داده

👉 Native mode و نام پایگاه داده را به عنوان (default) انتخاب کنید.

👉 region واحد را انتخاب کنید: us-central1 و روی Create Database کلیک کنید. Firestore پایگاه داده شما را فراهم می کند، که ممکن است چند لحظه طول بکشد.

پایگاه داده پیکربندی

👉 بازگشت به ترمینال Cloud IDE - یک Index Vector در قسمت 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 شروع به ایجاد نمایه برداری می کند. ایجاد نمایه ممکن است کمی طول بکشد، به خصوص برای مجموعه داده های بزرگتر. نمایه را در حالت «ایجاد» می‌بینید، و وقتی ساخته شد به «آماده» تبدیل می‌شود. شاخص آتش نشانی

7. بارگذاری داده ها در فروشگاه Vector

اکنون که RAG و فروشگاه برداری خود را درک کردیم، زمان آن رسیده است که موتوری را بسازیم که کتابخانه قانونی ما را پر می کند! بنابراین، چگونه اسناد قانونی را «قابل جستجو بر اساس معنا» کنیم؟ جادو در تعبیه هاست! جاسازی‌ها را به‌عنوان تبدیل کلمات، جملات یا حتی اسناد کامل به بردارهای عددی در نظر بگیرید - فهرست‌هایی از اعداد که معنای معنایی آن‌ها را نشان می‌دهند. مفاهیم مشابه بردارهایی را دریافت می کنند که در فضای برداری به هم نزدیک هستند. ما از مدل های قدرتمند (مانند مدل های Vertex AI) برای انجام این تبدیل استفاده می کنیم.

و برای خودکار کردن بارگیری سند، از توابع Cloud Run و Eventarc استفاده خواهیم کرد. Cloud Run Functions یک محفظه سبک و بدون سرور است که کد شما را فقط در صورت نیاز اجرا می کند. ما اسکریپت پایتون پردازش اسناد خود را در یک ظرف بسته بندی می کنیم و آن را به عنوان یک تابع اجرای ابری اجرا می کنیم.

نمای کلی-03

👉 در یک برگه/پنجره جدید، به Cloud Storage بروید.

👉 در منوی سمت چپ روی "Buckets" کلیک کنید.

👉 روی دکمه "+ CREATE" در بالا کلیک کنید.

👉 سطل خود را پیکربندی کنید (تنظیمات مهم):

  • نام سطل : 'yourprojectID' -doc-bucket (شما باید پسوند -doc-bucket را در پایان داشته باشید)
  • region : ناحیه us-central1 را انتخاب کنید.
  • کلاس ذخیره سازی : "استاندارد". استاندارد برای داده هایی که اغلب در دسترس هستند مناسب است.
  • کنترل دسترسی : پیش فرض "کنترل دسترسی یکنواخت" را انتخاب کنید. این کنترل دسترسی ثابت و در سطح سطل را فراهم می کند.
  • گزینه های پیشرفته : برای این آموزش، تنظیمات پیش فرض معمولا کافی است.

ایجاد سطل

👉 برای ایجاد سطل خود روی دکمه CREATE کلیک کنید.

👉 ممکن است یک پنجره بازشو در مورد جلوگیری از دسترسی عمومی ببینید. کادر را علامت زده بگذارید و روی «تأیید» کلیک کنید.

اکنون سطل جدید ایجاد شده خود را در لیست Buckets خواهید دید. نام سطل خود را به خاطر بسپارید، بعداً به آن نیاز خواهید داشت.

8. یک عملکرد Cloud Run را تنظیم کنید

👉 در Cloud Shell Code Editor، به دایرکتوری کاری legal-eagle بروید: از دستور cd در ترمینال Cloud Editor برای ایجاد پوشه استفاده کنید.

cd ~/legal-eagle
mkdir loader
cd loader

👉 فایل های main.py ، requirements.txt و Dockerfile ایجاد کنید. در ترمینال Cloud Shell، از دستور لمسی برای ایجاد فایل ها استفاده کنید:

touch main.py requirements.txt Dockerfile

پوشه تازه ایجاد شده به نام *loader و سه فایل را خواهید دید.

👉 main.py در پوشه loader ویرایش کنید. در کاوشگر فایل در سمت چپ، به دایرکتوری که در آن فایل ها را ایجاد کرده اید بروید و روی main.py دوبار کلیک کنید تا آن را در ویرایشگر باز کنید.

کد پایتون زیر را در 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 Function

👉 ما این را در یک محیط مجازی اجرا می کنیم و کتابخانه های 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/

دو ترمینال

👉 در حالی که شبیه ساز در حال اجرا است، می توانید CloudEvents آزمایشی را برای آن ارسال کنید. برای این کار به یک ترمینال جداگانه در 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/

باید اوکی برگردد

👉 داده‌ها را در Firestore تأیید می‌کنید، به Google Cloud Console بروید و به «Databases» سپس «Firestore» بروید و برگه «Data» و سپس مجموعه legal_documents را انتخاب کنید. می بینید که اسناد جدیدی در مجموعه شما ایجاد شده است که هر کدام بخشی از متن فایل آپلود شده را نشان می دهد. NoSQLDB را مرتب کنید

👉 در ترمینالی که شبیه ساز را اجرا می کند، Ctrl+C را برای خروج تایپ کنید. و ترمینال دوم را ببندید.

👉 برای خروج از محیط مجازی، غیرفعال کردن را اجرا کنید.

deactivate

10. تصویر ظرف بسازید و به مخازن Artifacts فشار دهید

👉 زمان استقرار آن در فضای ابری است. در فایل اکسپلورر، روی Dockerfile دوبار کلیک کنید. از Gemini بخواهید فایل docker را برای شما ایجاد کند، 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 کلیک کنید (دو فلش با جهت مخالف، و تغییرات را بپذیرید.) جمینی داکر

👉 اگر با Containers تازه کار هستید، در اینجا یک مثال کار آمده است:

# 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"]

👉 در ترمینال، یک مخزن مصنوعات برای ذخیره تصویر داکری که قرار است بسازیم ایجاد کنید.

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 موجود است.

جمینی داکر

11. تابع Cloud Run را ایجاد کرده و تریگر Eventarc را تنظیم کنید

قبل از پرداختن به جزئیات استقرار بارکننده اسناد قانونی خود، اجازه دهید به طور خلاصه اجزای مربوطه را درک کنیم: Cloud Run یک پلت فرم بدون سرور کاملاً مدیریت شده است که به شما امکان می دهد برنامه های کاربردی کانتینری را به سرعت و به راحتی اجرا کنید. مدیریت زیرساخت را انتزاعی می کند و به شما امکان می دهد روی نوشتن و استقرار کد خود تمرکز کنید.

ما بارگذار سند خود را به عنوان یک سرویس Cloud Run به کار خواهیم برد. اکنون بیایید به تنظیم عملکرد Cloud Run خود ادامه دهیم:

👉 در Google Cloud Console، به Cloud Run بروید.

👉 به Deploy Container رفته و در منوی بازشو روی SERVICE کلیک کنید.

👉 سرویس Cloud Run خود را پیکربندی کنید:

  • تصویر کانتینر : روی «انتخاب» در قسمت URL کلیک کنید. URL تصویری را که به رجیستری Artifact فشار داده‌اید پیدا کنید (به عنوان مثال، us-central1-docker.pkg.dev/your-project-id/my-repository/legal-eagle-loader/yourimage).
  • نام سرویس : legal-eagle-loader
  • منطقه : منطقه us-central1 را انتخاب کنید.
  • احراز هویت : برای اهداف این کارگاه، می‌توانید «اجازه فراخوان‌های احراز هویت نشده» را مجاز کنید. برای تولید، احتمالاً می خواهید دسترسی را محدود کنید.
  • کانتینر، شبکه، امنیت : پیش فرض.

👉 روی CREATE کلیک کنید. Cloud Run سرویس شما را مستقر می کند. Cloud Run

برای راه‌اندازی خودکار این سرویس هنگامی که فایل‌های جدید به سطل ذخیره‌سازی ما اضافه می‌شوند، از Eventarc استفاده می‌کنیم. Eventarc به شما این امکان را می دهد تا با مسیریابی رویدادها از منابع مختلف به خدمات خود ، معماری های رویداد محور ایجاد کنید.

نمای کلی-04

با راه‌اندازی Eventarc، سرویس Cloud Run ما اسناد تازه اضافه‌شده را به‌محض آپلود شدن به‌طور خودکار در Firestore بارگذاری می‌کند و امکان به‌روزرسانی داده‌های بلادرنگ را برای برنامه RAG ما فراهم می‌کند.

👉 در Google Cloud Console، به Triggers زیر EventArc بروید. روی "+ CREATE TRIGGER" کلیک کنید. 👉 پیکربندی Eventarc Trigger:

  • نام ماشه: legal-eagle-upload-trigger .
  • TriggerType: منابع گوگل
  • ارائه‌دهنده رویداد: Cloud Storage را انتخاب کنید.
  • نوع رویداد: google.cloud.storage.object.v1.finalized را انتخاب کنید
  • Cloud Storage Bucket: سطل GCS خود را از منوی کشویی انتخاب کنید.
  • نوع مقصد: "سرویس Cloud Run".
  • خدمات: legal-eagle-loader انتخاب کنید.
  • منطقه: us-central1
  • مسیر: فعلاً این را خالی بگذارید.
  • تمام مجوزهایی را که در صفحه خواسته است اعطا کنید

👉 روی CREATE کلیک کنید. 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 را مانیتور کنید، به Cloud Run -> خدمات legal-eagle-loader -> "Logs" بروید. گزارش‌ها را برای پردازش موفقیت‌آمیز پیام‌ها بررسی کنید، از جمله:

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 تأیید کنید. و مجموعه اسناد قانونی خود را باز کنید.

👉 باید اسناد جدید ایجاد شده در مجموعه خود را ببینید. هر سند یک تکه از متن فایلی را که آپلود کرده اید نشان می دهد و حاوی موارد زیر است:

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

NoSQL Upsert

13. پیاده سازی RAG

LangChain یک چارچوب قدرتمند است که برای ساده سازی توسعه برنامه های کاربردی با مدل های زبان بزرگ (LLM) طراحی شده است. LangChain به جای اینکه مستقیماً با پیچیدگی‌های APIهای LLM، مهندسی سریع و مدیریت داده‌ها دست و پنجه نرم کند، یک لایه انتزاعی سطح بالا ارائه می‌کند. این مؤلفه ها و ابزارهای از پیش ساخته شده را برای کارهایی مانند اتصال به LLM های مختلف (مانند موارد OpenAI، Google یا دیگران)، ساخت زنجیره های پیچیده عملیات (به عنوان مثال، بازیابی داده ها به دنبال خلاصه سازی)، و مدیریت حافظه مکالمه ارائه می دهد.

مخصوصاً برای RAG، فروشگاه‌های Vector در LangChain برای فعال کردن جنبه بازیابی RAG ضروری هستند. آنها پایگاه های داده تخصصی هستند که برای ذخیره سازی و جستجوی کارآمد جاسازی های برداری طراحی شده اند، که در آن قطعات متنی مشابه از نظر معنایی به نقاط نزدیک به هم در فضای برداری نگاشت می شوند. LangChain از لوله کشی سطح پایین مراقبت می کند و به توسعه دهندگان این امکان را می دهد تا بر منطق اصلی و عملکرد برنامه RAG خود تمرکز کنند. این امر زمان و پیچیدگی توسعه را به میزان قابل توجهی کاهش می دهد و به شما این امکان را می دهد که به سرعت برنامه های مبتنی بر RAG را نمونه سازی و استقرار دهید در حالی که از استحکام و مقیاس پذیری زیرساخت Google Cloud استفاده می کنید.

نمای کلی-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 و مدل embedding را راه اندازی کنید. از 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, به 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

👉 برای استقرار برنامه وب در Cloud Run، شبیه عملکرد لودر است. شما تصویر Docker را می سازید، تگ می کنید و به رجیستری Artifact فشار می دهید:

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 Upsert

👉 اکنون، URL مستقر شده را در یک برگه مرورگر جدید باز کنید. می‌توانید با دستیار حقوقی تعامل داشته باشید و سؤالات مربوط به پرونده‌های دادگاهی را که بارگیری کرده‌اید بپرسید (در پوشه court_cases):

  • مایکل براون به چند سال زندان محکوم شد؟
  • در نتیجه اقدامات جین اسمیت چقدر پول در هزینه های غیرمجاز ایجاد شد؟
  • شهادت همسایه ها در بررسی پرونده امیلی وایت چه نقشی داشت؟

👉 اختیاری: نسخه اسپانیایی

  • ¿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 investigation del caso de Emily White؟

باید توجه داشته باشید که اکنون پاسخ ها در محتوای اسناد قانونی که بارگذاری کرده اید دقیق تر و مستدل هستند و قدرت RAG را به نمایش می گذارند!

بابت تکمیل کارگاه تبریک میگم!! شما با استفاده از LLM، LangChain و Google Cloud یک برنامه تحلیل اسناد قانونی را با موفقیت ساخته و به کار گرفته اید. شما یاد گرفته اید که چگونه اسناد قانونی را دریافت و پردازش کنید، پاسخ های LLM را با اطلاعات مربوطه با استفاده از RAG تقویت کنید، و برنامه خود را به عنوان یک سرویس بدون سرور اجرا کنید. این دانش و برنامه ساخته شده به شما کمک می کند تا قدرت LLM را برای وظایف قانونی بیشتر کشف کنید. آفرین!"

14. چالش

انواع رسانه های مختلف:

نحوه دریافت و پردازش انواع رسانه‌های مختلف مانند فیلم‌های دادگاه و ضبط‌های صوتی، و استخراج متن مرتبط.

دارایی آنلاین :

نحوه پردازش دارایی های آنلاین مانند صفحات وب به صورت زنده.