BigQuery GraphRAG ব্যবহার করে মানি লন্ডারিং প্রতিরোধ ও জালিয়াতি নিবারণ

১. ভূমিকা

এই কোডল্যাবে, আপনি মানি লন্ডারিং প্রতিরোধ (AML) এবং আর্থিক জালিয়াতি শনাক্ত করার জন্য একটি গ্রাফ রিট্রিভাল-অগমেন্টেড জেনারেশন (GraphRAG) সলিউশন তৈরি করবেন। আপনি ভার্টেক্স এআই (Vertex AI), ভেক্টর সার্চ (Vector Search), এবং বিগকোয়েরি (BigQuery)-এর নিজস্ব গ্রাফ সক্ষমতা ব্যবহার করবেন, যা ল্যাংচেইন (LangChain)-এর মাধ্যমে সমন্বিত হবে। এই ল্যাবের শেষে, আপনি দেখতে পাবেন কীভাবে একটি লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) সিমান্টিক অডিট লগ এবং জটিল ট্রানজ্যাকশনাল নেটওয়ার্ক সংশ্লেষণ করে অবৈধ তহবিল রাউটিং শনাক্ত করতে পারে।

গ্রাফর‍্যাগ আর্কিটেকচার প্রবাহ

+------------------+     1. Vector Search      +---------------------+
| User Prompt /    | ------------------------> | BigQuery ML         |
| Investigation    |                           | (AccountAudits)     |
+------------------+                           +---------------------+
         |                                                |
         |                                                | 2. Seed Entity ID
         v                                                v
+------------------+     3. GQL Traversal      +---------------------+
| LangChain        | <------------------------ | BigQuery Property   |
| Graph Retriever  |                           | Graph (FinGraph)    |
+------------------+                           +---------------------+
         |
         | 4. Synthesized Context
         v
+------------------+
| Gemini 2.5 Flash | ---> Detailed Fraud Report
+------------------+

আপনি যা করবেন

  • পর্যায় ১: ডেটাসেট ও প্রপার্টি গ্রাফ সেটআপ : রিলেশনাল ফিনান্সিয়াল টেবিল তৈরি করুন এবং একটি নেটিভ BigQuery PROPERTY GRAPH নির্মাণ করুন।
  • পর্যায় ২: সিমান্টিক ভেক্টর এমবেডিং তৈরি : AI.GENERATE_EMBEDDING ( text-embedding-005 ) ব্যবহার করে অডিট লগের জন্য সরাসরি SQL-এ টেক্সট এমবেডিং তৈরি করুন।
  • পর্যায় ৩: কাস্টম ল্যাংচেইন গ্রাফর‍্যাগ রিট্রিভার : ভেক্টর সিমিলারিটি ( COSINE_DISTANCE ) এবং আইএসও জিকিউএল পাথ ট্র্যাভার্সালকে একত্রিত করে একটি কাস্টম পাইথন রিট্রিভার তৈরি করুন।
  • পর্যায় ৪: এলএলএম জালিয়াতির কারণ উদ্ঘাটন ও পথের দৃশ্যমানতা : অবৈধ অর্থ পাচারের চক্র উন্মোচন করতে এবং BigQuery Studio-তে পথের চিহ্নগুলো দৃশ্যমান করতে একটি Gemini রিজনিং চেইন সম্পাদন করুন।

আপনার যা যা লাগবে

  • ক্রোমের মতো একটি ওয়েব ব্রাউজার।
  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।

এই কোডল্যাবটি শিক্ষানবিশসহ সকল স্তরের ডেভেলপার, ডেটা ইঞ্জিনিয়ার এবং এআই বিশেষজ্ঞদের জন্য ডিজাইন করা হয়েছে।

আনুমানিক সময়কাল: ৩৫ মিনিট
আনুমানিক খরচ: ২.০০ মার্কিন ডলারের কম (পে-অ্যাজ-ইউ-গো ভার্টেক্স এআই এবং বিগকোয়েরি কোয়েরি প্রসেসিং ব্যবহার করে)।

২. শুরু করার আগে

একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন

  1. গুগল ক্লাউড কনসোলে , একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন
  2. আপনার ক্লাউড প্রজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন।

ক্লাউড শেল শুরু করুন

  1. Google Cloud কনসোলের শীর্ষে থাকা Activate Cloud Shell-এ ক্লিক করুন।
  2. প্রমাণীকরণ যাচাই করুন:
