ক্লাউড রানে একটি ল্যাংচেইন অ্যাপ কীভাবে তৈরি এবং স্থাপন করবেন তা শিখুন

১. সংক্ষিপ্ত বিবরণ

এই কোড ল্যাবে, আপনি শিখবেন কীভাবে একটি LangChain অ্যাপ ডেপ্লয় করতে হয়, যা Gemini ব্যবহার করে আপনাকে Cloud Run রিলিজ নোটের উপর প্রশ্ন জিজ্ঞাসা করার সুযোগ দেয়।

অ্যাপটি কীভাবে কাজ করে তার একটি উদাহরণ এখানে দেওয়া হলো: আপনি যদি প্রশ্ন করেন "আমি কি ক্লাউড রান-এ একটি ক্লাউড স্টোরেজ বাকেটকে ভলিউম হিসেবে মাউন্ট করতে পারি?", তাহলে অ্যাপটি উত্তর দেয় "হ্যাঁ, ১৯শে জানুয়ারী, ২০২৪ থেকে", বা এই ধরনের কিছু।

যথাযথ উত্তর দেওয়ার জন্য, অ্যাপটি প্রথমে প্রশ্নটির অনুরূপ ক্লাউড রান রিলিজ নোট সংগ্রহ করে, তারপর প্রশ্নটি এবং রিলিজ নোট উভয়ই দিয়ে জেমিনিকে প্রম্পট করে। (এই প্যাটার্নটি সাধারণত RAG নামে পরিচিত।) এখানে অ্যাপটির আর্কিটেকচার দেখানো একটি ডায়াগ্রাম রয়েছে:

২. সেটআপ এবং প্রয়োজনীয়তা

প্রথমে, আপনার ডেভেলপমেন্ট এনভায়রনমেন্টটি সঠিকভাবে সেট আপ করা হয়েছে কিনা তা নিশ্চিত করে নেওয়া যাক।

  • অ্যাপটির জন্য প্রয়োজনীয় রিসোর্সগুলো ডেপ্লয় করতে আপনার একটি গুগল ক্লাউড প্রজেক্ট লাগবে।
  • অ্যাপটি ডেপ্লয় করার জন্য, আপনার লোকাল মেশিনে gcloud ইনস্টল করা , অথেন্টিকেট করা এবং প্রজেক্টটি ব্যবহারের জন্য কনফিগার করা থাকতে হবে।
    • gcloud auth login
    • gcloud config set project
  • আপনি যদি আপনার লোকাল মেশিনে অ্যাপ্লিকেশনটি চালাতে চান, যা আমি সুপারিশ করি, তাহলে আপনাকে নিশ্চিত করতে হবে যে আপনার অ্যাপ্লিকেশনের ডিফল্ট ক্রেডেনশিয়ালগুলো সঠিকভাবে সেট করা আছে, যার মধ্যে কোটা প্রজেক্ট সেট করাও অন্তর্ভুক্ত।
    • gcloud auth application-default login
    • gcloud auth application-default set-quota-project
  • এছাড়াও আপনাকে নিম্নলিখিত সফ্টওয়্যারগুলি ইনস্টল করতে হবে:
    • পাইথন (সংস্করণ ৩.১১ বা উচ্চতর প্রয়োজন)
    • ল্যাংচেইন সিএলআই
    • নির্ভরশীলতা ব্যবস্থাপনার জন্য কবিতা
    • বিচ্ছিন্ন ভার্চুয়াল পরিবেশে LangChain CLI এবং poetry ইনস্টল ও চালানোর জন্য pipx ব্যবহার করা হয়।

এই ওয়াকথ্রুটির জন্য প্রয়োজনীয় টুলগুলো ইনস্টল করার কাজ শুরু করতে আপনাকে সাহায্য করার জন্য এখানে একটি ব্লগ দেওয়া হলো।

ক্লাউড ওয়ার্কস্টেশন

আপনার লোকাল মেশিনের পরিবর্তে, আপনি গুগল ক্লাউডের ক্লাউড ওয়ার্কস্টেশনও ব্যবহার করতে পারেন। উল্লেখ্য যে, এপ্রিল ২০২৪ অনুযায়ী এটি পাইথন ৩.১১-এর চেয়ে নিম্নতর একটি সংস্করণে চলে, তাই কাজ শুরু করার আগে আপনাকে পাইথন আপগ্রেড করতে হতে পারে।

ক্লাউড এপিআইগুলি সক্রিয় করুন

