paint-brush
এন্টারপ্রাইজ ডেটাতে মিল খুঁজে পেতে pgvector ব্যবহার করাদ্বারা@johnjvester
805 পড়া
805 পড়া

এন্টারপ্রাইজ ডেটাতে মিল খুঁজে পেতে pgvector ব্যবহার করা

দ্বারা John Vester14m2024/03/21
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

একটি বিপণন প্রচারে সহায়তা করার জন্য এন্টারপ্রাইজ ডেটার সাথে ডেটা পারস্পরিক সম্পর্ক আবিষ্কার করতে সাহায্য করার জন্য শব্দ ভেক্টর এবং মিল অনুসন্ধানের শক্তি ব্যবহার করুন।
featured image - এন্টারপ্রাইজ ডেটাতে মিল খুঁজে পেতে pgvector ব্যবহার করা
John Vester HackerNoon profile picture
0-item
1-item


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


এই উদাহরণের জন্য, আমি ফোকাস করতে চেয়েছিলাম কিভাবে pgvector – Postgres-এর জন্য একটি ওপেন-সোর্স ভেক্টর সাদৃশ্য অনুসন্ধান – এন্টারপ্রাইজ ডেটাতে বিদ্যমান ডেটা মিলগুলি সনাক্ত করতে ব্যবহার করা যেতে পারে।

একটি সহজ ব্যবহার কেস

একটি সাধারণ উদাহরণ হিসাবে, ধরা যাক বিপণন বিভাগের একটি প্রচারণার জন্য সহায়তা প্রয়োজন যা তারা চালু করার পরিকল্পনা করছে। লক্ষ্য হল সফ্টওয়্যার শিল্পের সাথে ঘনিষ্ঠভাবে সারিবদ্ধ শিল্পে থাকা সমস্ত Salesforce অ্যাকাউন্টের কাছে পৌঁছানো।


শেষ পর্যন্ত, তারা অন্যান্য শিল্পের জন্য মিল খুঁজে পেতে ভবিষ্যতে এই সরঞ্জামটি ব্যবহার করার ক্ষমতা সহ শীর্ষ তিনটি সবচেয়ে অনুরূপ শিল্পের অ্যাকাউন্টগুলিতে ফোকাস করতে চায়। যদি সম্ভব হয়, তারা সর্বদা শীর্ষ তিনটি ফেরত না দিয়ে পছন্দসই সংখ্যক মিল শিল্প সরবরাহ করার বিকল্প চাইবে।

উচ্চ-স্তরের নকশা

এই ব্যবহার কেসকে কেন্দ্র করে একটি মিল অনুসন্ধান করা। যদিও ম্যানুয়ালি এই ব্যায়ামটি সম্পূর্ণ করা সম্ভব, Wikipedia2Vec টুলটি মনে আসে কারণ ইতিমধ্যেই একাধিক ভাষার জন্য তৈরি করা হয়েছে প্রাক-প্রশিক্ষিত এমবেডিং। ওয়ার্ড এমবেডিং- যা ভেক্টর নামেও পরিচিত- হল শব্দের সাংখ্যিক উপস্থাপনা যা তাদের সিনট্যাকটিক এবং শব্দার্থিক তথ্য উভয়ই ধারণ করে। শব্দগুলিকে ভেক্টর হিসাবে উপস্থাপন করে, আমরা গাণিতিকভাবে নির্ধারণ করতে পারি কোন শব্দগুলি শব্দার্থগতভাবে অন্যদের "ঘনিষ্ঠ"।


আমাদের উদাহরণে, সেলসফোর্সে কনফিগার করা প্রতিটি শিল্পের জন্য শব্দ ভেক্টর তৈরি করতে আমরা একটি সাধারণ পাইথন প্রোগ্রামও লিখতে পারতাম।


pgvector এক্সটেনশনের জন্য একটি Postgres ডাটাবেস প্রয়োজন। যাইহোক, আমাদের উদাহরণের জন্য এন্টারপ্রাইজ ডেটা বর্তমানে সেলসফোর্সে রয়েছে। সৌভাগ্যবশত, Heroku Connect Heroku Postgres-এর সাথে Salesforce অ্যাকাউন্টগুলিকে সিঙ্ক করার একটি সহজ উপায় প্রদান করে, এটিকে salesforce.account নামে একটি টেবিলে সংরক্ষণ করে। তারপরে, আমাদের কাছে salesforce.industries নামে আরেকটি টেবিল থাকবে যেখানে সেলসফোর্সের প্রতিটি শিল্প রয়েছে (একটি VARCHAR কী হিসাবে), এর সাথে যুক্ত শব্দ ভেক্টর।