gcloud auth list
  1. ক্লাউড শেলে এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করুন:
export GCP_PROJECT=$(gcloud config get-value project)
export REGION="us-central1"
export BQ_DATASET="fingraph_rag"
gcloud config set project $GCP_PROJECT

এপিআই সক্ষম করুন

প্রয়োজনীয় সকল API সক্রিয় করতে এই কমান্ডটি চালান:

gcloud services enable \
 bigquery.googleapis.com \
 aiplatform.googleapis.com \
 bigqueryreservation.googleapis.com

BigQuery রিজার্ভেশন এবং অ্যাসাইনমেন্ট তৈরি করুন

GQL কোয়েরি চালানোর জন্য, আপনার অবশ্যই এন্টারপ্রাইজ বা এন্টারপ্রাইজ প্লাস সংস্করণ ব্যবহার করে এমন একটি রিজার্ভেশন থাকতে হবে, ক্লাউড শেলে অটোস্কেলিং সহ একটি এন্টারপ্রাইজ সংস্করণ রিজার্ভেশন তৈরি করুন:

# 1. Create a BigQuery Enterprise reservation with 0 baseline slots and 100 max autoscaling slots
bq mk --reservation \
  --project_id=${GCP_PROJECT} \
  --location=US \
  --edition=ENTERPRISE \
  --slots=0 \
  --autoscale_max_slots=100 \
  --ignore_idle_slots=true \
  graphrag-bigquery-reservation

# 2. Assign your Cloud project to the newly created reservation for query execution
bq mk --reservation_assignment \
  --project_id=${GCP_PROJECT} \
  --location=US \
  --reservation_id=graphrag-bigquery-reservation \
  --job_type=QUERY \
  --assignee_type=PROJECT \
  --assignee_id=${GCP_PROJECT}

৩. সেটআপ এবং প্রারম্ভিকীকরণ

এই ধাপে, আমরা একটি পাইথন এনভায়রনমেন্ট সেট আপ করব, প্রয়োজনীয় লাইব্রেরিগুলো ইনস্টল করব এবং BigQuery ও Vertex AI ক্লায়েন্টগুলো ইনিশিয়ালাইজ করব। আপনি এই কমান্ডগুলো ক্লাউড শেল অথবা একটি জুপিটার নোটবুক এনভায়রনমেন্টে চালাতে পারেন।

  1. পাইথন ভার্চুয়াল এনভায়রনমেন্ট তৈরি এবং সক্রিয় করুন:
python3 -m venv venv
source venv/bin/activate
  1. প্রয়োজনীয় পাইথন প্যাকেজগুলো ইনস্টল করুন:
pip install langchain-google-vertexai langchain-core google-cloud-bigquery vertexai
  1. graphrag_aml.py একটি পাইথন ফাইল তৈরি করুন এবং ইনিশিয়ালাইজেশন কোড যোগ করুন। প্রতিস্থাপন করুন আপনার গুগল ক্লাউড প্রজেক্ট আইডি দিয়ে।
import vertexai
from google.cloud import bigquery

# Configuration
GCP_PROJECT_ID = "<YOUR_PROJECT_ID>"
REGION = "us-central1"
BQ_DATASET_ID = "fingraph_rag"
MODEL_NAME = "gemini-2.5-flash"

# Initialize clients
bq_client = bigquery.Client(project=GCP_PROJECT_ID)
vertexai.init(project=GCP_PROJECT_ID, location=REGION)

৪. টেবিল এবং স্কিমা তৈরি করুন

এরপরে, আমরা একটি BigQuery ডেটাসেট এবং স্ট্যান্ডার্ড টেবিল তৈরি করে আমাদের ফিনান্সিয়াল গ্রাফের স্কিমা নির্ধারণ করব।

  1. BigQuery ডেটাসেট তৈরি করুন:
bq mk --location=US --dataset fingraph_rag
  1. টেবিলগুলো তৈরি করুন। আপনি এটি BigQuery Studio UI-তে অথবা Cloud Shell-এর মাধ্যমে চালাতে পারেন। SQL-টি নিচে দেওয়া হলো:
CREATE TABLE IF NOT EXISTS `fingraph_rag.Account` (id INT64, create_time TIMESTAMP, is_blocked BOOL, type STRING);
CREATE TABLE IF NOT EXISTS `fingraph_rag.Loan` (id INT64, loan_amount FLOAT64, balance FLOAT64, create_time TIMESTAMP, interest_rate FLOAT64);
CREATE TABLE IF NOT EXISTS `fingraph_rag.Person` (id INT64, name STRING);
CREATE TABLE IF NOT EXISTS `fingraph_rag.AccountRepayLoan` (id INT64, loan_id INT64, amount FLOAT64, create_time TIMESTAMP);
CREATE TABLE IF NOT EXISTS `fingraph_rag.AccountTransferAccount` (id INT64, to_id INT64, amount FLOAT64, create_time TIMESTAMP);
CREATE TABLE IF NOT EXISTS `fingraph_rag.PersonOwnAccount` (id INT64, account_id INT64, create_time TIMESTAMP);
CREATE TABLE IF NOT EXISTS `fingraph_rag.AccountAudits` (id INT64, audit_timestamp TIMESTAMP, audit_details STRING, embedding ARRAY<FLOAT64>);

৫. ডেটাসেটটি সন্নিবেশ করুন।

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

টেবিলগুলিতে ডেটা প্রবেশ করাতে নিম্নলিখিত SQL চালান:

INSERT INTO `fingraph_rag.Account` VALUES 
  (10,'2020-01-10 06:22:20.222',false,'brokerage account'), 
  (20,'2020-01-27 17:55:09.206',false,'checking account'), 
  (30,'2020-02-15 09:12:33.111',false,'savings account'), 
  (40,'2019-11-05 14:33:10.000',false,'business account');

INSERT INTO `fingraph_rag.Loan` VALUES 
  (100,2022278.5,123359.0,'2020-03-18 16:42:57.719',0.064), 
  (200,50000.0,45000.0,'2020-03-23 19:03:05.567',0.097), 
  (300, 15000.0, 10000.0, '2020-05-10 10:00:00.000', 0.05);

INSERT INTO `fingraph_rag.Person` VALUES 
  (1,'Jacoby'), (2,'Menville'), (3,'Smith'), (4,'Doe');

INSERT INTO `fingraph_rag.AccountTransferAccount` VALUES 
  (40,10,25000.0,'2020-08-01 10:00:00.000'), 
  (10,20,24000.0,'2020-08-29 15:28:58.647'), 
  (30,20,150.0,'2020-09-01 12:00:00.000');

INSERT INTO `fingraph_rag.AccountRepayLoan` VALUES 
  (10,100,56809.8,'2020-12-12 07:25:02.597'), 
  (20,200,20000.0,'2021-01-18 01:40:25.317');

INSERT INTO `fingraph_rag.PersonOwnAccount` VALUES 
  (1,10,'2020-01-10 06:22:20.222'), (2,20,'2020-01-27 17:55:09.206'), 
  (3,30,'2020-02-15 09:12:33.111'), (4,40,'2019-11-05 14:33:10.000');

INSERT INTO `fingraph_rag.AccountAudits` (id, audit_timestamp, audit_details) VALUES 
  (10, '2020-05-14 06:57:02', 'Account 10 (Jacoby) flagged by AML system for suspicious high-volume transfers from offshore business accounts.'), 
  (20, '2021-03-09 02:51:45', 'Account 20 (Menville) failed KYC verification. Linked source of funds is unverified and customer is unresponsive.'), 
  (40, '2020-07-20 09:00:00', 'Account 40 (Doe) under investigation as a suspected shell company involved in illicit activities.');

গৃহীত রেকর্ড যাচাই করুন

আপনার ফিনান্সিয়াল টেবিলগুলোতে রেকর্ড সংখ্যা যাচাই করতে এই কোয়েরিটি চালান:

SELECT 'Account' AS entity_table, COUNT(*) AS row_count FROM `fingraph_rag.Account`
UNION ALL SELECT 'Loan', COUNT(*) FROM `fingraph_rag.Loan`
UNION ALL SELECT 'Person', COUNT(*) FROM `fingraph_rag.Person`
UNION ALL SELECT 'AccountAudits', COUNT(*) FROM `fingraph_rag.AccountAudits`;

সারি সন্নিবেশ নিশ্চিত করে আপনি এইরকম একটি কোয়েরি আউটপুট দেখতে পাবেন:

অনুসন্ধানের ফলাফল গৃহীত রেকর্ড যাচাই করুন