প্রথমে, আপনি ব্যবহারের জন্য সঠিক গুগল ক্লাউড প্রজেক্টটি কনফিগার করেছেন কিনা তা নিশ্চিত করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud config list project

যদি সঠিক প্রজেক্টটি দেখা না যায়, তাহলে আপনি এই কমান্ডটি দিয়ে তা সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

এখন নিম্নলিখিত API গুলি সক্রিয় করুন:

gcloud services enable \
  bigquery.googleapis.com \
  sqladmin.googleapis.com \
  aiplatform.googleapis.com \
  cloudresourcemanager.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

একটি অঞ্চল নির্বাচন করুন

বিশ্বব্যাপী অনেক স্থানে গুগল ক্লাউড উপলব্ধ আছে, এবং এই ল্যাবের জন্য প্রয়োজনীয় রিসোর্সগুলো স্থাপন করতে আপনাকে একটি বেছে নিতে হবে। আপনার শেল-এ অঞ্চলটিকে একটি এনভায়রনমেন্ট ভেরিয়েবল হিসেবে সেট করুন (পরবর্তী কমান্ডগুলো এই ভেরিয়েবলটি ব্যবহার করবে):

export REGION=us-central1

৩. ভেক্টর ডাটাবেস ইনস্ট্যান্স তৈরি করুন

এই অ্যাপটির একটি গুরুত্বপূর্ণ অংশ হলো ব্যবহারকারীর প্রশ্নের সাথে প্রাসঙ্গিক রিলিজ নোটগুলো খুঁজে বের করা। বিষয়টি আরও স্পষ্ট করে বললে, আপনি যদি ক্লাউড স্টোরেজ সম্পর্কে কোনো প্রশ্ন করেন, তাহলে প্রম্পটে নিম্নলিখিত রিলিজ নোটটি যুক্ত করতে হবে:

আপনি শব্দার্থগতভাবে সাদৃশ্যপূর্ণ রিলিজ নোট খুঁজে বের করতে টেক্সট এমবেডিং এবং একটি ভেক্টর ডেটাবেস ব্যবহার করতে পারেন।

আমি আপনাদের দেখাবো কিভাবে ক্লাউড এসকিউএল-এ পোস্টগ্রেসকিউএল-কে একটি ভেক্টর ডেটাবেস হিসেবে ব্যবহার করতে হয়। একটি নতুন ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করতে কিছুটা সময় লাগে, তাই চলুন এখন সেটাই করা যাক।

gcloud sql instances create sql-instance \
  --database-version POSTGRES_14 \
  --tier db-f1-micro \
  --region $REGION

আপনি এই কমান্ডটি চলতে দিয়ে পরবর্তী ধাপগুলো চালিয়ে যেতে পারেন। এক পর্যায়ে আপনাকে একটি ডাটাবেস তৈরি করতে এবং একজন ব্যবহারকারী যোগ করতে হবে, কিন্তু এখন স্পিনারটি দেখে সময় নষ্ট না করাই ভালো।

PostgreSQL একটি রিলেশনাল ডাটাবেস সার্ভার, এবং Cloud SQL-এর প্রতিটি নতুন ইনস্ট্যান্সে ডিফল্টরূপে pgvector এক্সটেনশনটি ইনস্টল করা থাকে, যার মানে আপনি এটিকে একটি ভেক্টর ডাটাবেস হিসেবেও ব্যবহার করতে পারেন।

৪. ল্যাংচেইন অ্যাপটির কাঠামো তৈরি করুন

চালিয়ে যাওয়ার জন্য, আপনার LangChain CLI এবং ডিপেন্ডেন্সি পরিচালনার জন্য poetry ইনস্টল করা থাকতে হবে। pipx ব্যবহার করে সেগুলো ইনস্টল করার পদ্ধতি নিচে দেওয়া হলো:

pipx install langchain-cli poetry

নিম্নলিখিত কমান্ড ব্যবহার করে LangChain অ্যাপটি স্কাফোল্ড করুন। জিজ্ঞাসা করা হলে, ফোল্ডারটির নাম run-rag এবং এন্টার চেপে প্যাকেজ ইনস্টল করা এড়িয়ে যান:

langchain app new

run-rag ডিরেক্টরিতে প্রবেশ করুন এবং ডিপেন্ডেন্সিগুলো ইনস্টল করুন।

poetry install

