1. ওভারভিউ
বিভিন্ন শিল্প জুড়ে, পেটেন্ট গবেষণা প্রতিযোগিতামূলক ল্যান্ডস্কেপ বোঝার জন্য, সম্ভাব্য লাইসেন্সিং বা অধিগ্রহণের সুযোগ সনাক্ত করার জন্য এবং বিদ্যমান পেটেন্টগুলির লঙ্ঘন এড়ানোর জন্য একটি গুরুত্বপূর্ণ হাতিয়ার।
পেটেন্ট গবেষণা বিশাল এবং জটিল। প্রাসঙ্গিক উদ্ভাবন খুঁজে বের করার জন্য অগণিত প্রযুক্তিগত বিমূর্ত মাধ্যমে sifting একটি কঠিন কাজ. ঐতিহ্যগত কীওয়ার্ড-ভিত্তিক অনুসন্ধানগুলি প্রায়শই ভুল এবং সময়সাপেক্ষ হয়। বিমূর্তগুলি দীর্ঘ এবং প্রযুক্তিগত, এটি মূল ধারণাটি দ্রুত উপলব্ধি করা কঠিন করে তোলে। এর ফলে গবেষকরা মূল পেটেন্ট হারিয়ে ফেলতে পারে বা অপ্রাসঙ্গিক ফলাফলে সময় নষ্ট করতে পারে।
এই বিপ্লবের পিছনে গোপন সস রয়েছে ভেক্টর অনুসন্ধানে। সাধারণ কীওয়ার্ড মিলের উপর নির্ভর করার পরিবর্তে, ভেক্টর অনুসন্ধান পাঠ্যকে সংখ্যাসূচক উপস্থাপনায় (এম্বেডিং) রূপান্তরিত করে। এটি আমাদের শুধুমাত্র ব্যবহৃত নির্দিষ্ট শব্দ নয়, প্রশ্নের অর্থের উপর ভিত্তি করে অনুসন্ধান করতে দেয়। সাহিত্য অনুসন্ধানের জগতে, এটি একটি গেম-চেঞ্জার। নথিতে সঠিক বাক্যাংশটি ব্যবহার না করা হলেও একটি "পরিধানযোগ্য হার্ট রেট মনিটর" এর জন্য একটি পেটেন্ট খোঁজার কল্পনা করুন৷
উদ্দেশ্য
এই কোডল্যাবে, আমরা অ্যালোয়ডিবি, পিজিভেক্টর এক্সটেনশন এবং ইন-প্লেস জেমিনি 1.5 প্রো, এমবেডিংস এবং ভেক্টর অনুসন্ধানের মাধ্যমে পেটেন্ট অনুসন্ধানের প্রক্রিয়াটিকে দ্রুত, আরও স্বজ্ঞাত, এবং অবিশ্বাস্যভাবে সুনির্দিষ্ট করার দিকে কাজ করব।
আপনি কি নির্মাণ করবেন
এই ল্যাবের অংশ হিসাবে, আপনি করবেন:
- একটি AlloyDB উদাহরণ তৈরি করুন এবং পেটেন্ট পাবলিক ডেটাসেট ডেটা লোড করুন
- AlloyDB-তে pgvector এবং জেনারেটিভ AI মডেল এক্সটেনশনগুলি সক্ষম করুন৷
- অন্তর্দৃষ্টি থেকে এম্বেডিং তৈরি করুন
- ব্যবহারকারী অনুসন্ধান পাঠ্যের জন্য রিয়েল টাইম কোসাইন সাদৃশ্য অনুসন্ধান করুন
- সার্ভারহীন ক্লাউড ফাংশনে সমাধানটি স্থাপন করুন
নিম্নলিখিত চিত্রটি তথ্যের প্রবাহ এবং বাস্তবায়নের সাথে জড়িত পদক্ষেপগুলিকে উপস্থাপন করে।
High level diagram representing the flow of the Patent Search Application with AlloyDB
প্রয়োজনীয়তা
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
- বিলিং সক্ষম সহ একটি Google ক্লাউড প্রকল্প৷
2. আপনি শুরু করার আগে
একটি প্রকল্প তৈরি করুন
- Google ক্লাউড কনসোলে , প্রকল্প নির্বাচক পৃষ্ঠায়, একটি Google ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুন।
- নিশ্চিত করুন যে আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম করা আছে৷ একটি প্রকল্পে বিলিং সক্ষম কিনা তা পরীক্ষা করতে শিখুন।
- আপনি ক্লাউড শেল ব্যবহার করবেন, Google ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ যা bq এর সাথে প্রিলোড করা হয়। গুগল ক্লাউড কনসোলের শীর্ষে সক্রিয় ক্লাউড শেল ক্লিক করুন।
- একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি পরীক্ষা করে দেখুন যে আপনি ইতিমধ্যেই প্রমাণীকৃত হয়েছেন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে:
gcloud auth list
- gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
- যদি আপনার প্রজেক্ট সেট করা না থাকে, তাহলে এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
- প্রয়োজনীয় API সক্রিয় করুন। আপনি ক্লাউড শেল টার্মিনালে একটি gcloud কমান্ড ব্যবহার করতে পারেন:
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
gcloud কমান্ডের বিকল্প হল কনসোলের মাধ্যমে প্রতিটি পণ্য অনুসন্ধান করে বা এই লিঙ্কটি ব্যবহার করে।
জিক্লাউড কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন পড়ুন।
3. আপনার AlloyDB ডাটাবেস প্রস্তুত করুন
আসুন একটি AlloyDB ক্লাস্টার, উদাহরণ এবং টেবিল তৈরি করি যেখানে পেটেন্ট ডেটাসেট লোড করা হবে।
একটি AlloyDB অবজেক্ট তৈরি করুন
ক্লাস্টার আইডি " patent-cluster
" , পাসওয়ার্ড " alloydb
" , PostgreSQL 15 সামঞ্জস্যপূর্ণ এবং অঞ্চলটিকে " us-central1
" সহ একটি ক্লাস্টার এবং উদাহরণ তৈরি করুন, নেটওয়ার্কিং " default
" এ সেট করুন৷ ইনস্ট্যান্স আইডি " patent-instance
" এ সেট করুন। CREATE CLUSTER এ ক্লিক করুন। একটি ক্লাস্টার তৈরির বিবরণ এই লিঙ্কে রয়েছে: https://cloud.google.com/alloydb/docs/cluster-create ।
একটি টেবিল তৈরি করুন
আপনি AlloyDB স্টুডিওতে নীচের DDL স্টেটমেন্ট ব্যবহার করে একটি টেবিল তৈরি করতে পারেন:
CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT) ;
এক্সটেনশন সক্রিয় করুন
পেটেন্ট অনুসন্ধান অ্যাপ তৈরির জন্য, আমরা pgvector এবং google_ml_integration এক্সটেনশনগুলি ব্যবহার করব। pgvector এক্সটেনশন আপনাকে ভেক্টর এম্বেডিং সংরক্ষণ এবং অনুসন্ধান করতে দেয়। google_ml_integration এক্সটেনশন এমন ফাংশন প্রদান করে যা আপনি SQL-এ ভবিষ্যদ্বাণী পেতে Vertex AI পূর্বাভাস শেষ পয়েন্ট অ্যাক্সেস করতে ব্যবহার করেন। নিম্নলিখিত ডিডিএলগুলি চালিয়ে এই এক্সটেনশনগুলিকে সক্ষম করুন :
CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;
অনুমতি দিন
"এম্বেডিং" ফাংশনে কার্যকর করার জন্য নীচের বিবৃতিটি চালান:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ভূমিকা মঞ্জুর করুন
Google ক্লাউড IAM কনসোল থেকে, AlloyDB পরিষেবা অ্যাকাউন্টকে মঞ্জুর করুন (যেটি এইরকম দেখাচ্ছে: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) ভূমিকা "Vertex AI ব্যবহারকারী" এর অ্যাক্সেস। PROJECT_NUMBER এ আপনার প্রকল্প নম্বর থাকবে৷
বিকল্পভাবে, আপনি gcloud কমান্ড ব্যবহার করে অ্যাক্সেস মঞ্জুর করতে পারেন:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
এম্বেডিং সংরক্ষণের জন্য একটি ভেক্টর কলাম যোগ করতে টেবিলটি পরিবর্তন করুন
আমরা এইমাত্র তৈরি করা টেবিলে abstract_embeddings ফিল্ড যোগ করতে নিচের DDL চালান। এই কলামটি পাঠ্যের ভেক্টর মানের জন্য সঞ্চয়ের অনুমতি দেবে:
ALTER TABLE patents_data ADD column abstract_embeddings vector(768);
4. ডাটাবেসে পেটেন্ট ডেটা লোড করুন
BigQuery-এ Google Patents পাবলিক ডেটাসেটগুলি আমাদের ডেটাসেট হিসাবে ব্যবহার করা হবে৷ আমরা আমাদের প্রশ্নগুলি চালানোর জন্য AlloyDB স্টুডিও ব্যবহার করব। alloydb-pgvector সংগ্রহস্থলে insert_into_patents_data.sql
স্ক্রিপ্ট রয়েছে যা আমরা পেটেন্ট ডেটা লোড করার জন্য চালাব।
- Google ক্লাউড কনসোলে, AlloyDB পৃষ্ঠাটি খুলুন।
- আপনার নতুন তৈরি ক্লাস্টার নির্বাচন করুন এবং উদাহরণে ক্লিক করুন।
- AlloyDB নেভিগেশন মেনুতে, AlloyDB Studio এ ক্লিক করুন। আপনার শংসাপত্র দিয়ে সাইন ইন করুন.
- ডানদিকের নতুন ট্যাব আইকনে ক্লিক করে একটি নতুন ট্যাব খুলুন।
- উপরে উল্লিখিত
insert_into_patents_data.sql
স্ক্রিপ্ট থেকেinsert
ক্যোয়ারী স্টেটমেন্ট কপি করুন সম্পাদকের কাছে। আপনি এই ব্যবহারের ক্ষেত্রে একটি দ্রুত ডেমোর জন্য 50-100টি সন্নিবেশ বিবৃতি অনুলিপি করতে পারেন। - রান এ ক্লিক করুন। আপনার প্রশ্নের ফলাফল ফলাফল সারণীতে প্রদর্শিত হবে।
5. পেটেন্ট ডেটার জন্য এমবেডিং তৈরি করুন
প্রথমে নিম্নলিখিত নমুনা ক্যোয়ারী চালিয়ে এমবেডিং ফাংশন পরীক্ষা করা যাক:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
এটি ক্যোয়ারীতে নমুনা পাঠ্যের জন্য এমবেডিং ভেক্টর ফেরত দিতে হবে, যা ফ্লোটগুলির একটি অ্যারের মতো দেখায়। এই মত দেখায়:
বিমূর্ত_এম্বেডিং ভেক্টর ক্ষেত্র আপডেট করুন
সংশ্লিষ্ট এমবেডিংগুলির সাথে টেবিলে পেটেন্ট বিমূর্তগুলি আপডেট করতে নীচের ডিএমএলটি চালান:
UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);
6. ভেক্টর অনুসন্ধান করুন
এখন যেহেতু টেবিল, ডেটা, এম্বেডিং সবই প্রস্তুত, চলুন ব্যবহারকারীর সার্চ টেক্সটের জন্য রিয়েল টাইম ভেক্টর সার্চ করা যাক। আপনি নীচের ক্যোয়ারী চালিয়ে এটি পরীক্ষা করতে পারেন:
SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;
এই প্রশ্নে,
- ব্যবহারকারীর অনুসন্ধান পাঠ্য হল: "একটি নতুন প্রাকৃতিক ভাষা প্রক্রিয়াকরণ সম্পর্কিত মেশিন লার্নিং মডেল"।
- আমরা মডেলটি ব্যবহার করে এমবেডিং() পদ্ধতিতে এমবেডিং-এ রূপান্তর করছি: textembedding-gecko@003।
- "<=>" COSINE SIMILARITY দূরত্ব পদ্ধতির ব্যবহার প্রতিনিধিত্ব করে।
- ডাটাবেসে সংরক্ষিত ভেক্টরের সাথে সামঞ্জস্যপূর্ণ করতে আমরা এম্বেডিং পদ্ধতির ফলাফলকে ভেক্টর টাইপে রূপান্তর করছি।
- LIMIT 10 প্রতিনিধিত্ব করে যে আমরা অনুসন্ধান পাঠ্যের 10টি নিকটতম মিল নির্বাচন করছি।
নীচে ফলাফল দেওয়া হল:
আপনি আপনার ফলাফলগুলিতে লক্ষ্য করতে পারেন, মিলগুলি অনুসন্ধান পাঠ্যের বেশ কাছাকাছি।
7. অ্যাপ্লিকেশনটিকে ওয়েবে নিয়ে যান
এই অ্যাপটিকে ওয়েবে নিয়ে যাওয়ার জন্য প্রস্তুত? নীচের পদক্ষেপগুলি অনুসরণ করুন:
- ক্লাউড শেল এডিটরে যান এবং সম্পাদকের নিচের বাম কোণে (স্ট্যাটাস বার) "ক্লাউড কোড — সাইন ইন" আইকনে ক্লিক করুন। আপনার বর্তমান Google ক্লাউড প্রকল্প নির্বাচন করুন যেটিতে বিলিং সক্ষম হয়েছে এবং নিশ্চিত করুন যে আপনি Gemini থেকে একই প্রকল্পে সাইন ইন করেছেন (স্ট্যাটাস বারের ডান কোণে)।
- ক্লাউড কোড আইকনে ক্লিক করুন এবং ক্লাউড কোড ডায়ালগ পপ আপ না হওয়া পর্যন্ত অপেক্ষা করুন। নতুন অ্যাপ্লিকেশন নির্বাচন করুন এবং নতুন অ্যাপ্লিকেশন তৈরি করুন পপ আপে, ক্লাউড ফাংশন অ্যাপ্লিকেশন নির্বাচন করুন:
নতুন অ্যাপ্লিকেশন তৈরি করুন পপ আপের পৃষ্ঠা 2/2-এ, Java: Hello World নির্বাচন করুন এবং আপনার পছন্দের স্থানে "alloydb-pgvector" হিসাবে আপনার প্রকল্পের নাম লিখুন এবং ঠিক আছে ক্লিক করুন:
- ফলে প্রজেক্ট স্ট্রাকচারে, pom.xml সার্চ করুন এবং রেপো ফাইলের বিষয়বস্তু দিয়ে প্রতিস্থাপন করুন। এটিতে আরও কয়েকটি ছাড়াও এই নির্ভরতা থাকা উচিত:
- HelloWorld.java ফাইলটিকে রেপো ফাইলের সামগ্রী দিয়ে প্রতিস্থাপন করুন।
মনে রাখবেন যে আপনাকে নীচের মানগুলিকে আপনার আসলগুলির সাথে প্রতিস্থাপন করতে হবে:
String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values
মনে রাখবেন যে ফাংশনটি "অনুসন্ধান" কী সহ ইনপুট প্যারামিটার হিসাবে অনুসন্ধান পাঠ্যের প্রত্যাশা করে এবং এই বাস্তবায়নে, আমরা ডাটাবেস থেকে শুধুমাত্র একটি নিকটতম মিল ফিরিয়ে দিচ্ছি:
// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();
//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();
try (Connection connection = dataSource.getConnection()) {
//Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
ResultSet resultSet = statement.executeQuery();
resultSet.next();
String lit = resultSet.getString("literature");
result = result + lit + "\n";
System.out.println("Matching Literature: " + lit);
}
writer.write("Here is the closest match: " + result);
}
- আপনার তৈরি করা ক্লাউড ফাংশন স্থাপন করতে, ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান। কমান্ডটি ব্যবহার করে প্রথমে সংশ্লিষ্ট প্রকল্প ফোল্ডারে নেভিগেট করতে মনে রাখবেন:
cd alloydb-pgvector
তারপর কমান্ড চালান:
gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http
গুরুত্বপূর্ণ পদক্ষেপ:
আপনি একবার স্থাপনার জন্য সেট করা হলে, আপনি Google ক্লাউড রান ফাংশন কনসোলে ফাংশনগুলি দেখতে সক্ষম হবেন। নতুন তৈরি ফাংশন অনুসন্ধান করুন এবং এটি খুলুন, কনফিগারেশন সম্পাদনা করুন এবং নিম্নলিখিত পরিবর্তন করুন:
- রানটাইম, বিল্ড, সংযোগ এবং নিরাপত্তা সেটিংসে যান
- সময়সীমা 180 সেকেন্ডে বাড়ান
- সংযোগ ট্যাবে যান:
- ইনগ্রেস সেটিংসের অধীনে, নিশ্চিত করুন যে "সমস্ত ট্রাফিকের অনুমতি দিন" নির্বাচন করা হয়েছে।
- এগ্রেস সেটিংসের অধীনে, নেটওয়ার্ক ড্রপডাউনে ক্লিক করুন এবং "নতুন ভিপিসি সংযোগকারী যোগ করুন" বিকল্পটি নির্বাচন করুন এবং পপ-আপ ডায়ালগ বক্সে আপনি যে নির্দেশাবলী দেখছেন তা অনুসরণ করুন:
- VPC সংযোগকারীর জন্য একটি নাম দিন এবং নিশ্চিত করুন যে অঞ্চলটি আপনার উদাহরণের মতোই। নেটওয়ার্ক মানটিকে ডিফল্ট হিসাবে ছেড়ে দিন এবং সাবনেটকে 10.8.0.0 এর আইপি পরিসরের সাথে কাস্টম আইপি রেঞ্জ হিসাবে সেট করুন বা উপলব্ধ কিছু অনুরূপ।
- শো স্কেলিং সেটিংস প্রসারিত করুন এবং নিশ্চিত করুন যে আপনার কনফিগারেশনটি ঠিক নিম্নলিখিতটিতে সেট করা আছে:
- CREATE এ ক্লিক করুন এবং এই সংযোগকারীটি এখন প্রস্থান সেটিংসে তালিকাভুক্ত করা উচিত।
- নতুন তৈরি সংযোগকারী নির্বাচন করুন
- এই VPC সংযোগকারীর মাধ্যমে সমস্ত ট্র্যাফিক রুট করার জন্য বেছে নিন।
8. আবেদন পরীক্ষা করুন
একবার এটি স্থাপন করা হলে, আপনি নিম্নলিখিত বিন্যাসে শেষ বিন্দু দেখতে পাবেন:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search
আপনি নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড শেল টার্মিনাল থেকে এটি পরীক্ষা করতে পারেন:
gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'
ফলাফল:
আপনি ক্লাউড ফাংশন তালিকা থেকেও এটি পরীক্ষা করতে পারেন। স্থাপন করা ফাংশন নির্বাচন করুন এবং "টেস্টিং" ট্যাবে নেভিগেট করুন। অনুরোধ json-এর জন্য ট্রিগারিং ইভেন্ট সেকশন টেক্সট বক্সে কনফিগার করুন, নিম্নলিখিতটি লিখুন:
{"search": "A new Natural Language Processing related Machine Learning Model"}
ফাংশন পরীক্ষা করুন বোতামে ক্লিক করুন এবং আপনি পৃষ্ঠার ডানদিকে ফলাফল দেখতে পাবেন:
তাই তো! AlloyDB ডেটাতে এমবেডিং মডেল ব্যবহার করে সাদৃশ্য ভেক্টর অনুসন্ধান করা সহজ।
9. পরিষ্কার করুন
এই পোস্টে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- Google ক্লাউড কনসোলে, পরিচালনায় যান
- সম্পদ পৃষ্ঠা।
- প্রকল্প তালিকায়, আপনি যে প্রকল্পটি মুছতে চান সেটি নির্বাচন করুন এবং তারপরে মুছুন ক্লিক করুন।
- ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপরে প্রোজেক্ট মুছে ফেলতে শাট ডাউন ক্লিক করুন।
10. অভিনন্দন
অভিনন্দন! আপনি সফলভাবে AlloyDB, pgvector এবং ভেক্টর অনুসন্ধান ব্যবহার করে একটি মিল অনুসন্ধান করেছেন। AlloyDB , Vertex AI , এবং Vector Search- এর ক্ষমতাগুলিকে একত্রিত করে, আমরা সাহিত্য অনুসন্ধানগুলিকে অ্যাক্সেসযোগ্য, দক্ষ এবং সত্যিকার অর্থে চালিত করার ক্ষেত্রে একটি বিশাল লাফ দিয়েছি।