১. ভূমিকা
এই কোডল্যাবে, আপনি AlloyDB-এর নেটিভ AI ফাংশন ( ai.if , ai.analyze_sentiment , এবং ml_predict_row ) ব্যবহার করে TypeSafe AI-এর Jev মডেলকে AlloyDB AI-এর সাথে সংযুক্ত করবেন। এর ফলে, আপনার ডেটা স্থানান্তর না করে বা জটিল অ্যাপ্লিকেশন-সাইড কোড না লিখেই, আপনি AlloyDB-তে থাকা আপনার অপারেশনাল ডেটার উপর সরাসরি Jev মডেল ব্যবহার করে কার্যকর ব্যাচড ইনফারেন্স চালাতে পারবেন।
আপনি যা করবেন
- প্রাইভেট সার্ভিস অ্যাক্সেস (PSA) এবং একটি AlloyDB for PostgreSQL ক্লাস্টার ও প্রাইমারি ইনস্ট্যান্সের ব্যবস্থা করুন।
- ক্লাউডশেল এবং অভ্যন্তরীণ সংযোগের অনুমতি দিয়ে একটি ভিপিসি ফায়ারওয়াল নিয়ম তৈরি করুন।
-
gcloud alloydb clusters importব্যবহার করে একটি ই-কমার্স নমুনা ডেটাসেট লোড করুন। - Google Secret Manager এবং AlloyDB-এর
google_ml_integrationএক্সটেনশন সক্রিয় করুন - সিক্রেট ম্যানেজারে আপনার TypeSafe AI API কী সংরক্ষণ করুন এবং অ্যাক্সেস প্রদান করুন।
- Jev-এর
noul(বুলিয়ান) এবংchoice(সেন্টিমেন্ট) প্রিমিটিভগুলোর জন্য PL/pgSQL ইনপুট ও আউটপুট রূপান্তর ফাংশন তৈরি করুন। - AlloyDB-তে কাস্টম
jev-modelমডেল এন্ডপয়েন্টটি রেজিস্টার করুন। - স্কেলার এবং অ্যারে-ব্যাচড সিমান্টিক কোয়েরি (
ai.ifএবংai.analyze_sentiment) সরাসরি SQL-এ চালান। -
ai.analyze_sentimentব্যবহার করে প্রকৃত গ্রাহকদের পণ্যের রিভিউ থেকে সেন্টিমেন্ট শ্রেণীকরণের জন্য কোয়েরি করুন। - (বোনাস) একটি জেনেরিক এন্ডপয়েন্ট (
jev-systemone) রেজিস্টার করুন এবং Jev-এরscoreপ্রিমিটিভ ব্যবহার করে অবিচ্ছিন্ন গ্রাহক সন্তুষ্টির তীব্রতা মূল্যায়ন করুন।
আপনার যা যা লাগবে
- ক্রোমের মতো একটি ওয়েব ব্রাউজার
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট
- TypeSafe AI-এর একটি API কী ( TypeSafe AI থেকে প্রাপ্ত)
২. শুরু করার আগে
আপনার গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন
গুগল ক্লাউড কনসোলে , আপনি যে গুগল ক্লাউড প্রজেক্টটি ব্যবহার করতে চান সেটি নির্বাচন করুন বা তৈরি করুন।
ক্লাউড শেল শুরু করুন
গুগল ক্লাউড কনসোলের উপরের ডানদিকে থাকা ‘Activate Cloud Shell’- এ ক্লিক করুন।
আপনার ক্লাউড শেল সেশনটি প্রমাণীকৃত কিনা তা যাচাই করুন:
gcloud auth list
আপনার প্রজেক্ট আইডি এবং এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:
export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project $PROJECT_ID
export REGION="us-west4"
export ADBCLUSTER="my-alloydb-cluster"
export ADBINSTANCE="my-alloydb-primary"
প্রয়োজনীয় গুগল ক্লাউড এপিআই সক্রিয় করুন
প্রয়োজনীয় সকল গুগল ক্লাউড পরিষেবা এপিআই (API) সক্রিয় করতে এই কমান্ডটি চালান:
gcloud services enable \
alloydb.googleapis.com \
servicenetworking.googleapis.com \
secretmanager.googleapis.com \
compute.googleapis.com
৩. AlloyDB ক্লাস্টার এবং প্রাইমারি ইনস্ট্যান্স প্রোভিশন করুন
এই ধাপে, আপনি আপনার VPC নেটওয়ার্কে একটি প্রাইভেট সার্ভিস অ্যাক্সেস আইপি রেঞ্জ বরাদ্দ করবেন, প্রাইভেট পিয়ারিং স্থাপন করবেন এবং আপনার AlloyDB ক্লাস্টার ও প্রাইমারি ইনস্ট্যান্সকে আউটবাউন্ড ইন্টারনেট অ্যাক্সেস প্রদান করবেন।
১. প্রাইভেট সার্ভিস অ্যাক্সেস (পিএসএ) আইপি রেঞ্জ তৈরি করুন
AlloyDB ব্যবহারের জন্য আপনার ভার্চুয়াল প্রাইভেট ক্লাউড (VPC) নেটওয়ার্কে একটি প্রাইভেট আইপি রেঞ্জ বরাদ্দ করা প্রয়োজন। ধরে নেওয়া হচ্ছে আপনি default VPC নেটওয়ার্ক ব্যবহার করছেন:
ব্যক্তিগত আইপি রেঞ্জ বরাদ্দ তৈরি করুন:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
ব্যক্তিগত VPC পিয়ারিং সংযোগ স্থাপন করুন:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
২. অ্যালয়ডিবি ক্লাস্টার তৈরি করুন
প্রাথমিক postgres প্রশাসনিক ব্যবহারকারীর জন্য একটি সুরক্ষিত ডাটাবেস পাসওয়ার্ড তৈরি করুন:
export PGPASSWORD="$(openssl rand -hex 8)@1aA"
echo "Your generated AlloyDB postgres password is: $PGPASSWORD"
একটি AlloyDB ফ্রি ট্রায়াল ক্লাস্টার তৈরি করুন:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
৩. এআই ফ্ল্যাগ এবং আউটবাউন্ড কানেক্টিভিটি সহ প্রাইমারি ইনস্ট্যান্স তৈরি করুন
AlloyDB আউটবাউন্ড HTTPS-এর মাধ্যমে সরাসরি TypeSafe AI-এর সুরক্ষিত SaaS এন্ডপয়েন্টের ( https://api.typesafe.ai/v1/systemone ) সাথে সংযুক্ত হয়। তাই, আপনাকে অবশ্যই --outbound-public-ip উল্লেখ করতে হবে। এছাড়াও, পরিবেশের জন্য AlloyDB AI ডাটাবেস ফ্ল্যাগগুলি কনফিগার করুন:
gcloud alloydb instances create $ADBINSTANCE \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER \
--outbound-public-ip \
--ssl-mode=ALLOW_UNENCRYPTED_AND_ENCRYPTED \
--database-flags=\
google_ml_integration.enable_model_support=on,\
google_ml_integration.enable_ai_query_engine=on,\
google_ml_integration.enable_ai_function_acceleration=on,\
google_ml_integration.enable_cost_optimized_ai_functions=on,\
parameterized_views.enabled=on,\
password.enforce_complexity=on,\
password.min_uppercase_letters=1,\
password.min_numerical_chars=1,\
password.min_pass_length=10
৪. নমুনা ই-কমার্স ডেটা লোড করুন
বাস্তবসম্মত সিমান্টিক কোয়েরি পরীক্ষা করার জন্য, সরাসরি ক্লাউড স্টোরেজ থেকে প্রোডাক্ট ক্যাটালগ এবং কাস্টমার রিভিউ সম্বলিত একটি নমুনা ই-কমার্স ডেটাসেট ইম্পোর্ট করুন:
gcloud alloydb clusters import $ADBCLUSTER \
--region=$REGION \
--project=$PROJECT_ID \
--gcs-uri="gs://sample-data-and-media/ecomm-retail/ecom_generic.sql" \
--sql \
--database=postgres \
--user=postgres
৪. TypeSafe AI API Key-টি Secret Manager-এ সংরক্ষণ করুন।
AlloyDB-এর মডেল এন্ডপয়েন্ট ম্যানেজমেন্ট, গুগল সিক্রেট ম্যানেজারের সাথে নেটিভভাবে সমন্বিত হয়ে, ডাটাবেস কোড বা কনফিগারেশন লগে প্লেইনটেক্সট ক্রেডেনশিয়াল প্রকাশ না করেই বাহ্যিক API কলগুলোকে প্রমাণীকরণ করে।
১. গোপনীয়তা তৈরি করুন
ক্লাউড শেলে, typesafe-jev-api-key নামে একটি নতুন সিক্রেট তৈরি করুন:
gcloud secrets create typesafe-jev-api-key \
--replication-policy="automatic"
আপনার TypeSafe AI API কী-টি একটি গোপন সংস্করণ হিসেবে যোগ করুন:
echo -n "<YOUR_TYPESAFE_API_KEY>" | \
gcloud secrets versions add typesafe-jev-api-key --data-file=-
২. AlloyDB সার্ভিস এজেন্টকে অ্যাক্সেস প্রদান করুন
কোয়েরি সম্পাদনের সময় গোপনীয় তথ্য পুনরুদ্ধার করতে AlloyDB তার প্রজেক্ট সার্ভিস এজেন্ট ব্যবহার করে। আপনার প্রজেক্ট নম্বরটি খুঁজুন এবং Secret Accessor রোলটি প্রদান করুন:
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
ALLOYDB_SA="service-${PROJECT_NUMBER}@gcp-sa-alloydb.iam.gserviceaccount.com"
gcloud secrets add-iam-policy-binding typesafe-jev-api-key \
--member="serviceAccount:${ALLOYDB_SA}" \
--role="roles/secretmanager.secretAccessor"
সার্ভিস এজেন্ট যে roles/secretmanager.secretAccessor গ্রহণ করেছে, তার নিশ্চিতকরণ আউটপুট আপনি দেখতে পাবেন।
৫. AlloyDB Studio-এর মাধ্যমে AlloyDB-তে সংযোগ করুন এবং ডেটাবেস এক্সটেনশনগুলি চালু করুন।
স্থানীয় ক্লায়েন্ট টুল বা প্রক্সি টানেল কনফিগার না করে সরাসরি আপনার ব্রাউজার থেকে AlloyDB ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে, Google Cloud Console-এ থাকা AlloyDB Studio ব্যবহার করুন।
১. AlloyDB Studio খুলুন
- Google Cloud Console- এ, AlloyDB for PostgreSQL > Clusters- এ যান।
- আপনার ক্লাস্টারে (
my-alloydb-cluster) ক্লিক করুন। - বাম দিকের নেভিগেশন মেনুতে, AlloyDB Studio-তে ক্লিক করুন।
- ডাটাবেসে প্রমাণীকরণ করুন:
- ডাটাবেস :
postgres - ব্যবহারকারী :
postgres - পাসওয়ার্ড : ক্লাস্টার তৈরির সময় তৈরি হওয়া
$PGPASSWORDটি প্রবেশ করান (উদাহরণস্বরূপ, এটি দেখতে ক্লাউড শেলেecho $PGPASSWORDচালান)।
- ডাটাবেস :
- প্রমাণীকরণ-এ ক্লিক করুন।
আপনি এখন AlloyDB Studio-এর ইন্টারেক্টিভ SQL কোয়েরি এডিটরে আছেন।
২. ডাটাবেস এক্সটেনশন ও ফ্ল্যাগ সক্রিয় করুন
AlloyDB Studio কোয়েরি এডিটরে, google_ml_integration এক্সটেনশনটি সক্রিয় করতে এবং রানটাইম সেটিংস কনফিগার করতে নিম্নলিখিত স্টেটমেন্টগুলো পেস্ট করে রান করুন:
-- Enable the AlloyDB AI integration extension
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
-- Enable preview AI functions (ai.analyze_sentiment, ai.classify)
SET google_ml_integration.enable_preview_ai_functions = 'on';
-- Disable async batching for the session to use custom transform functions directly
SET google_ml_integration.enable_async_operation = 'off';
কোয়েরিটি কার্যকর করতে রান-এ ক্লিক করুন।
৩. AlloyDB MEM-এ সিক্রেটটি রেজিস্টার করুন।
AlloyDB-কে জানান আপনার TypeSafe AI API কী কোথায় খুঁজে পাওয়া যাবে:
CALL google_ml.create_sm_secret(
secret_id => 'jev_api_key',
secret_path => 'projects/<YOUR_PROJECT_ID>/secrets/typesafe-jev-api-key/versions/latest'
);
৬. SQL রূপান্তর ফাংশন তৈরি করুন
TypeSafe AI-এর System One API স্বতন্ত্র রিজনিং প্রিমিটিভসহ স্ট্রাকচার্ড JSON গ্রহণ করে (বুলিয়ান সীমাবদ্ধতার জন্য noul , মাল্টি-ক্লাস ক্লাসিফিকেশনের জন্য choice )।
AlloyDB-এর মডেল এন্ডপয়েন্ট ম্যানেজমেন্ট, স্ট্যান্ডার্ড PostgreSQL ai.* ফাংশন সিগনেচারগুলোকে Jev REST API ফরম্যাটের সাথে সংযুক্ত করার জন্য চারটি ট্রান্সফরমেশন ফাংশন (স্কেলার ইনপুট, স্কেলার আউটপুট, ব্যাচ ইনপুট, ব্যাচ আউটপুট) ব্যবহার করে।
১. স্কেলার ইনপুট রূপান্তর
একক-সারি ai.if এবং ai.analyze_sentiment কলগুলিকে Jev অনুরোধ পেলোডে রূপান্তর করতে নিম্নলিখিত ফাংশনটি যোগ করুন:
CREATE OR REPLACE FUNCTION public.jev_model_input_transform(
model_id VARCHAR(100),
input_text TEXT,
generation_config JSON,
system_instruction TEXT
) RETURNS JSON
LANGUAGE plpgsql IMMUTABLE AS $$
DECLARE
full_instruction TEXT;
enum_json JSON;
criteria_obj JSONB := '{}'::JSONB;
elem TEXT;
q_obj JSON;
BEGIN
-- Combine optional system instructions with the input prompt
IF system_instruction IS NOT NULL AND length(trim(system_instruction)) > 0 THEN
full_instruction := system_instruction || E'\n\n' || input_text;
ELSE
full_instruction := input_text;
END IF;
-- Inspect generation_config to determine whether caller expects a multi-class choice or boolean
enum_json := COALESCE(
generation_config->'generationConfig'->'responseSchema'->'enum',
generation_config->'responseSchema'->'enum'
);
IF enum_json IS NOT NULL AND json_typeof(enum_json) = 'array' THEN
-- Multi-class classification (ai.analyze_sentiment) -> Jev choice primitive
FOR elem IN SELECT json_array_elements_text(enum_json) LOOP
criteria_obj := criteria_obj || jsonb_build_object(elem, 'Category: ' || elem);
END LOOP;
q_obj := json_build_object(
'type', 'choice',
'instructions', full_instruction,
'criteria', criteria_obj::JSON
);
ELSE
-- Boolean filtering (ai.if) -> Jev noul primitive
q_obj := json_build_object(
'type', 'noul',
'instructions', full_instruction
);
END IF;
RETURN json_build_object(
'model', 'jev-latest',
'state', COALESCE(generation_config->>'state', 'Evaluate the question accurately based on the provided text.'),
'questions', json_build_object('q_1', q_obj)
);
END;
$$;
২. স্কেলার আউটপুট রূপান্তর
Jev-এর JSON রেসপন্সকে পুনরায় একটি PostgreSQL TEXT রেজাল্টে আনপ্যাক করার জন্য ফাংশনটি যোগ করুন:
CREATE OR REPLACE FUNCTION public.jev_model_output_transform(
model_id VARCHAR(100),
response_json JSON
) RETURNS TEXT
LANGUAGE plpgsql IMMUTABLE AS $$
DECLARE
q_ans JSON := response_json->'answers'->'q_1';
ans_type TEXT := q_ans->>'type';
BEGIN
IF ans_type = 'choice' THEN
RETURN q_ans->>'choice';
ELSIF ans_type = 'noul' THEN
-- Convert probability score (0.00 to 1.00) to boolean text
RETURN CASE WHEN (q_ans->>'noul')::FLOAT >= 0.50 THEN 'true' ELSE 'false' END;
ELSE
RAISE EXCEPTION 'Unexpected Jev response payload: %', response_json::TEXT;
END IF;
END;
$$;
৩. ব্যাচ ইনপুট ট্রান্সফর্ম
Jev কোনো প্রকার গুণগত মানের অবনতি ছাড়াই একটিমাত্র HTTP রাউন্ড-ট্রিপের মধ্যে একযোগে কয়েক ডজন প্রশ্ন মূল্যায়ন করতে পারে।
PostgreSQL prompts TEXT[] অ্যারেগুলিকে সমান্তরাল q_1 .. q_N Jev প্রশ্নে রূপান্তর করতে ব্যাচ ইনপুট ট্রান্সফর্ম যোগ করুন:
CREATE OR REPLACE FUNCTION public.jev_model_batch_input_transform(
model_id VARCHAR(100),
prompts TEXT[],
generation_config JSON,
system_instructions JSON
) RETURNS JSON
LANGUAGE plpgsql IMMUTABLE AS $$
DECLARE
questions_obj JSONB := '{}'::JSONB;
enum_json JSON;
criteria_obj JSONB := '{}'::JSONB;
elem TEXT;
is_choice BOOLEAN := FALSE;
i INT;
BEGIN
enum_json := COALESCE(
generation_config->'generationConfig'->'responseSchema'->'items'->'enum',
generation_config->'generationConfig'->'responseSchema'->'enum',
generation_config->'responseSchema'->'items'->'enum',
generation_config->'responseSchema'->'enum'
);
IF enum_json IS NOT NULL AND json_typeof(enum_json) = 'array' THEN
IF NOT (enum_json::JSONB = '["true", "false"]'::JSONB OR enum_json::JSONB = '["false", "true"]'::JSONB) THEN
is_choice := TRUE;
FOR elem IN SELECT json_array_elements_text(enum_json) LOOP
criteria_obj := criteria_obj || jsonb_build_object(elem, 'Category: ' || elem);
END LOOP;
END IF;
END IF;
-- Construct parallel questions for every prompt in the array
FOR i IN 1 .. COALESCE(array_length(prompts, 1), 0) LOOP
IF is_choice THEN
questions_obj := questions_obj || jsonb_build_object(
'q_' || i::TEXT,
jsonb_build_object(
'type', 'choice',
'instructions', prompts[i],
'criteria', criteria_obj
)
);
ELSE
questions_obj := questions_obj || jsonb_build_object(
'q_' || i::TEXT,
jsonb_build_object(
'type', 'noul',
'instructions', prompts[i]
)
);
END IF;
END LOOP;
RETURN json_build_object(
'model', 'jev-latest',
'state', COALESCE(generation_config->>'state', 'Evaluate each question independently based on the record data.'),
'questions', questions_obj::JSON
);
END;
$$;
৪. ব্যাচ আউটপুট রূপান্তর
সঠিক 1..N অ্যারে সূচক ক্রমানুসারে উত্তরগুলো বের করার ফাংশনটি যোগ করুন:
CREATE OR REPLACE FUNCTION public.jev_model_batch_output_transform(
model_id VARCHAR(100),
response JSON
) RETURNS TEXT[]
LANGUAGE plpgsql IMMUTABLE AS $$
DECLARE
results TEXT[] := ARRAY[]::TEXT[];
answers JSON := response->'answers';
i INT := 1;
q_ans JSON;
ans_type TEXT;
BEGIN
LOOP
q_ans := answers->('q_' || i::TEXT);
EXIT WHEN q_ans IS NULL;
ans_type := q_ans->>'type';
IF ans_type = 'choice' THEN
results := array_append(results, q_ans->>'choice');
ELSE
results := array_append(results, CASE WHEN (q_ans->>'noul')::FLOAT >= 0.50 THEN 'true' ELSE 'false' END);
END IF;
i := i + 1;
END LOOP;
RETURN results;
END;
$$;
৭. AlloyDB-তে কাস্টম মডেল এন্ডপয়েন্টটি রেজিস্টার করুন।
এখন আপনি ট্রান্সফরমেশন ফাংশন, সিক্রেট ক্রেডেনশিয়াল এবং TypeSafe AI REST এন্ডপয়েন্টকে একসাথে jev-model নামের একটি রেজিস্টার্ড মডেলে যুক্ত করবেন।
১. jev-model নিবন্ধন করুন
AlloyDB Studio কোয়েরি এডিটরে, পেস্ট করুন এবং চালান:
-- Drop previous registration if updating
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM google_ml.model_info_view WHERE model_id = 'jev-model') THEN
CALL google_ml.drop_model('jev-model');
END IF;
END $$;
-- Register custom LLM endpoint
CALL google_ml.create_model(
model_id => 'jev-model',
model_request_url => 'https://api.typesafe.ai/v1/systemone',
model_provider => 'custom',
model_type => 'llm',
model_qualified_name => 'jev-latest',
model_auth_type => 'secret_manager',
model_auth_id => 'jev_api_key',
model_in_transform_fn => 'jev_model_input_transform',
model_out_transform_fn => 'jev_model_output_transform',
model_batch_in_transform_fn => 'jev_model_batch_input_transform',
model_batch_out_transform_fn => 'jev_model_batch_output_transform'
);
২. নিবন্ধন যাচাই করুন
jev-model সক্রিয় এবং স্বীকৃত কিনা তা নিশ্চিত করতে মডেল রেজিস্ট্রি ভিউতে কোয়েরি করুন:
SELECT model_id, model_type, model_provider, model_auth_type
FROM google_ml.model_info_view
WHERE model_id = 'jev-model';
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:
model_id | model_type | model_provider | model_auth_type ----------+------------+----------------+----------------- jev-model | llm | custom | secret_manager (1 row)
৮. Jev-এর বিরুদ্ধে টেস্ট কোয়েরি চালান
jev-model নিবন্ধিত থাকলে, আপনি এখন সাধারণ PostgreSQL কোয়েরির ভিতরে সরাসরি সিমান্টিক অপারেশন সম্পাদন করতে পারবেন।
১. স্কেলার বুলিয়ান ফিল্টারিং ( ai.if ) পরীক্ষা করুন
ai.if ব্যবহার করে একটি একক টেক্সট স্টেটমেন্ট মূল্যায়ন করুন:
SELECT ai.if(
prompt => 'Is the product "North Face Waterproof Gore-Tex Hiking Jacket ($249)" suitable for rainy outdoor conditions?',
model_id => 'jev-model'
) AS is_suitable;
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:
is_suitable ------------- true (1 row)
২. স্কেলার সেন্টিমেন্ট অ্যানালাইসিস পরীক্ষা করুন ( ai.analyze_sentiment )
গ্রাহকের মতামতকে একটি শ্রেণিবদ্ধ লেবেলে ( positive , negative বা neutral ) মূল্যায়ন করুন:
SET google_ml_integration.enable_preview_ai_functions = 'on';
SELECT ai.analyze_sentiment(
input => 'The stitching on this jacket tore on the second day and the zipper jammed completely.',
model_id => 'jev-model'
) AS sentiment;
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:
sentiment ----------- negative (1 row)
৩. অ্যারে-ব্যাচড বুলিয়ান ফিল্টারিং পরীক্ষা করুন
প্রম্পটের একটি অ্যারে পাস করে একটিমাত্র কোয়েরিতে একাধিক আইটেম মূল্যায়ন করুন:
SET google_ml_integration.enable_async_operation = 'off';
SELECT unnest(prompts) AS product_prompt,
unnest(ai.if(prompts => prompts, model_id => 'jev-model')) AS is_cold_weather
FROM (
SELECT ARRAY[
'Is "Arctic Expedition Down Parka (-30F)" cold-weather winter outerwear?',
'Is "Men''s Boardshorts Beach Swim Trunk" cold-weather winter outerwear?',
'Is "Merino Wool Thermal Base Layer" cold-weather winter outerwear?'
] AS prompts
) b;
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:
product_prompt | is_cold_weather -------------------------------------------------------------------------+----------------- Is "Arctic Expedition Down Parka (-30F)" cold-weather winter outerwear? | true Is "Men's Boardshorts Beach Swim Trunk" cold-weather winter outerwear? | false Is "Merino Wool Thermal Base Layer" cold-weather winter outerwear? | false (3 rows)
৪. অ্যারে ব্যাচিং ব্যবহার করে টেবিল কোয়েরি পরীক্ষা করুন
এখন, ক্লাস্টার প্রভিশনিংয়ের সময় আগে লোড করা ecomm.products টেবিলটি থেকে ai.if ব্যবহার করে একগুচ্ছ আইটেম কোয়েরি করে দেখুন, ক্যাটালগের পণ্যগুলোর মধ্যে কোনটি শীতের পোশাক।
টেবিলের ডেটার উপর উচ্চ-ক্ষমতাসম্পন্ন সিমান্টিক ফিল্টারিং (যেমন প্রতি ব্যাচে ৫০টি সারি) চালানোর জন্য, সারিগুলোকে ব্যাচে ভাগ করতে PostgreSQL-এর row_number() উইন্ডো ফাংশনটি ব্যবহার করুন:
-- Evaluate a 50-row batch of real catalog items from ecomm.products
WITH numbered AS (
SELECT
id,
name,
category,
product_description,
((row_number() OVER (ORDER BY id) - 1) / 50) AS batch_id
FROM ecomm.products
ORDER BY id DESC
LIMIT 50
),
batched AS (
SELECT
batch_id,
array_agg(id ORDER BY id) AS ids,
array_agg(name ORDER BY id) AS names,
array_agg(category ORDER BY id) AS categories,
array_agg(product_description ORDER BY id) AS descs,
ai.if(
prompts => array_agg('Is "' || name || '" designed for cold weather winter outerwear?' ORDER BY id),
model_id => 'jev-model'
) AS decisions
FROM numbered
GROUP BY batch_id
),
unrolled AS (
SELECT
b.batch_id,
u.id,
u.name,
u.category,
u.product_description,
u.decision AS cold_weather_gear
FROM batched b
CROSS JOIN LATERAL unnest(b.ids, b.names, b.categories, b.descs, b.decisions)
AS u(id, name, category, product_description, decision)
)
SELECT id, name, category, product_description, cold_weather_gear
FROM unrolled
WHERE cold_weather_gear = TRUE
LIMIT 5;
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:
id | name | category | product_description | cold_weather_gear -------+----------------------------------------------------------------------+-------------+--------------------------------------------------------------------------------------------------------------------+------------------- 29071 | Winter Striped Beanie with Pom | Accessories | Brave the chill in style with the SoleStyle Winter Striped Beanie! This cozy beanie adds a pop of personality... | true 29077 | Knit Collegiate Rugby Stripe Winter Scarf & Beanie Hat Set | Accessories | Stay cozy and show off your sporty side with our Knit Collegiate Rugby Stripe Scarf & Beanie Set... | true 29083 | Junction Finds Men's Muscle Wool Blend Trapper Hat | Accessories | Brave the elements in style with the Junction Finds Trapper Hat! This wool-blend hat will keep you warm... | true 29086 | Mens Soft Thermal Insulated Wrist Length Leather Gloves - Black | Accessories | Brave the chill in style with these supple leather gloves from Gavel Goods! Lined with a soft, thermal knit... | true 29090 | Long Beanie-Red W16S24E | Accessories | Stay cozy and stylish all season long with this vibrant red beanie from Enchant! This isn't just any hat... | true (5 rows)
৫. গ্রাহকদের পণ্যের রিভিউ থেকে তাদের মনোভাব সম্পর্কে অনুসন্ধান করুন।
এখন Jev-এর choice প্রিমিটিভ দ্বারা সমর্থিত ai.analyze_sentiment ব্যবহার করে ecomm.product_reviews টেবিল থেকে গ্রাহক রিভিউ বিশ্লেষণ করুন:
SET google_ml_integration.enable_preview_ai_functions = 'on'
SELECT
r.id,
p.name AS product_name,
r.rating AS customer_star_rating,
substring(r.review_text FROM 1 FOR 70) || '...' AS review_snippet,
ai.analyze_sentiment(
input => r.review_text,
model_id => 'jev-model'
) AS detected_sentiment
FROM ecomm.product_reviews r
JOIN ecomm.products p ON r.product_id = p.id
ORDER BY r.id
LIMIT 5;
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:
id | product_name | customer_star_rating | review_snippet | detected_sentiment ----+------------------------------------------------+----------------------+-------------------------------------------------------------------------+-------------------- 1 | Hugs & Kisses Juniors Peplum Skirt | 1 | This skirt was poorly made and the fabric felt extremely cheap for for...| negative 2 | Bonkers Larry Full Length Pull on Pants | 1 | These pants are way too expensive for the terrible quality you get. Th...| negative 3 | Gifts and Garb Brah Bra Extenders | 3 | These extenders are okay but nothing special. They do add a bit of ext...| neutral 4 | Auto Forge Men's Tall Duck Traditional Coat | 1 | This coat is terribly stiff and heavy, making it very uncomfortable to...| negative 5 | Weaver's Way Men's Shetland Zip Neck Sweater | 2 | This sweater is just okay and not really worth the high price tag. The...| negative (5 rows)
৯. বোনাস: জেভ স্কোরের মাধ্যমে অবিচ্ছিন্ন সেন্টিমেন্ট স্কোরিং
যদিও AlloyDB-এর ai.analyze_sentiment মতো AI ফাংশনগুলো ক্যাটাগরিক্যাল বাকেট ( positive , negative , neutral ) রিটার্ন করে, TypeSafe AI-এর score প্রিমিটিভটি একটি ক্রমিক রুব্রিক জুড়ে সূক্ষ্মতা মূল্যায়ন করে এবং ০ থেকে ১০০ পর্যন্ত একটি অবিচ্ছিন্ন, প্রত্যাশা-ভারযুক্ত রেটিং রিটার্ন করে।
যেহেতু score একটি টেক্সট ক্লাসিফিকেশন লেবেলের পরিবর্তে সাংখ্যিক মেটাডেটা রিটার্ন করে, তাই আপনি একটি কাস্টম generic মডেল এন্ডপয়েন্ট ( jev-systemone ) রেজিস্টার করতে পারেন এবং google_ml.predict_row ব্যবহার করে এটিকে কল করতে পারেন।
১. জেনেরিক এন্ডপয়েন্টটি নিবন্ধন করুন
AlloyDB Studio-তে, jev-systemone model_type => 'generic' দিয়ে রেজিস্টার করুন:
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM google_ml.model_info_view WHERE model_id = 'jev-systemone') THEN
CALL google_ml.drop_model('jev-systemone');
END IF;
EXCEPTION WHEN OTHERS THEN
NULL;
END $$;
CALL google_ml.create_model(
model_id => 'jev-systemone',
model_request_url => 'https://api.typesafe.ai/v1/systemone',
model_provider => 'custom',
model_type => 'generic',
model_qualified_name => 'jev-latest',
model_auth_type => 'secret_manager',
model_auth_id => 'jev_api_key'
);
২. একটি মাল্টি-টাস্ক মূল্যায়ন চালান (বুলিয়ান + কন্টিনিউয়াস স্কোর)
একটিমাত্র HTTP কলের মাধ্যমে একই সাথে ত্রুটি সম্পর্কিত বুলিয়ান চেক ( noul ) এবং ধারাবাহিক অনুভূতির তীব্রতা ( score ) উভয়ই মূল্যায়ন করুন:
SELECT jsonb_pretty(google_ml.predict_row(
model_id => 'jev-systemone',
request_body => json_build_object(
'model', 'jev-latest',
'state', 'Review for North Face Parka: "The zipper broke on day 3 and customer service refused an exchange, though the fabric itself is very soft."',
'questions', json_build_object(
'has_defect', json_build_object(
'type', 'noul',
'instructions', 'Does this review report a physical product defect or failure?'
),
'satisfaction_score', json_build_object(
'type', 'score',
'instructions', 'Rate the customer sentiment and satisfaction on a 1-5 scale.',
'criteria', json_build_array(
'1: Extremely dissatisfied / defect failure',
'2: Dissatisfied',
'3: Mixed or neutral',
'4: Satisfied',
'5: Delighted'
)
)
)
)
)::jsonb) AS jev_analysis;
আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন (আপনার ফলাফল ভিন্ন হতে পারে):
{
"model": "jev-1.13.0",
"usage": {
"input_tokens": 388,
"output_tokens": 39
},
"answers": {
"has_defect": {
"noul": 0.98,
"type": "noul"
},
"satisfaction_score": {
"type": "score",
"score": 0.11,
"legend": {
"0": "1: Extremely dissatisfied / defect failure",
"1": "2: Dissatisfied",
"2": "3: Mixed or neutral",
"3": "4: Satisfied",
"4": "5: Delighted"
},
"confidence": 0.91,
"probabilities": {
"0": 0.9,
"1": 0.08,
"2": 0.02,
"3": 0.0,
"4": 0.0
}
}
}
}
লক্ষ্য করুন যে, satisfaction_score 11 / 100 হয়েছে, যা সঠিকভাবে তুলে ধরেছে যে কাপড়টি নরম ছিল তা স্বীকার করা সত্ত্বেও গ্রাহকের অভিজ্ঞতাটি ছিল মূলত নেতিবাচক!
১০. পরিষ্কার করুন
এই কোডল্যাব চলাকালীন তৈরি হওয়া রিসোর্সগুলোর জন্য চলমান চার্জ এড়াতে, সিক্রেট ও ডাটাবেস অবজেক্টগুলো পরিষ্কার করুন এবং AlloyDB ক্লাস্টারটি মুছে ফেলুন।
১. সিক্রেট ম্যানেজার রিসোর্সসমূহ মুছে ফেলুন
ক্লাউড শেলে, TypeSafe AI API কী-এর জন্য তৈরি করা সিক্রেটটি ডিলিট করুন:
gcloud secrets delete typesafe-jev-api-key --quiet
২. AlloyDB প্রাইমারি ইনস্ট্যান্স এবং ক্লাস্টারটি মুছে ফেলুন
প্রথমে প্রাথমিক ইনস্ট্যান্সটি মুছে ফেলুন:
gcloud alloydb instances delete $ADBINSTANCE \
--cluster=$ADBCLUSTER \
--region=$REGION \
--quiet
ইনস্ট্যান্স মুছে ফেলার প্রক্রিয়া সম্পন্ন হলে, ক্লাস্টারটি মুছে ফেলুন:
gcloud alloydb clusters delete $ADBCLUSTER \
--region=$REGION \
--quiet
১১. অভিনন্দন
অভিনন্দন! আপনি সফলভাবে একটি Google Cloud AlloyDB ক্লাস্টার স্থাপন করেছেন এবং এটিকে TypeSafe AI System One ( Jev )-এর সাথে একীভূত করেছেন।
আপনি যা শিখেছেন
- কীভাবে প্রাইভেট সার্ভিস অ্যাক্সেস (PSA) স্থাপন করবেন এবং একটি AlloyDB for PostgreSQL ক্লাস্টার ও প্রাইমারি ইনস্ট্যান্স প্রোভিশন করবেন।
- কীভাবে
--outbound-public-ipসক্রিয় করবেন যাতে AlloyDB বাহ্যিক HTTPS SaaS API-গুলিতে পৌঁছাতে পারে। - কীভাবে গুগল সিক্রেট ম্যানেজারে তৃতীয় পক্ষের এআই প্রদানকারীর ক্রেডেনশিয়ালগুলি নিরাপদে সংরক্ষণ করবেন এবং সেগুলিকে অ্যালয়ডিবি-র সাথে সংযুক্ত করবেন।
- কিভাবে PL/pgSQL ট্রান্সফরমেশন ফাংশন লিখতে হয় যা স্ট্যান্ডার্ড PostgreSQL AI ফাংশনগুলোকে (
ai.ifএবংai.analyze_sentiment) এক্সটার্নাল REST API-এর সাথে সংযুক্ত করে। -
google_ml.create_modelব্যবহার করে AlloyDB-তে কীভাবে কাস্টম LLM এন্ডপয়েন্ট রেজিস্টার করবেন। - PostgreSQL-এ সরাসরি স্কেলার এবং হাই-থ্রুপুট ব্যাচড সিমান্টিক SQL কোয়েরি কীভাবে চালানো যায়।
- প্রকৃত গ্রাহকদের পণ্যের রিভিউ থেকে নির্দিষ্ট বিষয়ের অনুভূতি কীভাবে বিশ্লেষণ করবেন
- কিভাবে একটি জেনেরিক মডেল এন্ডপয়েন্ট রেজিস্টার করতে হয় এবং
google_ml.predict_rowব্যবহার করে অবিচ্ছিন্ন গ্রাহক সন্তুষ্টি স্কোর (0..100) মূল্যায়ন করতে হয়।
পরবর্তী পদক্ষেপ
- AlloyDB AI ডকুমেন্টেশনে AlloyDB AI ফাংশনগুলির সক্ষমতা সম্পর্কে আরও জানুন।
- Noul কনস্ট্রেইন্ট লজিক এবং সেন্টিমেন্ট স্কোরিং সম্পর্কে আরও জানতে TypeSafe AI API রেফারেন্সটি পড়ুন।