আপনি এইমাত্র একটি LangServe অ্যাপ তৈরি করেছেন। LangServe, একটি LangChain চেইনের চারপাশে FastAPI-কে আবৃত করে। এটির সাথে একটি বিল্ট-ইন প্লেগ্রাউন্ড রয়েছে, যা দিয়ে সমস্ত মধ্যবর্তী ধাপসহ প্রম্পট পাঠানো এবং ফলাফল পরীক্ষা করা সহজ হয়। আমি আপনাকে আপনার এডিটরে run-rag ফোল্ডারটি খুলে এর ভেতরে কী আছে তা খতিয়ে দেখার পরামর্শ দিচ্ছি।

৫. ইনডেক্সিং জবটি তৈরি করুন

ওয়েব অ্যাপটি তৈরি করা শুরু করার আগে, চলুন নিশ্চিত করে নিই যে ক্লাউড রান রিলিজ নোটগুলো ক্লাউড এসকিউএল ডেটাবেসে ইনডেক্স করা আছে। এই অংশে, আপনি একটি ইনডেক্সিং জব তৈরি করবেন যা নিম্নলিখিত কাজগুলো করবে:

ইনডেক্সিং কাজটি রিলিজ নোটগুলো গ্রহণ করে, একটি টেক্সট এমবেডিং মডেল ব্যবহার করে সেগুলোকে ভেক্টরে রূপান্তর করে এবং একটি ভেক্টর ডেটাবেসে সংরক্ষণ করে। এর ফলে, নোটগুলোর অর্থগত তাৎপর্যের ওপর ভিত্তি করে একই ধরনের রিলিজ নোট দক্ষতার সাথে অনুসন্ধান করা সম্ভব হয়।

run-rag/app ফোল্ডারে indexer.py নামে একটি ফাইল তৈরি করুন এবং তাতে নিম্নলিখিত বিষয়বস্তু যোগ করুন:

import os
from google.cloud.sql.connector import Connector
import pg8000
from langchain_community.vectorstores.pgvector import PGVector
from langchain_google_vertexai import VertexAIEmbeddings
from google.cloud import bigquery


# Retrieve all Cloud Run release notes from BigQuery 
client = bigquery.Client()
query = """
SELECT
  CONCAT(FORMAT_DATE("%B %d, %Y", published_at), ": ", description) AS release_note
FROM `bigquery-public-data.google_cloud_release_notes.release_notes`
WHERE product_name= "Cloud Run"
ORDER BY published_at DESC
"""
rows = client.query(query)

print(f"Number of release notes retrieved: {rows.result().total_rows}")

# Set up a PGVector instance 
connector = Connector()

def getconn() -> pg8000.dbapi.Connection:
    conn: pg8000.dbapi.Connection = connector.connect(
        os.getenv("DB_INSTANCE_NAME", ""),
        "pg8000",
        user=os.getenv("DB_USER", ""),
        password=os.getenv("DB_PASS", ""),
        db=os.getenv("DB_NAME", ""),
    )
    return conn

store = PGVector(
    connection_string="postgresql+pg8000://",
    use_jsonb=True,
    engine_args=dict(
        creator=getconn,
    ),
    embedding_function=VertexAIEmbeddings(
        model_name="textembedding-gecko@003"
    ),
    pre_delete_collection=True  
)

# Save all release notes into the Cloud SQL database
texts = list(row["release_note"] for row in rows)
ids = store.add_texts(texts)

print(f"Done saving: {len(ids)} release notes")

প্রয়োজনীয় নির্ভরতাগুলো যোগ করুন:

poetry add \
  "cloud-sql-python-connector[pg8000]" \
  langchain-google-vertexai==1.0.5 \
  langchain-community==0.2.5 \
  pgvector

ডাটাবেস এবং একজন ব্যবহারকারী তৈরি করুন

ক্লাউড SQL ইনস্ট্যান্স sql-instance এ একটি ডাটাবেস release-notes তৈরি করুন:

gcloud sql databases create release-notes --instance sql-instance

app নামে একটি ডাটাবেস ব্যবহারকারী তৈরি করুন:

gcloud sql users create app --instance sql-instance --password "myprecious"

ইনডেক্সিং জবটি স্থাপন এবং চালান

এখন জবটি ডেপ্লয় ও রান করুন:

DB_INSTANCE_NAME=$(gcloud sql instances describe sql-instance --format="value(connectionName)")

