১. ভূমিকা
আদালতকক্ষের তীব্রতা আমাকে বরাবরই মুগ্ধ করেছে; আমি কল্পনা করতাম, আমি নিপুণভাবে এর জটিলতাগুলো সামলে নিচ্ছি এবং জোরালো সমাপনী যুক্তি উপস্থাপন করছি। যদিও আমার কর্মজীবন আমাকে অন্য পথে নিয়ে গেছে, আমি আনন্দের সাথে জানাচ্ছি যে, কৃত্রিম বুদ্ধিমত্তার (AI) সাহায্যে আমরা সবাই হয়তো সেই আদালতকক্ষের স্বপ্ন পূরণের আরও কাছাকাছি চলে এসেছি।

আজ আমরা আলোচনা করব কীভাবে গুগলের শক্তিশালী এআই টুল—যেমন ভার্টেক্স এআই, ফায়ারস্টোর এবং ক্লাউড রান ফাংশন ব্যবহার করে আইনি ডেটা প্রক্রিয়া ও বোঝা যায়, বিদ্যুতের গতিতে অনুসন্ধান করা যায় এবং হয়তো, আপনার কাল্পনিক মক্কেলকে (বা নিজেকে) কোনো কঠিন পরিস্থিতি থেকে উদ্ধার করা যায়।
আপনি হয়তো কোনো সাক্ষীকে জেরা করছেন না, কিন্তু আমাদের সিস্টেমের সাহায্যে আপনি বিপুল পরিমাণ তথ্য ঘেঁটে, সুস্পষ্ট সারসংক্ষেপ তৈরি করে, এবং কয়েক সেকেন্ডের মধ্যে সবচেয়ে প্রাসঙ্গিক তথ্য উপস্থাপন করতে পারবেন।
২. স্থাপত্য
এই প্রকল্পটি গুগল ক্লাউড এআই টুল ব্যবহার করে একটি আইনি সহকারী তৈরির উপর আলোকপাত করে, যেখানে আইনি ডেটা প্রক্রিয়াকরণ, বোঝা এবং অনুসন্ধানের পদ্ধতির উপর জোর দেওয়া হয়েছে। সিস্টেমটি বিপুল পরিমাণ তথ্য ঘেঁটে দেখা, সারসংক্ষেপ তৈরি করা এবং দ্রুত প্রাসঙ্গিক ডেটা উপস্থাপন করার জন্য ডিজাইন করা হয়েছে। এই আইনি সহকারীর আর্কিটেকচারে বেশ কয়েকটি মূল উপাদান রয়েছে:
অসংগঠিত ডেটা থেকে একটি নলেজ বেস তৈরি করা : আইনি নথি সংরক্ষণের জন্য গুগল ক্লাউড স্টোরেজ (GCS) ব্যবহার করা হয়। ফায়ারস্টোর, একটি NoSQL ডাটাবেস, একটি ভেক্টর স্টোর হিসেবে কাজ করে, যেখানে ডকুমেন্টের চাঙ্ক এবং তাদের সংশ্লিষ্ট এমবেডিংগুলো রাখা হয়। সাদৃশ্য অনুসন্ধানের জন্য ফায়ারস্টোরে ভেক্টর সার্চ সক্রিয় করা থাকে। যখন GCS-এ একটি নতুন আইনি নথি আপলোড করা হয়, তখন ইভেন্টআর্ক একটি ক্লাউড রান ফাংশন চালু করে। এই ফাংশনটি ডকুমেন্টটিকে চাঙ্কে বিভক্ত করে এবং ভার্টেক্স এআই-এর টেক্সট এমবেডিং মডেল ব্যবহার করে প্রতিটি চাঙ্কের জন্য এমবেডিং তৈরি করে। এরপর এই এমবেডিংগুলো টেক্সট চাঙ্কগুলোর পাশাপাশি ফায়ারস্টোরে সংরক্ষণ করা হয়। 
এলএলএম ও র্যাগ দ্বারা চালিত অ্যাপ্লিকেশন : প্রশ্নোত্তর সিস্টেমটির মূল অংশ হলো ask_llm ফাংশন, যা একটি `Vertex AI Gemini Large Language Model`-এর সাথে যোগাযোগের জন্য `langchain` লাইব্রেরি ব্যবহার করে। এটি ব্যবহারকারীর জিজ্ঞাসা থেকে একটি `HumanMessage` তৈরি করে এবং এতে একটি `SystemMessage` অন্তর্ভুক্ত থাকে, যা এলএলএম-কে একজন সহায়ক আইনি সহকারী হিসেবে কাজ করার নির্দেশ দেয়। সিস্টেমটি `Retrieval-Augmented Generation` (RAG) পদ্ধতি ব্যবহার করে, যেখানে কোনো জিজ্ঞাসার উত্তর দেওয়ার আগে, সিস্টেমটি ` search_resource ফাংশন ব্যবহার করে `Firestore` ভেক্টর স্টোর থেকে প্রাসঙ্গিক তথ্য পুনরুদ্ধার করে। এরপর এই তথ্যটি `SystemMessage`-এ অন্তর্ভুক্ত করা হয়, যাতে এলএলএম-এর উত্তরটি প্রদত্ত আইনি তথ্যের উপর ভিত্তি করে প্রতিষ্ঠিত হয়। 
প্রকল্পটির লক্ষ্য হলো RAG ব্যবহারের মাধ্যমে LLM-দের "সৃজনশীল ব্যাখ্যা" থেকে সরে আসা, যা কোনো উত্তর তৈরি করার আগে প্রথমে একটি বিশ্বস্ত আইনি উৎস থেকে প্রাসঙ্গিক তথ্য সংগ্রহ করে। এর ফলে প্রকৃত আইনি তথ্যের উপর ভিত্তি করে আরও নির্ভুল ও সুচিন্তিত উত্তর পাওয়া যায়। এই সিস্টেমটি Google Cloud Shell, Vertex AI, Firestore, Cloud Run এবং Eventarc-এর মতো বিভিন্ন Google Cloud পরিষেবা ব্যবহার করে তৈরি করা হয়েছে।
৩. শুরু করার আগে
গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন। নিশ্চিত করুন যে আপনার ক্লাউড প্রজেক্টের জন্য বিলিং চালু আছে। কোনো প্রজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন তা জানুন ।
ক্লাউড শেল IDE-তে জেমিনি কোড অ্যাসিস্ট সক্রিয় করুন
👉 গুগল ক্লাউড কনসোলে, Gemini Code Assist Tools- এ যান এবং শর্তাবলীতে সম্মত হয়ে বিনামূল্যে Gemini Code Assist চালু করুন।

অনুমতি সেটআপ উপেক্ষা করুন, এই পৃষ্ঠাটি ছেড়ে যান।
ক্লাউড শেল এডিটর নিয়ে কাজ করুন
👉 গুগল ক্লাউড কনসোলের উপরে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন (এটি ক্লাউড শেল পেনের উপরে থাকা টার্মিনাল আকৃতির আইকন)।

👉 'ওপেন এডিটর' বোতামটিতে (এটি দেখতে পেন্সিলসহ একটি খোলা ফোল্ডারের মতো) ক্লিক করুন। এটি উইন্ডোতে ক্লাউড শেল এডিটর খুলে দেবে। আপনি বাম দিকে একটি ফাইল এক্সপ্লোরার দেখতে পাবেন।

👉 দেখানো অনুযায়ী নিচের স্ট্যাটাস বারে থাকা ক্লাউড কোড সাইন-ইন বোতামে ক্লিক করুন। নির্দেশনা অনুযায়ী প্লাগইনটি অনুমোদন করুন। যদি আপনি স্ট্যাটাস বারে 'ক্লাউড কোড - কোনো প্রজেক্ট নেই' দেখতে পান, তাহলে সেটি নির্বাচন করুন, এরপর ড্রপডাউন থেকে 'একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন' এবং তারপর প্রজেক্টের তালিকা থেকে নির্দিষ্ট গুগল ক্লাউড প্রজেক্টটি বেছে নিন, যেটিতে আপনি কাজ করতে চান।

👉 ক্লাউড IDE-তে টার্মিনালটি খুলুন, 
👉 নতুন টার্মিনালে, নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করুন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list
👉 গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’- এ ক্লিক করুন।
gcloud config set project <YOUR_PROJECT_ID>
👉 প্রয়োজনীয় গুগল ক্লাউড এপিআইগুলো সক্রিয় করতে নিচের কমান্ডটি চালান:
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
ক্লাউড শেল টুলবারে (ক্লাউড শেল পেনের উপরে), 'ওপেন এডিটর' বোতামে (এটি দেখতে পেন্সিলসহ একটি খোলা ফোল্ডারের মতো) ক্লিক করুন। এটি উইন্ডোতে ক্লাউড শেল কোড এডিটর খুলে দেবে। আপনি বাম দিকে একটি ফাইল এক্সপ্লোরার দেখতে পাবেন।
👉 টার্মিনালে বুটস্ট্র্যাপ স্কেলেটন প্রজেক্টটি ডাউনলোড করুন:
git clone https://github.com/weimeilin79/legal-eagle.git
ঐচ্ছিক: স্প্যানিশ সংস্করণ
👉 বিদ্যমান ইউনা সংস্করণ বিকল্প এন এস্পানাল। Por favour, utilice la siguiente instrucción para clonar la versión correcta.
git clone -b spanish https://github.com/weimeilin79/legal-eagle.git
ক্লাউড শেল টার্মিনালে এই কমান্ডটি চালানোর পর, আপনার ক্লাউড শেল এনভায়রনমেন্টে legal-eagle রিপোজিটরি নামের একটি নতুন ফোল্ডার তৈরি হবে।
৪. জেমিনি কোড অ্যাসিস্ট ব্যবহার করে ইনফারেন্স অ্যাপ্লিকেশন লেখা
এই অংশে, আমরা আমাদের লিগ্যাল অ্যাসিস্ট্যান্টের মূল অংশ তৈরির উপর মনোযোগ দেব – এটি এমন একটি ওয়েব অ্যাপ্লিকেশন যা ব্যবহারকারীর প্রশ্ন গ্রহণ করে এবং উত্তর তৈরি করার জন্য এআই মডেলের সাথে যোগাযোগ স্থাপন করে। এই ইনফারেন্স অংশের জন্য পাইথন কোড লিখতে আমরা জেমিনি কোড অ্যাসিস্ট (Gemini Code Assist) ব্যবহার করব।

প্রাথমিকভাবে, আমরা একটি ফ্লাস্ক অ্যাপ্লিকেশন তৈরি করব যা ভার্টেক্স এআই জেমিনি মডেলের সাথে সরাসরি যোগাযোগের জন্য ল্যাংচেইন লাইব্রেরি ব্যবহার করবে। এই প্রথম সংস্করণটি মডেলের সাধারণ জ্ঞানের উপর ভিত্তি করে একটি সহায়ক আইনি সহকারী হিসেবে কাজ করবে, কিন্তু এটির কাছে তখনও আমাদের নির্দিষ্ট আদালতের মামলার নথিগুলোর অ্যাক্সেস থাকবে না। এর ফলে, পরবর্তীতে RAG ব্যবহার করে এটিকে উন্নত করার আগে আমরা LLM-এর বেসলাইন পারফরম্যান্স দেখতে পারব।
ক্লাউড কোড এডিটরের এক্সপ্লোরার প্যানে (সাধারণত বাম দিকে), আপনি এখন legal-eagle গিট রিপোজিটরিটি ক্লোন করার সময় তৈরি হওয়া ফোল্ডারটি দেখতে পাবেন। এক্সপ্লোরারে আপনার প্রোজেক্টের রুট ফোল্ডারটি খুলুন। এর ভিতরে আপনি একটি webapp সাবফোল্ডার পাবেন, সেটিও খুলুন। 
👉 ক্লাউড কোড এডিটরে legal.py ফাইলটি সম্পাদনা করুন, আপনি জেমিনি কোড অ্যাসিস্টকে সক্রিয় করতে বিভিন্ন পদ্ধতি ব্যবহার করতে পারেন।
👉 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".
"""

তৈরি হওয়া কোডটি সাবধানে পর্যালোচনা করুন।
- এটা কি আপনার মন্তব্যে বর্ণিত ধাপগুলো মোটামুটিভাবে অনুসরণ করে?
- এটি কি
SystemMessageএবংHumanMessageসহ একটিChatPromptTemplateতৈরি করে? - এতে কি সাধারণ ত্রুটি পরিচালনা (
try...except) অন্তর্ভুক্ত আছে?
তৈরি হওয়া কোডটি ভালো এবং বেশিরভাগই সঠিক হলে, আপনি এটি গ্রহণ করতে পারেন (ইনলাইন সাজেশনের জন্য ট্যাব বা এন্টার চাপুন, অথবা বড় কোড ব্লকের জন্য 'Accept'-এ ক্লিক করুন)।
তৈরি হওয়া কোডটি যদি আপনার মনের মতো না হয়, বা এতে কোনো ভুল থাকে, তাহলে চিন্তা করবেন না! জেমিনি কোড অ্যাসিস্ট আপনাকে সাহায্য করার জন্য একটি টুল, প্রথম চেষ্টাতেই নিখুঁত কোড লেখার জন্য নয়।
তৈরি হওয়া কোডটিকে আরও পরিমার্জিত করতে, ভুল সংশোধন করতে এবং আপনার প্রয়োজন অনুযায়ী আরও ভালোভাবে মেলাতে সম্পাদনা ও পরিবর্তন করুন। আপনি কোড অ্যাসিস্ট চ্যাট প্যানেলে আরও মন্তব্য যোগ করে বা নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করে জেমিনি কোড অ্যাসিস্টকে আরও সাহায্য করতে পারেন।
আর আপনি যদি 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 খুলুন। legal.py ফাইলে যেভাবে ask_llm তৈরি করেছিলেন, ঠিক সেভাবেই Gemini Code Assist ব্যবহার করে Flask Route এবং ask_question ফাংশনটি তৈরি করুন। main.py ফাইলে কমেন্ট হিসেবে নিম্নলিখিত PROMPT-টি টাইপ করুন: (নিশ্চিত করুন যে এটি 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__":
.....
তৈরি করা কোডটি ভালো এবং বেশিরভাগ ক্ষেত্রে সঠিক হলেই কেবল গ্রহণ করুন। আপনি যদি পাইথনের সাথে পরিচিত না হন, তবে এখানে একটি কার্যকর উদাহরণ দেওয়া হলো; এটি কপি করে আপনার main.py ফাইলে আগে থেকে থাকা কোডের নিচে পেস্ট করুন।
👉 ওয়েব অ্যাপ্লিকেশনটি চালু করার আগে নিম্নলিখিতটি পেস্ট করতে ভুলবেন না (যদি নাম == "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 চালু করতে, আপনার প্রজেক্ট সেট আপ করতে এবং এটি ব্যবহার করে আপনার main.py ফাইলে ask ফাংশনটি তৈরি করতে সক্ষম হবেন।
৫. ক্লাউড এডিটরে স্থানীয় পরীক্ষা
👉 এডিটরের টার্মিনালে, প্রয়োজনীয় লাইব্রেরিগুলো ইনস্টল করুন এবং স্থানীয়ভাবে ওয়েব 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
ক্লাউড শেল টার্মিনালের আউটপুটে স্টার্টআপ মেসেজগুলো দেখুন। ফ্লাস্ক সাধারণত এটি চলছে কিনা এবং কোন পোর্টে চলছে তা জানিয়ে মেসেজ প্রিন্ট করে।
- http://127.0.0.1:8080-এ চলছে
অনুরোধগুলি সম্পাদন করার জন্য অ্যাপ্লিকেশনটিকে চালু রাখতে হবে।
👉 'ওয়েব প্রিভিউ' মেনু থেকে, 'Preview on port 8080 ' বিকল্পটি বেছে নিন। ক্লাউড শেল আপনার অ্যাপ্লিকেশনের ওয়েব প্রিভিউ সহ একটি নতুন ব্রাউজার ট্যাব বা উইন্ডো খুলবে। 
👉 অ্যাপ্লিকেশন ইন্টারফেসে, আইনি মামলার রেফারেন্স সম্পর্কিত কয়েকটি প্রশ্ন টাইপ করুন এবং দেখুন 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 investigación del caso de Emily White?
উত্তরগুলো ভালোভাবে দেখলে আপনি সম্ভবত লক্ষ্য করবেন যে, মডেলটি বিভ্রমের শিকার হতে পারে, অস্পষ্ট বা সাধারণ উত্তর দিতে পারে এবং কখনও কখনও আপনার প্রশ্নগুলো ভুলভাবে ব্যাখ্যা করতে পারে, বিশেষ করে যেহেতু এটির কাছে এখনও নির্দিষ্ট আইনি নথিপত্রের অ্যাক্সেস নেই।
👉 Ctrl+C চেপে স্ক্রিপ্টটি বন্ধ করুন।
👉 ভার্চুয়াল এনভায়রনমেন্ট থেকে বের হতে, টার্মিনালে চালান:
deactivate
৬. ভেক্টর স্টোর স্থাপন করা
আইনের এই এলএলএম-এর 'সৃজনশীল ব্যাখ্যা'র অবসান ঘটানোর সময় এসেছে। আর এখানেই রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG) ত্রাতা হিসেবে এগিয়ে আসে! এটিকে এমনভাবে ভাবুন যেন আপনার প্রশ্নের উত্তর দেওয়ার ঠিক আগে আমাদের এলএলএম-কে একটি অতি-শক্তিশালী আইনি লাইব্রেরিতে প্রবেশাধিকার দেওয়া হচ্ছে। শুধুমাত্র তার সাধারণ জ্ঞানের উপর নির্ভর করার পরিবর্তে (যা মডেলের উপর নির্ভর করে অস্পষ্ট বা পুরোনো হতে পারে), RAG প্রথমে একটি বিশ্বস্ত উৎস থেকে প্রাসঙ্গিক তথ্য সংগ্রহ করে – আমাদের ক্ষেত্রে, আইনি নথি – এবং তারপর সেই প্রেক্ষাপট ব্যবহার করে আরও বেশি তথ্যসমৃদ্ধ ও নির্ভুল একটি উত্তর তৈরি করে। এটা অনেকটা আদালতে প্রবেশের আগে এলএলএম-এর হোমওয়ার্ক করে নেওয়ার মতো!
আমাদের RAG সিস্টেম তৈরি করার জন্য, সেই সমস্ত আইনি নথি সংরক্ষণ করার এবং, সবচেয়ে গুরুত্বপূর্ণভাবে, সেগুলোকে অর্থ অনুযায়ী অনুসন্ধানযোগ্য করার জন্য একটি জায়গার প্রয়োজন। আর এখানেই ফায়ারস্টোরের ভূমিকা! ফায়ারস্টোর হলো গুগল ক্লাউডের একটি নমনীয় ও সম্প্রসারণযোগ্য NoSQL ডকুমেন্ট ডেটাবেস।
আমরা আমাদের ভেক্টর স্টোর হিসেবে ফায়ারস্টোর ব্যবহার করব। আমরা আমাদের আইনি নথিগুলোর খণ্ডাংশ ফায়ারস্টোরে সংরক্ষণ করব এবং প্রতিটি খণ্ডাংশের জন্য, আমরা এর এমবেডিংও সংরক্ষণ করব – অর্থাৎ এর অর্থের সাংখ্যিক উপস্থাপনা।

এরপর, যখন আপনি আমাদের লিগ্যাল ঈগলকে কোনো প্রশ্ন করবেন, আমরা ফায়ারস্টোরের ভেক্টর সার্চ ব্যবহার করে আপনার প্রশ্নের জন্য সবচেয়ে প্রাসঙ্গিক আইনি পাঠ্যাংশগুলো খুঁজে বের করব। এই সংগৃহীত প্রেক্ষাপট ব্যবহার করেই RAG আপনাকে এমন উত্তর দেয় যা প্রকৃত আইনি তথ্যের উপর ভিত্তি করে তৈরি, শুধু LLM-এর কল্পনাপ্রসূত নয়!
👉 একটি নতুন ট্যাব/উইন্ডোতে, Google Cloud কনসোলে থাকা Firestore-এ যান।
👉 ডেটাবেস তৈরি করুন- এ ক্লিক করুন

👉 Native mode এবং ডেটাবেসের নাম (default) হিসেবে বেছে নিন।
👉 একটি region নির্বাচন করুন: us-central1 , এবং 'Create Database'-এ ক্লিক করুন। Firestore আপনার ডেটাবেসটি প্রস্তুত করবে, যাতে কয়েক মুহূর্ত সময় লাগতে পারে।

👉 ক্লাউড IDE-র টার্মিনালে ফিরে এসে, আপনার legal_documents কালেকশনে ভেক্টর সার্চ চালু করার জন্য embedding_vector ফিল্ডের উপর একটি ভেক্টর ইনডেক্স তৈরি করুন।
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}
ফায়ারস্টোর ভেক্টর ইনডেক্স তৈরি করা শুরু করবে। ইনডেক্স তৈরি হতে কিছুটা সময় লাগতে পারে, বিশেষ করে বড় ডেটাসেটের ক্ষেত্রে। আপনি ইনডেক্সটিকে "Creating" অবস্থায় দেখতে পাবেন এবং এটি তৈরি হয়ে গেলে "Ready" অবস্থায় চলে যাবে। 
৭. ভেক্টর স্টোরে ডেটা লোড করা
এখন যেহেতু আমরা RAG এবং আমাদের ভেক্টর স্টোর সম্পর্কে বুঝেছি, তাই আমাদের আইনি লাইব্রেরিটি সমৃদ্ধ করার জন্য ইঞ্জিনটি তৈরি করার সময় এসেছে! তাহলে, আমরা কীভাবে আইনি নথিগুলোকে 'অর্থ অনুসারে অনুসন্ধানযোগ্য' করে তুলব? এর জাদুটা রয়েছে এমবেডিং-এর মধ্যে! এমবেডিং-কে এভাবে ভাবুন যে, এটি শব্দ, বাক্য, বা এমনকি পুরো নথিকে সংখ্যাসূচক ভেক্টরে রূপান্তরিত করে – অর্থাৎ সংখ্যার তালিকা যা তাদের শব্দার্থগত অর্থকে ধারণ করে। একই ধরনের ধারণাগুলো ভেক্টর স্পেসে একে অপরের 'কাছাকাছি' ভেক্টর পায়। এই রূপান্তরটি করার জন্য আমরা শক্তিশালী মডেল (যেমন Vertex AI-এর মডেল) ব্যবহার করি।
এবং আমাদের ডকুমেন্ট লোডিং স্বয়ংক্রিয় করতে, আমরা ক্লাউড রান ফাংশন এবং ইভেন্টআর্ক ব্যবহার করব। ক্লাউড রান ফাংশন হলো একটি হালকা, সার্ভারবিহীন কন্টেইনার যা আপনার কোড শুধুমাত্র প্রয়োজনের সময়ই চালায়। আমরা আমাদের ডকুমেন্ট প্রসেসিং পাইথন স্ক্রিপ্টটিকে একটি কন্টেইনারে প্যাকেজ করে ক্লাউড রান ফাংশন হিসেবে ডেপ্লয় করব।

👉 একটি নতুন ট্যাব/উইন্ডোতে ক্লাউড স্টোরেজ- এ যান।
👉 বাম দিকের মেনুতে 'Buckets'-এ ক্লিক করুন।
👉 উপরে থাকা "+ CREATE" বোতামটিতে ক্লিক করুন।
👉 আপনার বাকেট কনফিগার করুন (গুরুত্বপূর্ণ সেটিংস):
- বাকেটের নাম : 'আপনারপ্রজেক্টআইডি' -ডক-বাকেট (আপনাকে অবশ্যই শেষে -ডক-বাকেট সাফিক্সটি যোগ করতে হবে)
- অঞ্চল :
us-central1অঞ্চলটি নির্বাচন করুন। - স্টোরেজ ক্লাস : 'স্ট্যান্ডার্ড'। ঘন ঘন ব্যবহৃত ডেটার জন্য স্ট্যান্ডার্ড উপযুক্ত।
- অ্যাক্সেস কন্ট্রোল : ডিফল্ট "ইউনিফর্ম অ্যাক্সেস কন্ট্রোল" নির্বাচিত রাখুন। এটি বাকেট-স্তরে সামঞ্জস্যপূর্ণ অ্যাক্সেস কন্ট্রোল প্রদান করে।
- উন্নত বিকল্পসমূহ : এই টিউটোরিয়ালের জন্য সাধারণত ডিফল্ট সেটিংসই যথেষ্ট।

👉 আপনার বাকেট তৈরি করতে CREATE বাটনে ক্লিক করুন।
👉 আপনি সর্বসাধারণের প্রবেশাধিকার প্রতিরোধ সংক্রান্ত একটি পপ-আপ দেখতে পারেন। বক্সটি চেক করা অবস্থায় রেখে 'নিশ্চিত করুন'-এ ক্লিক করুন।
আপনি এখন আপনার নতুন তৈরি করা বাকেটটি বাকেট তালিকায় দেখতে পাবেন। আপনার বাকেটের নামটি মনে রাখবেন, পরে এটির প্রয়োজন হবে।
৮. একটি ক্লাউড রান ফাংশন সেট আপ করুন
👉 ক্লাউড শেল কোড এডিটরে, legal-eagle ওয়ার্কিং ডিরেক্টরিতে যান: ফোল্ডারটি তৈরি করতে ক্লাউড এডিটর টার্মিনালে cd কমান্ড ব্যবহার করুন।
cd ~/legal-eagle
mkdir loader
cd loader
👉 main.py , requirements.txt এবং Dockerfile ফাইলগুলো তৈরি করুন। ক্লাউড শেল টার্মিনালে, touch কমান্ড ব্যবহার করে ফাইলগুলো তৈরি করুন:
touch main.py requirements.txt Dockerfile
আপনি *loader নামের নতুন তৈরি হওয়া ফোল্ডারটি এবং তিনটি ফাইল দেখতে পাবেন।
👉 loader ফোল্ডারের অধীনে থাকা main.py সম্পাদনা করুন। বাম দিকের ফাইল এক্সপ্লোরারে, আপনি যেখানে ফাইলগুলো তৈরি করেছেন সেই ডিরেক্টরিতে যান এবং এডিটরে খোলার জন্য main.py উপর ডাবল-ক্লিক করুন।
নিম্নলিখিত পাইথন কোডটি main.py ফাইলে পেস্ট করুন:
এই অ্যাপ্লিকেশনটি GCS বাকেটে আপলোড করা নতুন ফাইলগুলো প্রসেস করে, টেক্সটকে বিভিন্ন খণ্ডে বিভক্ত করে, প্রতিটি খণ্ডের জন্য এমবেডিং তৈরি করে এবং খণ্ডগুলো ও তাদের এমবেডিংগুলো ফায়ারস্টোরে সংরক্ষণ করে।
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
৯. ক্লাউড রান ফাংশন পরীক্ষা ও বিল্ড করুন
👉 আমরা এটি একটি ভার্চুয়াল এনভায়রনমেন্টে চালাব এবং ক্লাউড রান ফাংশনের জন্য প্রয়োজনীয় পাইথন লাইব্রেরিগুলো ইনস্টল করব।
cd ~/legal-eagle/loader
python -m venv env
source env/bin/activate
pip install -r requirements.txt
👉 ক্লাউড রান ফাংশনের জন্য একটি স্থানীয় এমুলেটর চালু করুন
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/
এটি OK ফেরত দেবে।
👉 ফায়ারস্টোরে ডেটা যাচাই করতে, গুগল ক্লাউড কনসোলে যান এবং "Databases" থেকে "Firestore"-এ নেভিগেট করুন, এরপর "Data" ট্যাব এবং তারপর legal_documents কালেকশনটি নির্বাচন করুন। আপনি দেখতে পাবেন যে আপনার কালেকশনে নতুন ডকুমেন্ট তৈরি হয়েছে, যার প্রতিটি আপলোড করা ফাইলের টেক্সটের একটি অংশকে উপস্থাপন করছে। 
👉 যে টার্মিনালে এমুলেটরটি চলছে, সেখান থেকে বের হওয়ার জন্য Ctrl+C চাপুন। এবং দ্বিতীয় টার্মিনালটিও বন্ধ করে দিন।
👉 ভার্চুয়াল পরিবেশ থেকে বের হতে ডিঅ্যাক্টিভেট (deactivate) চালান।
deactivate
১০. কন্টেইনার ইমেজ তৈরি করুন এবং আর্টিফ্যাক্টস রিপোজিটরিগুলোতে পুশ করুন।
👉 এবার এটিকে ক্লাউডে ডেপ্লয় করার পালা। ফাইল এক্সপ্লোরারে, Dockerfile-এর উপর ডাবল-ক্লিক করুন। আপনার জন্য ডকারফাইলটি তৈরি করতে Gemini-কে বলুন, 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)-এর উপর ওপেন ফাইল (Open File) অপশনে ক্লিক করে (বিপরীতমুখী দুটি তীর চিহ্ন দেখে) পরিবর্তনগুলো গ্রহণ করার পরামর্শ দেওয়া হচ্ছে। 
👉 আপনি যদি কন্টেইনার ব্যবহারে নতুন হন, তাহলে এখানে একটি কার্যকরী উদাহরণ দেওয়া হলো:
# 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] দেখতে পাবেন।
👉 ডকার ইমেজটি বিল্ড করতে নিচের কমান্ডটি চালান।
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
ডকার ইমেজটি এখন my-repository আর্টিফ্যাক্টস রিপোজিটরিতে পাওয়া যাচ্ছে।

১১. ক্লাউড রান ফাংশন তৈরি করুন এবং ইভেন্টার্ক ট্রিগার সেট আপ করুন।
আমাদের লিগ্যাল ডকুমেন্ট লোডার ডেপ্লয়মেন্টের বিস্তারিত বিবরণে যাওয়ার আগে, চলুন এর সাথে জড়িত উপাদানগুলো সংক্ষেপে জেনে নিই: ক্লাউড রান হলো একটি সম্পূর্ণভাবে পরিচালিত সার্ভারলেস প্ল্যাটফর্ম যা আপনাকে দ্রুত এবং সহজে কন্টেইনারাইজড অ্যাপ্লিকেশন ডেপ্লয় করতে দেয়। এটি ইনফ্রাস্ট্রাকচার ম্যানেজমেন্টের ঝামেলা দূর করে, ফলে আপনি আপনার কোড লেখা এবং ডেপ্লয়মেন্টের উপর মনোযোগ দিতে পারেন।
আমরা আমাদের ডকুমেন্ট লোডারটিকে একটি ক্লাউড রান সার্ভিস হিসেবে ডেপ্লয় করব। এখন, চলুন আমাদের ক্লাউড রান ফাংশনটি সেট আপ করার কাজে এগিয়ে যাই:
👉 গুগল ক্লাউড কনসোলে, ক্লাউড রান -এ যান।
👉 Deploy Container- এ যান এবং ড্রপডাউন থেকে SERVICE- এ ক্লিক করুন।
👉 আপনার ক্লাউড রান পরিষেবা কনফিগার করুন:
- কন্টেইনার ইমেজ : URL ফিল্ডে 'Select'-এ ক্লিক করুন। আর্টিফ্যাক্ট রেজিস্ট্রি-তে আপনার পুশ করা ইমেজ URL-টি খুঁজুন (যেমন, us-central1-docker.pkg.dev/your-project-id/my-repository/legal-eagle-loader/yourimage)।
- পরিষেবার নাম :
legal-eagle-loader - অঞ্চল :
us-central1অঞ্চলটি নির্বাচন করুন। - প্রমাণীকরণ : এই কর্মশালার জন্য, আপনি "প্রমাণীকরণবিহীন আহ্বানের অনুমতি দিন" বিকল্পটি চালু করতে পারেন। প্রোডাকশনের জন্য, আপনি সম্ভবত অ্যাক্সেস সীমাবদ্ধ করতে চাইবেন।
- কন্টেইনার, নেটওয়ার্কিং, নিরাপত্তা : ডিফল্ট।
👉 CREATE-এ ক্লিক করুন। Cloud Run আপনার সার্ভিসটি ডেপ্লয় করবে। 
আমাদের স্টোরেজ বাকেটে নতুন ফাইল যুক্ত হলে এই সার্ভিসটি স্বয়ংক্রিয়ভাবে চালু করার জন্য, আমরা ইভেন্টআর্ক (Eventarc ) ব্যবহার করব। ইভেন্টআর্ক আপনাকে বিভিন্ন উৎস থেকে আপনার সার্ভিসগুলোতে ইভেন্ট রাউটিং করার মাধ্যমে ইভেন্ট-চালিত আর্কিটেকচার তৈরি করতে সাহায্য করে।

ইভেন্টআর্ক সেট আপ করার মাধ্যমে, আমাদের ক্লাউড রান পরিষেবাটি নতুন যুক্ত হওয়া ডকুমেন্টগুলো আপলোড হওয়ার সাথে সাথেই স্বয়ংক্রিয়ভাবে ফায়ারস্টোরে লোড করে নেবে, যা আমাদের RAG অ্যাপ্লিকেশনের জন্য রিয়েল-টাইম ডেটা আপডেট সক্ষম করবে।
👉 গুগল ক্লাউড কনসোলে, EventArc-এর অধীনে Triggers- এ যান। "+ CREATE TRIGGER"-এ ক্লিক করুন। 👉 Eventarc ট্রিগার কনফিগার করুন:
- ট্রিগারের নাম:
legal-eagle-upload-trigger. - ট্রিগারটাইপ: গুগল উৎস
- ইভেন্ট প্রদানকারী: ক্লাউড স্টোরেজ নির্বাচন করুন।
- ইভেন্টের ধরণ:
google.cloud.storage.object.v1.finalizedনির্বাচন করুন - ক্লাউড স্টোরেজ বাকেট: ড্রপডাউন থেকে আপনার GCS বাকেটটি নির্বাচন করুন।
- গন্তব্যের ধরণ: "ক্লাউড রান পরিষেবা"।
- পরিষেবা:
legal-eagle-loaderনির্বাচন করুন। - অঞ্চল:
us-central1 - পথ: আপাতত এটি খালি রাখুন।
- পৃষ্ঠায় চাওয়া সমস্ত অনুমতি প্রদান করুন।
👉 CREATE-এ ক্লিক করুন। Eventarc এখন ট্রিগারটি সেট আপ করবে।
ক্লাউড রান সার্ভিসের বিভিন্ন কম্পোনেন্ট থেকে ফাইল পড়ার জন্য অনুমতির প্রয়োজন। আমাদের সার্ভিসটির সার্ভিস অ্যাকাউন্টকে প্রয়োজনীয় অনুমতি প্রদান করতে হবে।


১২. আইনি নথিগুলি 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/
ক্লাউড রান সার্ভিস লগ নিরীক্ষণ করতে, 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..."
লগগুলিতে কোনো ত্রুটির বার্তা আছে কিনা তা দেখুন এবং প্রয়োজনে সমস্যা সমাধান করুন। 
👉 ফায়ারস্টোরে ডেটা যাচাই করুন। এবং আপনার legal_documents কালেকশনটি খুলুন।
👉 আপনি আপনার সংগ্রহে নতুন তৈরি হওয়া ডকুমেন্টগুলো দেখতে পাবেন। প্রতিটি ডকুমেন্ট আপনার আপলোড করা ফাইলের পাঠ্যাংশের একটি অংশ উপস্থাপন করবে এবং এতে থাকবে:
metadata: currently empty
original_text_chunk: The text chunk content.
embedding_: A list of floating-point numbers (the Vertex AI embedding).

১৩. RAG বাস্তবায়ন
ল্যাংচেইন হলো একটি শক্তিশালী ফ্রেমওয়ার্ক, যা লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) দ্বারা চালিত অ্যাপ্লিকেশনগুলোর উন্নয়নকে সহজ করার জন্য ডিজাইন করা হয়েছে। LLM API-এর জটিলতা, প্রম্পট ইঞ্জিনিয়ারিং এবং ডেটা হ্যান্ডলিং নিয়ে সরাসরি কাজ করার পরিবর্তে, ল্যাংচেইন একটি উচ্চ-স্তরের অ্যাবস্ট্রাকশন লেয়ার প্রদান করে। এটি বিভিন্ন LLM-এর (যেমন OpenAI, Google বা অন্যান্য) সাথে সংযোগ স্থাপন, জটিল অপারেশন চেইন তৈরি (উদাহরণস্বরূপ, ডেটা পুনরুদ্ধারের পর সারসংক্ষেপ তৈরি) এবং কনভারসেশনাল মেমরি পরিচালনার মতো কাজের জন্য আগে থেকে তৈরি কম্পোনেন্ট ও টুলস সরবরাহ করে।
বিশেষ করে RAG-এর ক্ষেত্রে, এর ডেটা পুনরুদ্ধারের দিকটি সক্ষম করার জন্য LangChain-এর ভেক্টর স্টোরগুলো অপরিহার্য। এগুলো হলো বিশেষায়িত ডেটাবেস, যা ভেক্টর এমবেডিং দক্ষতার সাথে সংরক্ষণ ও কোয়েরি করার জন্য ডিজাইন করা হয়েছে। এখানে অর্থগতভাবে একই রকম টেক্সটের অংশগুলোকে ভেক্টর স্পেসে কাছাকাছি থাকা পয়েন্টগুলোর সাথে ম্যাপ করা হয়। LangChain এর অভ্যন্তরীণ ব্যবস্থাপনার দায়িত্ব নেয়, ফলে ডেভেলপাররা তাদের RAG অ্যাপ্লিকেশনের মূল লজিক এবং কার্যকারিতার উপর মনোযোগ দিতে পারেন। এটি ডেভেলপমেন্টের সময় এবং জটিলতা উল্লেখযোগ্যভাবে কমিয়ে দেয়, যার ফলে আপনি Google Cloud পরিকাঠামোর দৃঢ়তা এবং স্কেলেবিলিটির সুবিধা নিয়ে দ্রুত RAG-ভিত্তিক অ্যাপ্লিকেশনগুলোর প্রোটোটাইপ তৈরি ও স্থাপন করতে পারেন।

LangChain সম্পর্কে ব্যাখ্যা করার পর, RAG বাস্তবায়নের জন্য আপনাকে এখন webapp ফোল্ডারের অধীনে থাকা legal.py ফাইলটি আপডেট করতে হবে। এর ফলে LLM উত্তর দেওয়ার আগে Firestore-এ প্রাসঙ্গিক নথি অনুসন্ধান করতে পারবে।
👉 langchain এবং vertexai থেকে FirestoreVectorStore এবং অন্যান্য প্রয়োজনীয় মডিউল ইম্পোর্ট করুন। বর্তমান 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,)
👉 ইনিশিয়ালাইজ করা এমবেডিং মডেল ব্যবহার করে এবং কন্টেন্ট ও এমবেডিং ফিল্ডগুলো নির্দিষ্ট করে legal_documents কালেকশনকে নির্দেশ করে একটি FirestoreVectorStore তৈরি করুন। পূর্ববর্তী এমবেডিং মডেল কোডের ঠিক পরেই এটি যুক্ত করুন।
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 ব্যবহার করে সাদৃশ্য অনুসন্ধান (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,
👉 legal.py-তে RAG প্রয়োগ করার পর, ডেপ্লয় করার আগে আপনার লোকালি এটি পরীক্ষা করে দেখা উচিত। এই কমান্ডটি দিয়ে অ্যাপ্লিকেশনটি চালান:
cd ~/legal-eagle/webapp
source env/bin/activate
python main.py
👉 অ্যাপ্লিকেশনটি অ্যাক্সেস করতে ওয়েবপ্রিভিউ ব্যবহার করুন, অ্যাসিস্ট্যান্সের সাথে কথা বলুন এবং স্থানীয়ভাবে চালিত প্রসেসটি বন্ধ করতে ctrl+c চাপুন। আর ভার্চুয়াল এনভায়রনমেন্ট থেকে বের হতে ডিঅ্যাকটিভেট (deactivate) চালান।
deactivate
👉 ক্লাউড রান-এ ওয়েব অ্যাপ্লিকেশনটি ডেপ্লয় করার পদ্ধতিটি লোডার ফাংশনের মতোই। আপনাকে ডকার ইমেজটি বিল্ড, ট্যাগ এবং আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করতে হবে:
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
👉 এখন ওয়েব অ্যাপ্লিকেশনটি গুগল ক্লাউডে ডেপ্লয় করার সময়। টার্মিনালে এই কমান্ডগুলো চালান:
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
Google Cloud Console-এর Cloud Run-এ গিয়ে ডেপ্লয়মেন্ট যাচাই করুন। আপনি legal-eagle-webapp নামের একটি নতুন সার্ভিস তালিকাভুক্ত দেখতে পাবেন।

সার্ভিসটির বিস্তারিত পেজে যেতে সেটিতে ক্লিক করুন, আপনি উপরে ডেপ্লয় করা URL-টি খুঁজে পাবেন। 
👉 এখন, স্থাপন করা 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 investigación del caso de Emily White?
আপনি লক্ষ্য করবেন যে, উত্তরগুলো এখন আরও নির্ভুল এবং আপনার আপলোড করা আইনি নথিপত্রের বিষয়বস্তুর ওপর ভিত্তি করে তৈরি, যা RAG-এর শক্তিকে তুলে ধরে!
কর্মশালাটি সফলভাবে সম্পন্ন করার জন্য অভিনন্দন!! আপনি LLM, LangChain, এবং Google Cloud ব্যবহার করে একটি আইনি নথি বিশ্লেষণ অ্যাপ্লিকেশন সফলভাবে তৈরি ও স্থাপন করেছেন। আপনি শিখেছেন কীভাবে আইনি নথি গ্রহণ ও প্রক্রিয়াকরণ করতে হয়, RAG ব্যবহার করে প্রাসঙ্গিক তথ্য দিয়ে LLM-এর প্রতিক্রিয়াগুলোকে সমৃদ্ধ করতে হয়, এবং আপনার অ্যাপ্লিকেশনটিকে একটি সার্ভারবিহীন পরিষেবা হিসেবে স্থাপন করতে হয়। এই জ্ঞান এবং নির্মিত অ্যাপ্লিকেশনটি আপনাকে আইনি কাজের জন্য LLM-এর সক্ষমতা আরও অন্বেষণ করতে সাহায্য করবে। খুব ভালো করেছেন!
১৪. চ্যালেঞ্জ
বিভিন্ন ধরণের মিডিয়া: :
আদালতের ভিডিও এবং অডিও রেকর্ডিংয়ের মতো বিভিন্ন ধরনের মিডিয়া কীভাবে গ্রহণ ও প্রক্রিয়াজাত করতে হয় এবং প্রাসঙ্গিক টেক্সট বের করতে হয়।
অনলাইন সম্পদ :
ওয়েব পেজের মতো অনলাইন অ্যাসেটগুলো কীভাবে লাইভ প্রসেস করতে হয়।