Postgres-এ Salesforce ডেটা এবং শব্দ ভেক্টরের সাথে, আমরা Java এবং Spring Boot ব্যবহার করে একটি RESTful API তৈরি করব। এই পরিষেবাটি প্রয়োজনীয় ক্যোয়ারী করবে এবং JSON ফর্ম্যাটে ফলাফল দেবে।


আমরা এইভাবে সমাধানটির উচ্চ-স্তরের দৃষ্টিভঙ্গি চিত্রিত করতে পারি:


সোর্স কোডটি গিটল্যাবে থাকবে। একটি git push heroku কমান্ড জারি করা হেরোকুতে একটি স্থাপনাকে ট্রিগার করবে, একটি RESTful API প্রবর্তন করবে যা বিপণন দল সহজেই ব্যবহার করতে পারে।

সমাধান বিল্ডিং

জায়গায় উচ্চ-স্তরের নকশার সাথে, আমরা একটি সমাধান তৈরি করা শুরু করতে পারি। আমার Salesforce লগইন ব্যবহার করে, আমি এই অনুশীলনের ডেটা দেখতে অ্যাকাউন্ট স্ক্রীনে নেভিগেট করতে সক্ষম হয়েছি। এখানে এন্টারপ্রাইজ ডেটার প্রথম পৃষ্ঠার একটি উদাহরণ রয়েছে:


একটি Heroku অ্যাপ তৈরি করুন

এই প্রচেষ্টার জন্য, আমি বিপণন দলের অনুরোধের সমাধান করার জন্য Heroku ব্যবহার করার পরিকল্পনা করেছি। আমি আমার Heroku অ্যাকাউন্টে লগ ইন করেছি এবং একটি নতুন অ্যাপ্লিকেশন প্রতিষ্ঠা করতে নতুন অ্যাপ তৈরি করুন বোতামটি ব্যবহার করেছি যার নামক similarity-search-sfdc :


অ্যাপটি তৈরি করার পরে, আমি Heroku Postgres অ্যাড-অন খুঁজে পেতে সম্পদ ট্যাবে নেভিগেট করেছি। আমি অ্যাড-অন অনুসন্ধান ক্ষেত্রে "পোস্টগ্রেস" টাইপ করেছি।


তালিকা থেকে Heroku Postgres নির্বাচন করার পর, আমি স্ট্যান্ডার্ড 0 প্ল্যান বেছে নিয়েছি, কিন্তু pgvector স্ট্যান্ডার্ড-টায়ার (বা উচ্চতর) ডাটাবেস অফারে উপলব্ধ PostgreSQL 15 বা বিটা এসেনশিয়াল-টায়ার ডাটাবেস


যখন আমি অ্যাড-অন নিশ্চিত করেছি, তখন Heroku একটি DATABASE_URL সংযোগ স্ট্রিং তৈরি করেছে এবং প্রদান করেছে। আমি আমার অ্যাপের সেটিংস ট্যাবের কনফিগ ভার্স বিভাগে এটি পেয়েছি। আমি আমার ডাটাবেসের সাথে সংযোগ করতে এবং এই মত pgvector এক্সটেনশন সক্ষম করতে এই তথ্যটি ব্যবহার করেছি:


 CREATE EXTENSION vector;


এরপরে, আমি Heroku Connect অ্যাড-অন অনুসন্ধান করেছি এবং পেয়েছি। আমি জানতাম এটি আমাকে Salesforce এ এন্টারপ্রাইজ ডেটার সাথে সংযোগ করার একটি সহজ উপায় দেবে।


এই অনুশীলনের জন্য, বিনামূল্যের ডেমো সংস্করণ পরিকল্পনা ঠিক কাজ করে।


এই মুহুর্তে, similarity-search-sfdc অ্যাপের জন্য রিসোর্স ট্যাবটি এইরকম দেখাচ্ছে:


আমার Salesforce অ্যাকাউন্ট Heroku Connect-এর সাথে লিঙ্ক করার জন্য আমি “ Heroku Connect সেট আপ করা ” নির্দেশাবলী অনুসরণ করেছি৷ তারপর, আমি সিঙ্ক্রোনাইজেশনের জন্য অ্যাকাউন্ট অবজেক্ট নির্বাচন করেছি। একবার সম্পূর্ণ হয়ে গেলে, আমি Heroku Connect এবং অন্তর্নিহিত Postgres ডাটাবেসে একই Salesforce অ্যাকাউন্ট ডেটা দেখতে সক্ষম হয়েছিলাম।


SQL দৃষ্টিকোণ থেকে, আমি যা করেছি তার ফলে নিম্নলিখিত ডিজাইন সহ একটি salesforce.account টেবিল তৈরি হয়েছে:


 create table salesforce.account ( createddate timestamp, isdeleted boolean, name varchar(255), systemmodstamp timestamp, accountnumber varchar(40), industry varchar(255), sfid varchar(18), id serial primary key, _hc_lastop varchar(32), _hc_err text );


ভেক্টর তৈরি করুন

সাদৃশ্য অনুসন্ধানটি প্রত্যাশা অনুযায়ী কাজ করার জন্য, আমাকে প্রতিটি Salesforce অ্যাকাউন্ট শিল্পের জন্য শব্দ ভেক্টর তৈরি করতে হবে:


  • পোশাক
  • ব্যাংকিং
  • বায়োটেকনোলজি
  • নির্মাণ
  • শিক্ষা
  • ইলেকট্রনিক্স
  • প্রকৌশল
  • বিনোদন
  • খাদ্য ও পানীয়
  • অর্থায়ন
  • সরকার
  • স্বাস্থ্যসেবা
  • আতিথেয়তা
  • বীমা
  • মিডিয়া
  • লাভের জন্য নয়
  • অন্যান্য
  • বিনোদন
  • খুচরা
  • পাঠানো
  • প্রযুক্তি
  • টেলিযোগাযোগ
  • পরিবহন
  • ইউটিলিটিস


যেহেতু প্রাথমিক ব্যবহারের ক্ষেত্রে সফ্টওয়্যার শিল্পের জন্য মিল খুঁজে পাওয়ার প্রয়োজনীয়তা নির্দেশ করে, তাই আমাদের সেই শিল্পের জন্যও একটি শব্দ ভেক্টর তৈরি করতে হবে।


এই অনুশীলনের জন্য জিনিসগুলি সহজ রাখতে, আমি পাইথন 3.9 এবং embed.py নামক একটি ফাইল ব্যবহার করে ম্যানুয়ালি এই কাজটি সম্পাদন করেছি, যা দেখতে এইরকম:


 from wikipedia2vec import Wikipedia2Vec wiki2vec = Wikipedia2Vec.load('enwiki_20180420_100d.pkl') print(wiki2vec.get_word_vector('software').tolist())


অনুগ্রহ করে মনে রাখবেন – get_word_vector() পদ্ধতিটি শিল্পের একটি ছোট হাতের উপস্থাপনা আশা করে।