gcloud run jobs deploy indexer \
  --source . \
  --command python \
  --args app/indexer.py \
  --set-env-vars=DB_INSTANCE_NAME=$DB_INSTANCE_NAME \
  --set-env-vars=DB_USER=app \
  --set-env-vars=DB_NAME=release-notes \
  --set-env-vars=DB_PASS=myprecious \
  --region=$REGION \
  --execute-now

এটা একটা দীর্ঘ কমান্ড, চলুন দেখি কী ঘটছে:

প্রথম কমান্ডটি কানেকশনের নামটি ( project:region:instance ফরম্যাটে থাকা একটি অনন্য আইডি) সংগ্রহ করে এবং সেটিকে DB_INSTANCE_NAME এনভায়রনমেন্ট ভেরিয়েবল হিসেবে সেট করে।

দ্বিতীয় কমান্ডটি ক্লাউড রান জবটি ডেপ্লয় করে। ফ্ল্যাগগুলো যা করে তা নিচে দেওয়া হলো:

  • --source . : এটি নির্দিষ্ট করে যে জবটির সোর্স কোড বর্তমান ওয়ার্কিং ডিরেক্টরিতে (যে ডিরেক্টরিতে আপনি কমান্ডটি চালাচ্ছেন) রয়েছে।
  • --command python : কন্টেইনারের ভিতরে কোন কমান্ডটি চালানো হবে তা নির্ধারণ করে। এক্ষেত্রে, এটি পাইথন চালানোর জন্য।
  • --args app/indexer.py : পাইথন কমান্ডের জন্য আর্গুমেন্ট সরবরাহ করে। এটি app ডিরেক্টরিতে থাকা indexer.py স্ক্রিপ্টটি রান করতে নির্দেশ দেয়।
  • --set-env-vars : পরিবেশ ভেরিয়েবল সেট করে, যেগুলো পাইথন স্ক্রিপ্ট নির্বাহের সময় অ্যাক্সেস করতে পারে।
  • --region=$REGION : যে অঞ্চলে কাজটি স্থাপন করা হবে তা নির্দিষ্ট করে।
  • --execute-now : ক্লাউড রানকে নির্দেশ দেয় যেন জবটি ডিপ্লয় হওয়ার সাথে সাথেই শুরু করা হয়।

কাজটি সফলভাবে সম্পন্ন হয়েছে কিনা তা যাচাই করতে, আপনি নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করতে পারেন:

  • ওয়েব কনসোলের মাধ্যমে জব এক্সিকিউশনের লগগুলো পড়ুন। এতে "Done saving: xxx release notes" (যেখানে xxx হলো সংরক্ষিত রিলিজ নোটের সংখ্যা) লেখাটি রিপোর্ট করা উচিত।
  • এছাড়াও আপনি ওয়েব কনসোলে ক্লাউড এসকিউএল ইনস্ট্যান্সে যেতে পারেন এবং ক্লাউড এসকিউএল স্টুডিও ব্যবহার করে langchain_pg_embedding টেবিলের রেকর্ড সংখ্যা কোয়েরি করতে পারেন।

৬. ওয়েব অ্যাপ্লিকেশনটি লিখুন

আপনার এডিটরে app/server.py ফাইলটি খুলুন। আপনি সেখানে নিম্নলিখিত লেখা সহ একটি লাইন দেখতে পাবেন:

# Edit this to add the chain you want to add

ওই মন্তব্যটি নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:

# (1) Initialize VectorStore
connector = Connector()


def getconn() -> pg8000.dbapi.Connection:
    conn: pg8000.dbapi.Connection = connector.connect(
        os.getenv("DB_INSTANCE_NAME", ""),
        "pg8000",
        user=os.getenv("DB_USER", ""),
        password=os.getenv("DB_PASS", ""),
        db=os.getenv("DB_NAME", ""),
    )
    return conn


vectorstore = PGVector(
    connection_string="postgresql+pg8000://",
    use_jsonb=True,
    engine_args=dict(
        creator=getconn,
    ),
    embedding_function=VertexAIEmbeddings(
        model_name="textembedding-gecko@003"
    )
)

# (2) Build retriever


def concatenate_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)


notes_retriever = vectorstore.as_retriever() | concatenate_docs

# (3) Create prompt template
prompt_template = PromptTemplate.from_template(
    """You are a Cloud Run expert answering questions. 
Use the retrieved release notes to answer questions
Give a concise answer, and if you are unsure of the answer, just say so.

Release notes: {notes}

Here is your question: {query}
Your answer: """)

# (4) Initialize LLM
llm = VertexAI(
    model_name="gemini-1.0-pro-001",
    temperature=0.2,
    max_output_tokens=100,
    top_k=40,
    top_p=0.95
)