৬. BigQuery প্রপার্টি গ্রাফ তৈরি করুন

আমাদের রিলেশনাল ডেটা প্রস্তুত হয়ে গেলে, আমরা BigQuery-এর নিজস্ব গ্রাফ ডিডিএল (Graph DDL) ব্যবহার করে FinGraph সংজ্ঞায়িত করি। এর মাধ্যমে ডেটা কপি বা ডুপ্লিকেট না করেই বিদ্যমান রিলেশনাল টেবিলগুলোর উপর একটি সিম্যান্টিক লেয়ার তৈরি করা হয়।

ISO GQL সিনট্যাক্স প্রাইমার

BigQuery প্রপার্টি গ্রাফগুলি স্ট্যান্ডার্ড ISO গ্রাফ কোয়েরি ল্যাঙ্গুয়েজ (GQL) প্যাটার্ন ব্যবহার করে:

  • (node:Label) এনটিটি নোডগুলিকে সংজ্ঞায়িত করে (যেমন Account , Person , Loan )।
  • -[edge:LABEL]-> নির্দেশিত সম্পর্ক সংজ্ঞায়িত করে (যেমন Transfers , Repays , Owns )।

প্রপার্টি গ্রাফ তৈরি করতে নিম্নলিখিত SQL স্টেটমেন্টটি চালান:

CREATE OR REPLACE PROPERTY GRAPH `fingraph_rag.FinGraph`
 NODE TABLES (
   `fingraph_rag.Account` KEY (id) LABEL Account PROPERTIES (id, type, is_blocked),
   `fingraph_rag.Loan` KEY (id) LABEL Loan PROPERTIES (id, loan_amount, balance),
   `fingraph_rag.Person` KEY (id) LABEL Person PROPERTIES (id, name)
 )
 EDGE TABLES(
   `fingraph_rag.AccountRepayLoan`
     KEY (id, loan_id, create_time)
     SOURCE KEY (id) REFERENCES `fingraph_rag.Account` (id)
     DESTINATION KEY (loan_id) REFERENCES `fingraph_rag.Loan` (id)
     LABEL Repays PROPERTIES (amount, create_time),
   `fingraph_rag.AccountTransferAccount`
     KEY (id, to_id, create_time)
     SOURCE KEY (id) REFERENCES `fingraph_rag.Account` (id)
     DESTINATION KEY (to_id) REFERENCES `fingraph_rag.Account` (id)
     LABEL Transfers PROPERTIES (amount, create_time),
   `fingraph_rag.PersonOwnAccount`
     KEY (id, account_id)
     SOURCE KEY (id) REFERENCES `fingraph_rag.Person` (id)
     DESTINATION KEY (account_id) REFERENCES `fingraph_rag.Account` (id)
     LABEL Owns PROPERTIES (create_time)
 );

অ্যাকাউন্ট, ব্যক্তি এবং ঋণের সম্পূর্ণ গ্রাফটি দেখতে, BigQuery Studio-তে নিম্নলিখিত SQL কোয়েরিটি চালান:

GRAPH `fingraph_rag.FinGraph`
MATCH (src)-[e]->(dst)
RETURN TO_JSON([
  TO_JSON(src),
  TO_JSON(e),
  TO_JSON(dst)
  ]) AS result;

আপনি এর অনুরূপ একটি গ্রাফ ভিজ্যুয়ালাইজেশন ফলাফল দেখতে পাবেন:

সম্পূর্ণ গ্রাফ ভিজ্যুয়ালাইজেশন

৭. অডিট লগের জন্য এমবেডিং তৈরি করুন

আমাদের RAG পাইপলাইনের ভেক্টর সার্চ অংশটি সক্রিয় করতে, আমরা AI.GENERATE_EMBEDDING টেবিল-ভ্যালুড ফাংশন (TVF) ব্যবহার করে সরাসরি BigQuery-এর মধ্যেই অসংগঠিত অডিট লগগুলির জন্য টেক্সট এমবেডিং তৈরি করি।

BigQuery রিমোট সংযোগ তৈরি করুন এবং IAM অনুমতি প্রদান করুন