python embed.py চালানো software শব্দের জন্য নিম্নলিখিত শব্দ ভেক্টর তৈরি করেছে:


 [-0.40402618050575256, 0.5711150765419006, -0.7885153293609619, -0.15960034728050232, -0.5692323446273804, 0.005377458408474922, -0.1315757781267166, -0.16840921342372894, 0.6626015305519104, -0.26056772470474243, 0.3681095242500305, -0.453583300113678, 0.004738557618111372, -0.4111144244670868, -0.1817493587732315, -0.9268549680709839, 0.07973367720842361, -0.17835664749145508, -0.2949991524219513, -0.5533796548843384, 0.04348105192184448, -0.028855713084340096, -0.13867013156414032, -0.6649054884910583, 0.03129105269908905, -0.24817068874835968, 0.05968991294503212, -0.24743635952472687, 0.20582349598407745, 0.6240783929824829, 0.3214546740055084, -0.14210252463817596, 0.3178422152996063, 0.7693028450012207, 0.2426985204219818, -0.6515568494796753, -0.2868216037750244, 0.3189859390258789, 0.5168254971504211, 0.11008890718221664, 0.3537853956222534, -0.713259220123291, -0.4132286608219147, -0.026366405189037323, 0.003034653142094612, -0.5275223851203918, -0.018167126923799515, 0.23878540098667145, -0.6077089905738831, 0.5368344187736511, -0.1210874393582344, 0.26415619254112244, -0.3066694438457489, 0.1471938043832779, 0.04954215884208679, 0.2045321762561798, 0.1391817331314087, 0.5286830067634583, 0.5764685273170471, 0.1882934868335724, -0.30167853832244873, -0.2122340053319931, -0.45651525259017944, -0.016777794808149338, 0.45624101161956787, -0.0438646525144577, -0.992512047290802, -0.3771328926086426, 0.04916151612997055, -0.5830298066139221, -0.01255014631897211, 0.21600870788097382, -0.18419665098190308, 0.1754663586616516, -0.1499166339635849, -0.1916201263666153, -0.22884036600589752, 0.17280352115631104, 0.25274306535720825, 0.3511175513267517, -0.20270302891731262, -0.6383468508720398, 0.43260180950164795, -0.21136239171028137, -0.05920517444610596, 0.7145522832870483, 0.7626600861549377, -0.5473887920379639, 0.4523043632507324, -0.1723199188709259, -0.10209759324789047, -0.5577948093414307, -0.10156919807195663, 0.31126976013183594, 0.3604489266872406, -0.13295558094978333, 0.2473849356174469, 0.278846800327301, -0.28618067502975464, 0.00527254119515419]


শিল্পের জন্য টেবিল তৈরি করুন

শব্দ ভেক্টর সংরক্ষণ করার জন্য, আমাদের নিম্নলিখিত SQL কমান্ড ব্যবহার করে Postgres ডাটাবেসে একটি industries টেবিল যোগ করতে হবে:


 create table salesforce.industries ( name varchar not null constraint industries_pk primary key, embeddings vector(100) not null );


তৈরি করা industries টেবিলের সাথে, আমরা তৈরি করা প্রতিটি শব্দ ভেক্টর সন্নিবেশ করব। আমরা নিম্নলিখিত অনুরূপ SQL বিবৃতি দিয়ে এটি করি:


 INSERT INTO salesforce.industries (name, embeddings) VALUES ('Software','[-0.40402618050575256, 0.5711150765419006, -0.7885153293609619, -0.15960034728050232, -0.5692323446273804, 0.005377458408474922, -0.1315757781267166, -0.16840921342372894, 0.6626015305519104, -0.26056772470474243, 0.3681095242500305, -0.453583300113678, 0.004738557618111372, -0.4111144244670868, -0.1817493587732315, -0.9268549680709839, 0.07973367720842361, -0.17835664749145508, -0.2949991524219513, -0.5533796548843384, 0.04348105192184448, -0.028855713084340096, -0.13867013156414032, -0.6649054884910583, 0.03129105269908905, -0.24817068874835968, 0.05968991294503212, -0.24743635952472687, 0.20582349598407745, 0.6240783929824829, 0.3214546740055084, -0.14210252463817596, 0.3178422152996063, 0.7693028450012207, 0.2426985204219818, -0.6515568494796753, -0.2868216037750244, 0.3189859390258789, 0.5168254971504211, 0.11008890718221664, 0.3537853956222534, -0.713259220123291, -0.4132286608219147, -0.026366405189037323, 0.003034653142094612, -0.5275223851203918, -0.018167126923799515, 0.23878540098667145, -0.6077089905738831, 0.5368344187736511, -0.1210874393582344, 0.26415619254112244, -0.3066694438457489, 0.1471938043832779, 0.04954215884208679, 0.2045321762561798, 0.1391817331314087, 0.5286830067634583, 0.5764685273170471, 0.1882934868335724, -0.30167853832244873, -0.2122340053319931, -0.45651525259017944, -0.016777794808149338, 0.45624101161956787, -0.0438646525144577, -0.992512047290802, -0.3771328926086426, 0.04916151612997055, -0.5830298066139221, -0.01255014631897211, 0.21600870788097382, -0.18419665098190308, 0.1754663586616516, -0.1499166339635849, -0.1916201263666153, -0.22884036600589752, 0.17280352115631104, 0.25274306535720825, 0.3511175513267517, -0.20270302891731262, -0.6383468508720398, 0.43260180950164795, -0.21136239171028137, -0.05920517444610596, 0.7145522832870483, 0.7626600861549377, -0.5473887920379639, 0.4523043632507324, -0.1723199188709259, -0.10209759324789047, -0.5577948093414307, -0.10156919807195663, 0.31126976013183594, 0.3604489266872406, -0.13295558094978333, 0.2473849356174469, 0.278846800327301, -0.28618067502975464, 0.00527254119515419] ');