# (5) Chain everything together
chain = (
    RunnableParallel({
        "notes": notes_retriever,
        "query": RunnablePassthrough()
    })
    | prompt_template
    | llm
    | StrOutputParser()
)

আপনাকে এই ইম্পোর্টগুলোও যোগ করতে হবে:

import pg8000
import os
from google.cloud.sql.connector import Connector
from langchain_google_vertexai import VertexAI
from langchain_google_vertexai import VertexAIEmbeddings
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_community.vectorstores.pgvector import PGVector

অবশেষে, 'NotImplemented' লেখা লাইনটি পরিবর্তন করে নিম্নলিখিতটি করুন:

# add_routes(app, NotImplemented)
add_routes(app, chain)

৭. ওয়েব অ্যাপ্লিকেশনটি ক্লাউড রান-এ ডেপ্লয় করুন।

run-rag ডিরেক্টরি থেকে, ক্লাউড রানে অ্যাপটি ডেপ্লয় করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

DB_INSTANCE_NAME=$(gcloud sql instances describe sql-instance --format="value(connectionName)")

gcloud run deploy run-rag \
  --source . \
  --set-env-vars=DB_INSTANCE_NAME=$DB_INSTANCE_NAME \
  --set-env-vars=DB_USER=app \
  --set-env-vars=DB_NAME=release-notes \
  --set-env-vars=DB_PASS=myprecious \
  --region=$REGION \
  --allow-unauthenticated

এই কমান্ডটি নিম্নলিখিত কাজগুলো করে:

  • ক্লাউড বিল্ডে সোর্স কোড আপলোড করুন
  • ডকার বিল্ড চালান।
  • প্রাপ্ত কন্টেইনার ইমেজটি আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করুন।
  • কন্টেইনার ইমেজ ব্যবহার করে একটি ক্লাউড রান সার্ভিস তৈরি করুন।

কমান্ডটি সম্পন্ন হলে, এটি run.app ডোমেইনে একটি HTTPS URL তালিকাভুক্ত করে। এটিই আপনার নতুন ক্লাউড রান সার্ভিসের পাবলিক URL।

৮. খেলার মাঠটি ঘুরে দেখুন।

Cloud Run সার্ভিস URL-টি খুলুন এবং /playground এ যান। এতে একটি টেক্সট ফিল্ড আসবে। Cloud Run রিলিজ নোট সম্পর্কে প্রশ্ন করতে এটি ব্যবহার করুন, যেমন এখানে:

৯. অভিনন্দন

আপনি সফলভাবে ক্লাউড রান-এ একটি ল্যাংচেইন অ্যাপ তৈরি ও স্থাপন করেছেন। খুব ভালো!

এখানে মূল ধারণাগুলো দেওয়া হলো:

  • ল্যাংচেইন ফ্রেমওয়ার্ক ব্যবহার করে একটি রিট্রিভাল অগমেন্টেড জেনারেশন (RAG) অ্যাপ্লিকেশন তৈরি করা।
  • Cloud SQL-এ ডিফল্টভাবে ইনস্টল করা pgvector ব্যবহার করে PostgreSQL-কে একটি ভেক্টর ডেটাবেস হিসেবে ব্যবহার করা।
  • একটি দীর্ঘমেয়াদী ইন্ডেক্সিং জবকে ক্লাউড রান জব হিসেবে এবং একটি ওয়েব অ্যাপ্লিকেশনকে ক্লাউড রান সার্ভিস হিসেবে চালান।
  • LangServe ব্যবহার করে একটি LangChain চেইনকে FastAPI অ্যাপ্লিকেশনের মধ্যে আবদ্ধ করুন, যা আপনার RAG অ্যাপের সাথে যোগাযোগের জন্য একটি সুবিধাজনক ইন্টারফেস প্রদান করে।

পরিষ্কার করা

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্টে চার্জ হওয়া এড়াতে:

  • ক্লাউড কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
  • প্রজেক্ট তালিকা থেকে আপনার প্রজেক্টটি নির্বাচন করে ডিলিট-এ ক্লিক করুন।
  • ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।

প্রজেক্টটি রাখতে চাইলে, নিম্নলিখিত রিসোর্সগুলো অবশ্যই ডিলিট করে দিন:

  • ক্লাউড SQL ইনস্ট্যান্স
  • ক্লাউড রান পরিষেবা
  • ক্লাউড রান জব