ভার্টেক্স এআই এমবেডিং এন্ডপয়েন্টগুলির সাথে নিরাপদে যোগাযোগ করার জন্য BigQuery ML-এর একটি CLOUD_RESOURCE সংযোগ প্রয়োজন। সংযোগটি তৈরি করতে, এর স্বয়ংক্রিয়ভাবে তৈরি পরিষেবা অ্যাকাউন্টটি খুঁজে বের করতে এবং ভার্টেক্স এআই ব্যবহারকারী ( roles/aiplatform.user ) ভূমিকাটি প্রদান করতে ক্লাউড শেলে নিম্নলিখিত ব্যাশ কমান্ডগুলি চালান:

# 1. Set environment variables
export PROJECT_ID=$(gcloud config get-value project)
export LOCATION="us"
export CONNECTION_ID="vertex_ai_conn"

# 2. Create the BigQuery Cloud Resource Connection
bq mk --connection \
    --location=${LOCATION} \
    --project_id=${PROJECT_ID} \
    --connection_type=CLOUD_RESOURCE \
    ${CONNECTION_ID}

# 3. Retrieve the auto-generated Service Account ID associated with the connection
SA_ID=$(bq show --format=json --location=${LOCATION} --connection ${CONNECTION_ID} | jq -r '.cloudResource.serviceAccountId')
echo "Connection Service Account: ${SA_ID}"

# 4. Grant Vertex AI User (roles/aiplatform.user) permission to the Service Account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${SA_ID}" \
    --role="roles/aiplatform.user" \
    --condition=None

রিমোট এমবেডিং মডেল তৈরি করুন

এরপরে, একটি BigQuery ML রিমোট মডেল সংজ্ঞায়িত করুন যা আপনার নতুন অনুমোদিত সংযোগের মাধ্যমে Vertex AI-এর text-embedding-005 মডেলের সাথে যুক্ত হয়:

CREATE OR REPLACE MODEL `fingraph_rag.embedding_model`
  REMOTE WITH CONNECTION `us.vertex_ai_conn`
  OPTIONS(ENDPOINT = 'text-embedding-005');

এমবেডিং তৈরি করুন

এখন, একটি UPDATE স্টেটমেন্টের FROM ক্লজে AI.GENERATE_EMBEDDING কল করে AccountAudits টেবিলের জন্য এমবেডিং তৈরি করুন:

UPDATE `fingraph_rag.AccountAudits` target
SET embedding = source.embedding
FROM AI.GENERATE_EMBEDDING(
  MODEL `fingraph_rag.embedding_model`,
  (SELECT id, audit_details AS content FROM `fingraph_rag.AccountAudits` WHERE ARRAY_LENGTH(embedding) = 0)
) source
WHERE target.id = source.id;

উত্পাদিত ভেক্টরের মাত্রা যাচাই করুন

ভেক্টর এমবেডিংগুলো পূরণ হয়েছে কিনা তা যাচাই করতে নিম্নলিখিত কোয়েরিটি চালান:

SELECT id, audit_details, ARRAY_LENGTH(embedding) AS embedding_dim 
FROM `fingraph_rag.AccountAudits`;

আপনি কোয়েরি আউটপুটে এর অনুরূপ ৭৬৮-মাত্রিক ভেক্টর এমবেডিং দেখতে পাবেন:

কোয়েরির ফলাফল দ্বারা তৈরি ভেক্টরের মাত্রা যাচাই করুন

৮. GraphRAG Retriever-এর সংজ্ঞা দিন

আমরা এখন আমাদের পাইথন পরিবেশে একটি কাস্টম ল্যাংচেইন রিট্রিভার তৈরি করব। এই রিট্রিভারটি সিমান্টিক ভেক্টর সার্চ (প্রাসঙ্গিক শুরুর বিন্দু খুঁজে বের করার জন্য) এবং নেটিভ গ্রাফ ম্যাচ কোয়েরি (সম্পর্কগুলো ট্র্যাভার্স করার জন্য) এর সমন্বয় করে।

আপনার পাইথন স্ক্রিপ্ট graphrag_aml.py তে নিম্নলিখিত কোডটি যোগ করুন:

from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
from typing import List

