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

1. ওভারভিউ

এই কোড ল্যাবে, আপনি ক্লাউড রান রিলিজ নোটের উপর প্রশ্ন জিজ্ঞাসা করতে জেমিনি ব্যবহার করে এমন একটি LangChain অ্যাপ কীভাবে স্থাপন করবেন তা শিখবেন।

অ্যাপটি কীভাবে কাজ করে তার একটি উদাহরণ এখানে দেওয়া হল: আপনি যদি প্রশ্ন করেন "আমি কি ক্লাউড রানে ভলিউম হিসাবে একটি ক্লাউড স্টোরেজ বালতি মাউন্ট করতে পারি?", অ্যাপটি "হ্যাঁ, 19 জানুয়ারী, 2024 সাল থেকে" বা অনুরূপ কিছু দিয়ে উত্তর দেয়।

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

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

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

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

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

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

আপনার স্থানীয় মেশিনের পরিবর্তে, আপনি Google ক্লাউডে ক্লাউড ওয়ার্কস্টেশনগুলিও ব্যবহার করতে পারেন। মনে রাখবেন যে এপ্রিল 2024 পর্যন্ত এটি 3.11 এর চেয়ে কম একটি পাইথন সংস্করণ চালায়, তাই আপনাকে শুরু করার আগে পাইথন আপগ্রেড করতে হতে পারে।

ক্লাউড এপিআই সক্ষম করুন

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

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

একটি অঞ্চল চয়ন করুন

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

export REGION=us-central1

3. ভেক্টর ডাটাবেস উদাহরণ তৈরি করুন

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

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

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

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

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

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

4. ল্যাংচেইন অ্যাপ স্ক্যাফোল্ড করুন

চালিয়ে যাওয়ার জন্য, আপনার LangChain CLI ইনস্টল করা এবং নির্ভরতা পরিচালনা করার জন্য কবিতা থাকতে হবে। পিপএক্স ব্যবহার করে কীভাবে ইনস্টল করবেন তা এখানে:

pipx install langchain-cli poetry

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

langchain app new

run-rag ডিরেক্টরিতে পরিবর্তন করুন এবং নির্ভরতা ইনস্টল করুন

poetry install

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

5. ইন্ডেক্সিং কাজ তৈরি করুন

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

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

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-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 : পাইথন কমান্ডে আর্গুমেন্ট প্রদান করে। এটি অ্যাপ ডিরেক্টরিতে স্ক্রিপ্ট indexer.py চালাতে বলে।
  • --set-env-vars : পরিবেশের ভেরিয়েবল সেট করে যা Python স্ক্রিপ্ট এক্সিকিউশনের সময় অ্যাক্সেস করতে পারে।
  • --region=$REGION : যে অঞ্চলে কাজটি স্থাপন করা উচিত তা নির্দিষ্ট করে।
  • --execute-now : ক্লাউড রানকে কাজটি স্থাপনের সাথে সাথেই শুরু করতে বলে।

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

  • ওয়েব কনসোলের মাধ্যমে কাজ সম্পাদনের লগগুলি পড়ুন। এটি "সম্পন্ন সংরক্ষণ: xxx রিলিজ নোট" রিপোর্ট করা উচিত (যেখানে xxx সংরক্ষিত রিলিজ নোটের সংখ্যা)।
  • এছাড়াও আপনি ওয়েব কনসোলে ক্লাউড এসকিউএল ইনস্ট্যান্সে নেভিগেট করতে পারেন এবং langchain_pg_embedding টেবিলে রেকর্ডের সংখ্যা জিজ্ঞাসা করতে Cloud SQL স্টুডিও ব্যবহার করতে পারেন।

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

আপনার সম্পাদকে 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

অবশেষে, "Not Implemented" বলা লাইনটি পরিবর্তন করুন:

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

7. ক্লাউড রানে ওয়েব অ্যাপ্লিকেশন স্থাপন করুন

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৷

8. খেলার মাঠ অন্বেষণ

ক্লাউড রান পরিষেবা URL খুলুন এবং /playground নেভিগেট করুন। এটি একটি পাঠ্য ক্ষেত্র নিয়ে আসে। ক্লাউড রান রিলিজ নোটের উপর প্রশ্ন জিজ্ঞাসা করতে এটি ব্যবহার করুন, যেমন এখানে:

9. অভিনন্দন

আপনি ক্লাউড রানে একটি LangChain অ্যাপ সফলভাবে তৈরি এবং স্থাপন করেছেন। ভালো হয়েছে!

এখানে মূল ধারণা আছে:

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

পরিষ্কার করুন

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

  • ক্লাউড কনসোলে, সম্পদ পরিচালনা পৃষ্ঠাতে যান।
  • প্রকল্প তালিকায়, আপনার প্রকল্প নির্বাচন করুন তারপর মুছুন ক্লিক করুন.
  • ডায়ালগে, প্রকল্প আইডি টাইপ করুন এবং তারপরে প্রকল্পটি মুছে ফেলতে শাট ডাউন ক্লিক করুন।

আপনি যদি প্রকল্পটি রাখতে চান তবে নিম্নলিখিত সংস্থানগুলি মুছতে ভুলবেন না:

  • ক্লাউড এসকিউএল উদাহরণ
  • ক্লাউড রান পরিষেবা
  • ক্লাউড রানের কাজ