অনুগ্রহ করে মনে রাখবেন – যখন আমরা সফ্টওয়্যার ইন্ডাস্ট্রির (সফ্টওয়্যার) ছোট হাতের উপস্থাপনা সহ একটি শব্দ ভেক্টর তৈরি করেছি, তখন industries.name কলামটি ক্যাপিটালাইজড শিল্প নামের (সফ্টওয়্যার) সাথে মেলে।


একবার তৈরি করা সমস্ত শব্দ ভেক্টর industries টেবিলে যোগ করা হলে, আমরা একটি RESTful API প্রবর্তনে আমাদের ফোকাস পরিবর্তন করতে পারি।

একটি স্প্রিং বুট পরিষেবা চালু করুন

এটি এমন একটি বিন্দু যেখানে একটি সফ্টওয়্যার প্রকৌশলী হিসাবে আমার আবেগ উচ্চ গিয়ারে ঝাঁপিয়ে পড়ে কারণ আমার কাছে চ্যালেঞ্জের সমাধান করার জন্য সবকিছু ছিল।


এর পরে, স্প্রিং বুট 3.2.2 এবং জাভা (টেমুরিন) 17 ব্যবহার করে, আমি নিম্নলিখিত মাভেন নির্ভরতার সাথে ইন্টেলিজে আইডিইএ-তে similarity-search-sfdc প্রকল্প তৈরি করেছি:


 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.pgvector</groupId> <artifactId>pgvector</artifactId> <version>0.1.4</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>


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


 @AllArgsConstructor @NoArgsConstructor @Data @Entity @Table(name = "account", schema = "salesforce") public class Account { @Id @Column(name = "sfid") private String id; private String name; private String industry; } @AllArgsConstructor @NoArgsConstructor @Data @Entity @Table(name = "industries", schema = "salesforce") public class Industry { @Id private String name; }


JpaRepository ইন্টারফেস ব্যবহার করে, Postgres টেবিলে সহজে অ্যাক্সেসের অনুমতি দেওয়ার জন্য আমি নিম্নলিখিত এক্সটেনশনগুলি যোগ করেছি:


 public interface AccountsRepository extends JpaRepository<Account, String> { @Query(nativeQuery = true, value = "SELECT sfid, name, industry " + "FROM salesforce.account " + "WHERE industry IN (SELECT name " + " FROM salesforce.industries " + " WHERE name != :industry " + " ORDER BY embeddings <-> (SELECT embeddings FROM salesforce.industries WHERE name = :industry) " + " LIMIT :limit)" + "ORDER BY name") Set<Account> findSimilaritiesForIndustry(String industry, int limit); } public interface IndustriesRepository extends JpaRepository<Industry, String> { }


findSimilaritiesForIndustry() পদ্ধতিটি লক্ষ্য করুন যেখানে এই ব্যবহারের ক্ষেত্রে সমাধানের জন্য সমস্ত ভারী উত্তোলন করা হবে। পদ্ধতি নিম্নলিখিত পরামিতি গ্রহণ করবে:


  • industry : শিল্পের জন্য মিল খুঁজে পাওয়া যায়
  • limit : অ্যাকাউন্টের জন্য অনুসন্ধান করার সময় সর্বোচ্চ সংখ্যক শিল্পের সাদৃশ্য খুঁজে পাওয়া যায়


উপরের আমাদের ক্যোয়ারীতে ইউক্লিডীয় দূরত্ব অপারেটর (<->) নোট করুন। সাদৃশ্য অনুসন্ধান সম্পাদনের জন্য এটি এক্সটেনশনের অন্তর্নির্মিত অপারেটর