class FinGraphRetriever(BaseRetriever):
    project: str
    dataset: str

    def _get_relevant_documents(self, query: str) -> List[Document]:
        # 1. Vector Search
        vector_query = f"""
            SELECT id, audit_details
            FROM `{self.dataset}.AccountAudits`
            ORDER BY COSINE_DISTANCE(
                embedding,
                (
                    SELECT embedding
                    FROM AI.GENERATE_EMBEDDING(
                        MODEL `{self.dataset}.embedding_model`,
                        (SELECT @query AS content)
                    )
                )
            )
            LIMIT 1
        """
        res = bq_client.query(vector_query, job_config=bigquery.QueryJobConfig(
            query_parameters=[bigquery.ScalarQueryParameter("query", "STRING", query)]
        )).result()

        start_id = None
        audit_text = ""
        for row in res:
            start_id = row.id
            audit_text = row.audit_details

        if not start_id: return []

        # 2. Native Graph Traversal
        graph_query = f"""
            GRAPH `{self.dataset}.FinGraph`
            MATCH
              (sender_person:Person)-[:Owns]->(sender_acc:Account)
              -[tx:Transfers]->
              (a:Account)
              -[repays:Repays]->(l:Loan),
              (owner:Person)-[:Owns]->(a)
            WHERE a.id = @id
            RETURN
              owner.name as owner_name,
              a.type as account_type,
              sender_person.name as sender_name,
              tx.amount as transfer_amount,
              repays.amount as repayment_amount,
              l.id as loan_id
        """
        graph_res = bq_client.query(graph_query, job_config=bigquery.QueryJobConfig(
            query_parameters=[bigquery.ScalarQueryParameter("id", "INT64", start_id)]
        )).result()

        context_docs = [Document(page_content=f"Primary Audit Log (Target Account): {audit_text}")]
        sender_names = []
        for row in graph_res:
            sender_names.append(row['sender_name'])
            doc_str = (f"Account Owner: {row['owner_name']} (Account Type: {row['account_type']}). "
                       f"Received transfer of ${row['transfer_amount']} from {row['sender_name']}. "
                       f"Made loan repayment of ${row['repayment_amount']} to Loan {row['loan_id']}.")
            context_docs.append(Document(page_content=doc_str))

        if sender_names:
            names_list = "','".join(sender_names)
            sender_audit_query = f"""
                SELECT p.name, au.audit_details
                FROM `{self.dataset}.AccountAudits` au
                JOIN `{self.dataset}.Account` a ON au.id = a.id
                JOIN `{self.dataset}.PersonOwnAccount` poa ON a.id = poa.account_id
                JOIN `{self.dataset}.Person` p ON poa.id = p.id
                WHERE p.name IN ('{names_list}')
            """
            sender_audits = bq_client.query(sender_audit_query).result()
            for row in sender_audits:
                context_docs.append(Document(page_content=f"Audit Log for Sender {row['name']}: {row['audit_details']}"))

        return context_docs

৯. জালিয়াতি তদন্ত চালান

অবশেষে, একটি বিস্তারিত জালিয়াতি প্রতিবেদন তৈরি করার জন্য আমরা GraphRAG পাইপলাইনটি চালাই। LLM প্রম্পটের উত্তর দেওয়ার জন্য আমাদের কাস্টম গ্রাফ রিট্রিভার দ্বারা প্রাপ্ত কনটেক্সট ব্যবহার করবে।

আপনার graphrag_aml.py স্ক্রিপ্টে নিম্নলিখিত কোডটি যোগ করুন এবং python graphrag_aml.py ব্যবহার করে এটি চালান:

from langchain_google_vertexai import ChatVertexAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# Initialize the LLM and the Retriever
llm = ChatVertexAI(model_name=MODEL_NAME)
retriever = FinGraphRetriever(project=GCP_PROJECT_ID, dataset=BQ_DATASET_ID)

# Define the Prompt
prompt = ChatPromptTemplate.from_template("""
You are a Lead Fraud Analyst. Use the following audit logs and graph transaction history to answer the question.
Your goal is to connect the dots between the entities and explain the flow of funds.
If you see transfers from flagged users or shell companies, highlight the money laundering risk.

Context: {context}

Question: {question}

Detailed Fraud Report:
""")

# Create the LangChain
chain = (
    {"context": retriever , "question": lambda x: x}
    | prompt
    | llm
    | StrOutputParser()
)

# Execute the chain
question = "Why is Menville's loan repayment at risk? Flag any suspicious activity if you notice."
print(chain.invoke(question))

সম্পূর্ণ graphrag_aml.py স্ক্রিপ্ট

আপনার সম্পূর্ণ graphrag_aml.py স্ক্রিপ্টটি দেখতে এইরকম হবে:

import vertexai
from google.cloud import bigquery
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
from typing import List
from langchain_google_vertexai import ChatVertexAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# Configuration
GCP_PROJECT_ID = "<YOUR_PROJECT_ID>"
REGION = "us-central1"
BQ_DATASET_ID = "fingraph_rag"
MODEL_NAME = "gemini-2.5-flash"

# Initialize clients
bq_client = bigquery.Client(project=GCP_PROJECT_ID)
vertexai.init(project=GCP_PROJECT_ID, location=REGION)

class FinGraphRetriever(BaseRetriever):
    project: str
    dataset: str

    def _get_relevant_documents(self, query: str) -> List[Document]:
        # 1. Vector Search using Cosine Distance
        vector_query = f"""
            SELECT id, audit_details
            FROM `{self.dataset}.AccountAudits`
            ORDER BY COSINE_DISTANCE(
                embedding,
                (
                    SELECT embedding
                    FROM AI.GENERATE_EMBEDDING(
                        MODEL `{self.dataset}.embedding_model`,
                        (SELECT @query AS content)
                    )
                )
            )
            LIMIT 1
        """
        res = bq_client.query(vector_query, job_config=bigquery.QueryJobConfig(
            query_parameters=[bigquery.ScalarQueryParameter("query", "STRING", query)]
        )).result()

        start_id = None
        audit_text = ""
        for row in res:
            start_id = row.id
            audit_text = row.audit_details

        if not start_id: return []

        # 2. Native Graph Traversal (GQL MATCH)
        graph_query = f"""
            GRAPH `{self.dataset}.FinGraph`
            MATCH
              (sender_person:Person)-[:Owns]->(sender_acc:Account)
              -[tx:Transfers]->
              (a:Account)
              -[repays:Repays]->(l:Loan),
              (owner:Person)-[:Owns]->(a)
            WHERE a.id = @id
            RETURN
              owner.name as owner_name,
              a.type as account_type,
              sender_person.name as sender_name,
              tx.amount as transfer_amount,
              repays.amount as repayment_amount,
              l.id as loan_id
        """
        graph_res = bq_client.query(graph_query, job_config=bigquery.QueryJobConfig(
            query_parameters=[bigquery.ScalarQueryParameter("id", "INT64", start_id)]
        )).result()

        context_docs = [Document(page_content=f"Primary Audit Log (Target Account): {audit_text}")]
        sender_names = []
        for row in graph_res:
            sender_names.append(row['sender_name'])
            doc_str = (f"Account Owner: {row['owner_name']} (Account Type: {row['account_type']}). "
                       f"Received transfer of ${row['transfer_amount']} from {row['sender_name']}. "
                       f"Made loan repayment of ${row['repayment_amount']} to Loan {row['loan_id']}.")
            context_docs.append(Document(page_content=doc_str))

        if sender_names:
            names_list = "','".join(sender_names)
            sender_audit_query = f"""
                SELECT p.name, au.audit_details
                FROM `{self.dataset}.AccountAudits` au
                JOIN `{self.dataset}.Account` a ON au.id = a.id
                JOIN `{self.dataset}.PersonOwnAccount` poa ON a.id = poa.account_id
                JOIN `{self.dataset}.Person` p ON poa.id = p.id
                WHERE p.name IN ('{names_list}')
            """
            sender_audits = bq_client.query(sender_audit_query).result()
            for row in sender_audits:
                context_docs.append(Document(page_content=f"Audit Log for Sender {row['name']}: {row['audit_details']}"))

        return context_docs

# Initialize LLM & Retriever
llm = ChatVertexAI(model_name=MODEL_NAME)
retriever = FinGraphRetriever(project=GCP_PROJECT_ID, dataset=BQ_DATASET_ID)

prompt = ChatPromptTemplate.from_template("""
You are a Lead Fraud Analyst. Use the following audit logs and graph transaction history to answer the question.
Your goal is to connect the dots between the entities and explain the flow of funds.
If you see transfers from flagged users or shell companies, highlight the money laundering risk.

Context: {context}

Question: {question}

Detailed Fraud Report:
""")

chain = (
    {"context": retriever, "question": lambda x: x}
    | prompt
    | llm
    | StrOutputParser()
)

question = "Why is Menville's loan repayment at risk? Flag any suspicious activity if you notice."
print(chain.invoke(question))

আপনি এই নমুনা এলএলএম বিশ্লেষণ প্রতিবেদনের অনুরূপ আউটপুট দেখতে পাবেন:

এলএলএম প্রতিক্রিয়া এএমএল বিশ্লেষণ প্রতিবেদন

১০. অর্থ পাচারের পথটি কল্পনা করুন

প্রোগ্রামের মাধ্যমে আমরা এইমাত্র যে অর্থ পাচারের সূত্রটি আবিষ্কার করেছি, তা চাক্ষুষভাবে বোঝার জন্য আপনি BigQuery Studio কনসোলে একটি গ্রাফ ভিজ্যুয়ালাইজেশন কোয়েরি চালাতে পারেন।

BigQuery Studio-তে এই কোয়েরিটি চালান। (গ্রাফ ভিজ্যুয়ালাইজেশন ফিচারটি সক্রিয় করুন অথবা উপলব্ধ থাকলে গ্রাফ ট্যাবে ক্লিক করুন)।

GRAPH `fingraph_rag.FinGraph`
 MATCH
   (p_shell:Person)-[o1:Owns]->(acc_shell:Account)-[t1:Transfers]->(acc_fraud:Account)-[t2:Transfers]->(acc_target:Account)-[r:Repays]->(l:Loan),
   (p_fraud:Person)-[o2:Owns]->(acc_fraud),
   (p_target:Person)-[o3:Owns]->(acc_target)
 WHERE p_target.name = 'Menville' AND p_fraud.name = 'Jacoby' AND p_shell.name = 'Doe'
 RETURN TO_JSON([
  TO_JSON(p_shell), TO_JSON(o1), TO_JSON(acc_shell),
  TO_JSON(t1), TO_JSON(acc_fraud), TO_JSON(p_fraud), TO_JSON(o2),
  TO_JSON(t2), TO_JSON(acc_target), TO_JSON(p_target), TO_JSON(o3),
  TO_JSON(r), TO_JSON(l)
]) AS result;

এই GQL কোয়েরিটি সন্দেহভাজন শেল কোম্পানির মালিক ( ডো ) থেকে মধ্যস্থতাকারী ( জ্যাকোবি )-র মধ্য দিয়ে চূড়ান্ত লক্ষ্য ( মেনভিল ) এবং ঋণ পরিশোধ পর্যন্ত সম্পূর্ণ পথটি অনুসরণ করে।

আপনি এর অনুরূপ একটি গ্রাফ ভিজ্যুয়ালাইজেশন ফলাফল দেখতে পাবেন:

চূড়ান্ত এএমএল গ্রাফ ভিজ্যুয়ালাইজেশন

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

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

BigQuery ডেটাসেট এবং ক্লাউড রিসোর্স কানেকশনটি মুছে ফেলুন:

# Delete the BigQuery dataset
bq rm -r -f $PROJECT_ID:fingraph_rag

# Delete the BigQuery Cloud Resource Connection
bq rm --connection --location=us vertex_ai_conn

রিসোর্সগুলো মুছে ফেলা হয়েছে কিনা যাচাই করুন:

bq ls --project_id $PROJECT_ID
bq ls --connection --location=us

১২. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে একটি RAG অ্যাপ্লিকেশন তৈরি করেছেন এবং এর আচরণ বিশ্লেষণ করেছেন। আপনি দেখিয়েছেন কিভাবে BigQuery-এর নিজস্ব গ্রাফ এবং ভেক্টর সার্চ ক্ষমতা ব্যবহার করে GraphRAG সম্পাদন করা যায় এবং কোনো ETL ছাড়াই একটি মানি লন্ডারিং-বিরোধী পরিকল্পনা শনাক্ত করা যায়।

আপনি যা শিখেছেন

  • স্ট্যান্ডার্ড টেবিলের উপর ভিত্তি করে BigQuery-তে কীভাবে একটি প্রপার্টি গ্রাফ তৈরি করবেন
  • BigQuery ML ব্যবহার করে কীভাবে ভেক্টর এমবেডিং তৈরি এবং সংরক্ষণ করা যায়
  • কীভাবে BigQuery গ্রাফ ট্র্যাভার্সাল এবং ভেক্টর সার্চকে একটি LangChain Retriever-এ একত্রিত করা যায়
  • কীভাবে এলএলএমগুলি গ্রাফ টপোলজির সাহায্যে সিমান্টিক অডিট লগ সংশ্লেষণ করে ফলস পজিটিভ কমাতে পারে

পরবর্তী পদক্ষেপ

রেফারেন্স নথি