মূল "সফ্টওয়্যার" শিল্প ব্যবহারের ক্ষেত্রে এবং তিনটি নিকটতম শিল্পের জন্য একটি সীমা সেট করার সাথে, সঞ্চালিত প্রশ্নটি এইরকম দেখাবে:


 SELECT sfid, name, industry FROM salesforce.account WHERE industry IN (SELECT name FROM salesforce.industries WHERE name != 'Software' ORDER BY embeddings <-> (SELECT embeddings FROM salesforce.industries WHERE name = 'Software') LIMIT 3) ORDER BY name;


সেখান থেকে, আমি JPA সংগ্রহস্থলগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য AccountsService ক্লাস তৈরি করেছি:


 @RequiredArgsConstructor @Service public class AccountsService { private final AccountsRepository accountsRepository; private final IndustriesRepository industriesRepository; public Set<Account> getAccountsBySimilarIndustry(String industry, int limit) throws Exception { List<Industry> industries = industriesRepository.findAll(); if (industries .stream() .map(Industry::getName) .anyMatch(industry::equals)) { return accountsRepository .findSimilaritiesForIndustry(industry, limit); } else { throw new Exception( "Could not locate '" + industry + "' industry"); } } }


অবশেষে, আমার কাছে AccountsController ক্লাস একটি RESTful এন্ট্রি পয়েন্ট প্রদান করে এবং AccountsService এর সাথে সংযোগ স্থাপন করেছিল:


 @RequiredArgsConstructor @RestController @RequestMapping(value = "/accounts") public class AccountsController { private final AccountsService accountsService; @GetMapping(value = "/similarities") public ResponseEntity<Set<Account>> getAccountsBySimilarIndustry(@RequestParam String industry, @RequestParam int limit) { try { return new ResponseEntity<>( accountsService .getAccountsBySimilarIndustry(industry, limit), HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } }


হেরোকুতে স্থাপন করুন

স্প্রিং বুট পরিষেবা প্রস্তুত হওয়ার সাথে সাথে, আমি হেরোকুকে আমাদের পরিষেবা সম্পর্কে আরও জানতে প্রকল্পে নিম্নলিখিত Procfile যোগ করেছি:


 web: java $JAVA_OPTS -Dserver.port=$PORT -jar target/*.jar


নিরাপদ থাকার জন্য, Java এবং Maven এর কোন সংস্করণ প্রত্যাশিত তা নির্দিষ্ট করতে আমি system.properties ফাইল যোগ করেছি:


 java.runtime.version=17 maven.version=3.9.5


Heroku CLI ব্যবহার করে, আমি Heroku প্ল্যাটফর্মে similarity-search-sfdc পরিষেবার জন্য আমার GitLab সংগ্রহস্থলে একটি রিমোট যোগ করেছি:


 heroku git:remote -a similarity-search-sfdc


আমি নিম্নলিখিত কমান্ডের মাধ্যমে similarity-search-sfdc পরিষেবার জন্য বিল্ডপ্যাক প্রকার সেট করেছি:


 heroku buildpacks:set https://github.com/heroku/heroku-buildpack-java


অবশেষে, আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে Heroku-এ similarity-search-sfdc পরিষেবা স্থাপন করেছি:


 git push heroku


এখন, similarity-search-sfdc অ্যাপের জন্য সম্পদ ট্যাবটি নীচে দেখানো হয়েছে:


অ্যাকশনে মিল অনুসন্ধান

RESTful API চলার সাথে, আমি সফ্টওয়্যার শিল্পের সবচেয়ে কাছাকাছি শীর্ষ তিনটি সেলসফোর্স শিল্প (এবং সংশ্লিষ্ট অ্যাকাউন্ট) সনাক্ত করতে নিম্নলিখিত cURL কমান্ড জারি করেছি:


 curl --location 'https://HEROKU-APP-ROOT-URL/accounts/similarities?industry=Software&limit=3'


RESTful API নিম্নলিখিত পেলোড সহ একটি 200 OK HTTP প্রতিক্রিয়া স্থিতি প্রদান করে:


 [ { "id": "001Kd00001bsP80IAE", "name": "CleanSlate Technology Group", "industry": "Technology" }, { "id": "001Kd00001bsPBFIA2", "name": "CMG Worldwide", "industry": "Media" }, { "id": "001Kd00001bsP8AIAU", "name": "Dev Spotlight", "industry": "Technology" }, { "id": "001Kd00001bsP8hIAE", "name": "Egghead", "industry": "Electronics" }, { "id": "001Kd00001bsP85IAE", "name": "Marqeta", "industry": "Technology" } ]


ফলস্বরূপ, প্রযুক্তি , মিডিয়া , এবং ইলেকট্রনিক্স শিল্প এই উদাহরণে সফ্টওয়্যার শিল্পের নিকটতম শিল্প।


এখন, বিপণন বিভাগের অ্যাকাউন্টগুলির একটি তালিকা রয়েছে যা তারা তাদের পরবর্তী প্রচারের জন্য যোগাযোগ করতে পারে।

উপসংহার

বছর আগে, আমি টিম ফোর্টেস 2 মাল্টিপ্লেয়ার ভিডিও গেম খেলতে স্বীকার করার চেয়ে বেশি সময় ব্যয় করেছি। এখানে 2012 সালের একটি ইভেন্টের একটি স্ক্রিনশট রয়েছে যা অনেক মজার ছিল:


আমার জীবনের এই দিকটির সাথে যারা পরিচিত তারা আপনাকে বলতে পারে যে খেলোয়াড় শ্রেণীর আমার ডিফল্ট পছন্দ ছিল সৈনিক। কারণ সৈনিকের স্বাস্থ্য, চলাচল, গতি এবং ফায়ার পাওয়ারের সর্বোত্তম ভারসাম্য রয়েছে।


আমি মনে করি সফ্টওয়্যার প্রকৌশলীরা বাস্তব জগতের "সৈনিক শ্রেণী" কারণ আমরা যে কোনও পরিস্থিতির সাথে খাপ খাইয়ে নিতে পারি এবং এমন সমাধান প্রদানের উপর ফোকাস করতে পারি যা একটি দক্ষ উপায়ে প্রত্যাশা পূরণ করে।


এখন কয়েক বছর ধরে, আমি নিম্নলিখিত মিশনের বিবৃতিতে মনোনিবেশ করেছি, যা আমি মনে করি যে কোনও আইটি পেশাদারের জন্য প্রয়োগ করা যেতে পারে:


“আপনার বৌদ্ধিক সম্পত্তির মূল্যকে প্রসারিত করে এমন বৈশিষ্ট্য/কার্যকারিতা প্রদানের উপর আপনার সময়কে ফোকাস করুন। অন্য সবকিছুর জন্য ফ্রেমওয়ার্ক, পণ্য এবং পরিষেবার সুবিধা নিন।"

- জে. ভেস্টার


এই পোস্টের উদাহরণে, আমরা পোস্টগ্রেস ডাটাবেসের সাথে এন্টারপ্রাইজ ডেটা সিঙ্ক্রোনাইজ করতে Heroku Connect-এর সুবিধা নিতে পেরেছি। pgvector এক্সটেনশন ইনস্টল করার পরে, আমরা সেই Salesforce অ্যাকাউন্টগুলি থেকে প্রতিটি অনন্য শিল্পের জন্য শব্দ ভেক্টর তৈরি করেছি। অবশেষে, আমরা একটি স্প্রিং বুট পরিষেবা প্রবর্তন করেছি, যা Salesforce অ্যাকাউন্টগুলি সনাক্ত করার প্রক্রিয়াকে সহজ করেছে যার শিল্প অন্য শিল্পের সবচেয়ে কাছে ছিল৷


আমরা বিদ্যমান ওপেন-সোর্স প্রযুক্তি, একটি ক্ষুদ্র স্প্রিং বুট পরিষেবা এবং Heroku PaaS - সম্পূর্ণরূপে আমার মিশন বিবৃতি মেনে চলার মাধ্যমে এই ব্যবহারের ক্ষেত্রে দ্রুত সমাধান করেছি। এই ফ্রেমওয়ার্ক, পণ্য এবং পরিষেবাগুলি ছাড়া কতটা সময় লাগবে তা আমি কল্পনা করতে পারি না।


আপনি যদি আগ্রহী হন তবে আপনি গিটল্যাবে এই নিবন্ধটির মূল উত্স কোডটি খুঁজে পেতে পারেন:


https://gitlab.com/johnjvester/similarity-search-sfdc


একটি সত্যিই মহান দিন আছে!