paint-brush
एंटरप्राइज़ डेटा में समानताएँ खोजने के लिए pgvector का उपयोग करनाद्वारा@johnjvester
813 रीडिंग
813 रीडिंग

एंटरप्राइज़ डेटा में समानताएँ खोजने के लिए pgvector का उपयोग करना

द्वारा John Vester14m2024/03/21
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

मार्केटिंग अभियान में सहायता के लिए एंटरप्राइज़ डेटा के साथ डेटा सहसंबंध खोजने में सहायता के लिए शब्द वैक्टर और समानता खोजों की शक्ति का उपयोग करें।
featured image - एंटरप्राइज़ डेटा में समानताएँ खोजने के लिए pgvector का उपयोग करना
John Vester HackerNoon profile picture
0-item
1-item


सॉफ्टवेयर इंजीनियर इस दुनिया में एक रोमांचक स्थान रखते हैं। तकनीकी स्टैक या उद्योग के बावजूद, हमें उन समस्याओं को हल करने का काम सौंपा गया है जो सीधे हमारे नियोक्ताओं के लक्ष्यों और उद्देश्यों में योगदान करती हैं। एक बोनस के रूप में, हमें अपने सामने आने वाली किसी भी चुनौती को कम करने के लिए प्रौद्योगिकी का उपयोग करने का अवसर मिलता है।


इस उदाहरण के लिए, मैं इस बात पर ध्यान केंद्रित करना चाहता था कि कैसे पीजीवेक्टर - पोस्टग्रेज़ के लिए एक ओपन-सोर्स वेक्टर समानता खोज - का उपयोग एंटरप्राइज़ डेटा में मौजूद डेटा समानताओं की पहचान करने के लिए किया जा सकता है।

एक साधारण उपयोग का मामला

एक सरल उदाहरण के रूप में, मान लें कि विपणन विभाग को उस अभियान के लिए सहायता की आवश्यकता है जिसे वे शुरू करने की योजना बना रहे हैं। लक्ष्य उन सभी सेल्सफोर्स खातों तक पहुंचना है जो उन उद्योगों में हैं जो सॉफ्टवेयर उद्योग के साथ निकटता से जुड़े हुए हैं।


अंत में, वे भविष्य में अन्य उद्योगों के लिए समानताएं खोजने के लिए इस उपकरण का उपयोग करने की क्षमता के साथ, शीर्ष तीन सबसे समान उद्योगों के खातों पर ध्यान केंद्रित करना चाहेंगे। यदि संभव हो, तो वे हमेशा शीर्ष तीन को लौटाने के बजाय मिलान वाले उद्योगों की वांछित संख्या प्रदान करने का विकल्प चाहेंगे।

उच्च स्तरीय डिज़ाइन

यह उपयोग मामला समानता खोज करने पर केंद्रित है। हालाँकि इस अभ्यास को मैन्युअल रूप से पूरा करना संभव है, लेकिन पहले से प्रशिक्षित एम्बेडिंग के कारण विकिपीडिया2Vec टूल दिमाग में आता है जो पहले से ही कई भाषाओं के लिए बनाया गया है। शब्द एम्बेडिंग - जिसे वेक्टर के रूप में भी जाना जाता है - शब्दों का संख्यात्मक प्रतिनिधित्व है जिसमें उनकी वाक्यात्मक और अर्थ संबंधी जानकारी दोनों शामिल होती हैं। शब्दों को वैक्टर के रूप में प्रस्तुत करके, हम गणितीय रूप से यह निर्धारित कर सकते हैं कि कौन से शब्द शब्दार्थ की दृष्टि से दूसरों के "करीब" हैं।


हमारे उदाहरण में, हम सेल्सफोर्स में कॉन्फ़िगर किए गए प्रत्येक उद्योग के लिए वर्ड वैक्टर बनाने के लिए एक सरल पायथन प्रोग्राम भी लिख सकते थे।


pgvector एक्सटेंशन के लिए पोस्टग्रेज डेटाबेस की आवश्यकता होती है। हालाँकि, हमारे उदाहरण के लिए एंटरप्राइज़ डेटा वर्तमान में Salesforce में मौजूद है। सौभाग्य से, हेरोकू कनेक्ट सेल्सफोर्स खातों को हेरोकू पोस्टग्रेज के साथ सिंक करने का एक आसान तरीका प्रदान करता है, इसे salesforce.account नामक तालिका में संग्रहीत करता है। फिर, हमारे पास salesforce.industries नामक एक और तालिका होगी जिसमें Salesforce में प्रत्येक उद्योग (VARCHAR कुंजी के रूप में), उसके संबंधित शब्द वेक्टर के साथ शामिल होगा।


पोस्टग्रेज में सेल्सफोर्स डेटा और वर्ड वैक्टर के साथ, हम जावा और स्प्रिंग बूट का उपयोग करके एक रेस्टफुल एपीआई बनाएंगे। यह सेवा आवश्यक क्वेरी निष्पादित करेगी और परिणाम JSON प्रारूप में वापस कर देगी।


हम समाधान के उच्च-स्तरीय दृष्टिकोण को इस प्रकार चित्रित कर सकते हैं:


स्रोत कोड GitLab में रहेगा. git push heroku कमांड जारी करने से हेरोकू में तैनाती शुरू हो जाएगी, एक रेस्टफुल एपीआई पेश किया जाएगा जिसे मार्केटिंग टीम आसानी से उपभोग कर सकती है।

समाधान का निर्माण

उच्च-स्तरीय डिज़ाइन के साथ, हम एक समाधान बनाना शुरू कर सकते हैं। अपने सेल्सफोर्स लॉगिन का उपयोग करके, मैं इस अभ्यास के लिए डेटा देखने के लिए अकाउंट्स स्क्रीन पर नेविगेट करने में सक्षम था। यहां एंटरप्राइज़ डेटा के पहले पृष्ठ का एक उदाहरण दिया गया है:


एक हेरोकू ऐप बनाएं

इस प्रयास के लिए, मैंने मार्केटिंग टीम के अनुरोध को हल करने के लिए हेरोकू का उपयोग करने की योजना बनाई। मैंने अपने हेरोकू खाते में लॉग इन किया और similarity-search-sfdc नामक एक नया एप्लिकेशन स्थापित करने के लिए नया ऐप बनाएं बटन का उपयोग किया:


ऐप बनाने के बाद, मैं हेरोकू पोस्टग्रेज ऐड-ऑन खोजने के लिए संसाधन टैब पर गया। मैंने ऐड-ऑन खोज फ़ील्ड में "पोस्टग्रेज़" टाइप किया।


सूची से हेरोकू पोस्टग्रेज का चयन करने के बाद, मैंने मानक 0 योजना को चुना, लेकिन पीजीवेक्टर पोस्टग्रेएसक्यूएल 15 या बीटा एसेंशियल-टियर डेटाबेस पर चलने वाले मानक-स्तरीय (या उच्चतर) डेटाबेस प्रसाद पर उपलब्ध है।


जब मैंने ऐड-ऑन की पुष्टि की, तो हेरोकू ने एक DATABASE_URL कनेक्शन स्ट्रिंग तैयार की और प्रदान की। मुझे यह मेरे ऐप के सेटिंग टैब के कॉन्फ़िग वर्ज़ अनुभाग में मिला। मैंने इस जानकारी का उपयोग अपने डेटाबेस से कनेक्ट करने और पीजीवेक्टर एक्सटेंशन को इस तरह सक्षम करने के लिए किया:


 CREATE EXTENSION vector;


इसके बाद, मैंने हेरोकू कनेक्ट ऐड-ऑन खोजा और पाया। मैं जानता था कि इससे मुझे Salesforce में एंटरप्राइज़ डेटा से जुड़ने का एक आसान तरीका मिल जाएगा।


इस अभ्यास के लिए, निःशुल्क डेमो संस्करण योजना बिल्कुल ठीक काम करती है।


इस बिंदु पर, similarity-search-sfdc ऐप के लिए संसाधन टैब इस तरह दिखता था:


मैंने अपने सेल्सफोर्स खाते को हेरोकू कनेक्ट से लिंक करने के लिए " हेरोकू कनेक्ट सेट अप करना " निर्देशों का पालन किया। फिर, मैंने सिंक्रनाइज़ेशन के लिए खाता ऑब्जेक्ट का चयन किया। एक बार पूरा होने पर, मैं हेरोकू कनेक्ट और अंतर्निहित पोस्टग्रेज़ डेटाबेस में समान सेल्सफोर्स खाता डेटा देखने में सक्षम था।


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 );


वेक्टर उत्पन्न करें

समानता खोज को अपेक्षित रूप से कार्य करने के लिए, मुझे प्रत्येक सेल्सफोर्स खाता उद्योग के लिए शब्द वैक्टर उत्पन्न करने की आवश्यकता थी:


  • परिधान
  • बैंकिंग
  • जैव प्रौद्योगिकी
  • निर्माण
  • शिक्षा
  • इलेक्ट्रानिक्स
  • अभियांत्रिकी
  • मनोरंजन
  • खाद्य और पेय
  • वित्त
  • सरकार
  • स्वास्थ्य देखभाल
  • मेहमाननवाज़ी
  • बीमा
  • मिडिया
  • लाभ के लिए नहीं
  • अन्य
  • मनोरंजन
  • खुदरा
  • शिपिंग
  • तकनीकी
  • दूरसंचार
  • परिवहन
  • उपयोगिताओं


चूंकि प्राथमिक उपयोग के मामले ने सॉफ्टवेयर उद्योग के लिए समानताएं खोजने की आवश्यकता का संकेत दिया है, इसलिए हमें उस उद्योग के लिए एक शब्द वेक्टर भी तैयार करना होगा।


इस अभ्यास के लिए चीजों को सरल रखने के लिए, मैंने Python 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 कमांड का उपयोग करके पोस्टग्रेज डेटाबेस में एक 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 का उपयोग करते हुए, मैंने निम्नलिखित मावेन निर्भरता के साथ IntelliJ IDEA में 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 इंटरफ़ेस का उपयोग करके, मैंने पोस्टग्रेज़ तालिकाओं तक आसान पहुंच की अनुमति देने के लिए निम्नलिखित एक्सटेंशन जोड़े:


 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;


वहां से, मैंने जेपीए रिपॉजिटरी के साथ इंटरैक्ट करने के लिए 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 क्लास को एक रेस्टफुल एंट्री पॉइंट प्रदान किया और 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


सुरक्षित रहने के लिए, मैंने यह निर्दिष्ट करने के लिए system.properties फ़ाइल जोड़ी कि जावा और मावेन के कौन से संस्करण अपेक्षित हैं:


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


हेरोकू सीएलआई का उपयोग करते हुए, मैंने हेरोकू प्लेटफॉर्म पर similarity-search-sfdc सेवा के लिए अपने गिटलैब रिपॉजिटरी में एक रिमोट जोड़ा:


 heroku git:remote -a similarity-search-sfdc


मैंने निम्नलिखित कमांड के माध्यम से similarity-search-sfdc सेवा के लिए बिल्डपैक प्रकार भी सेट किया है:


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


अंत में, मैंने निम्नलिखित कमांड का उपयोग करके हेरोकू में similarity-search-sfdc सेवा तैनात की:


 git push heroku


अब, similarity-search-sfdc ऐप के लिए संसाधन टैब नीचे दिखाए अनुसार दिखाई दिया:


कार्रवाई में समानता की खोज

रेस्टफुल एपीआई चलने के साथ, मैंने शीर्ष तीन सेल्सफोर्स उद्योगों (और संबंधित खातों) का पता लगाने के लिए निम्नलिखित कर्ल कमांड जारी किया जो सॉफ्टवेयर उद्योग के सबसे करीब हैं:


 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 की एक घटना का स्क्रीनशॉट है जो बहुत मजेदार था:


जो लोग मेरे जीवन के इस पहलू से परिचित हैं वे आपको बता सकते हैं कि खिलाड़ी वर्ग के लिए मेरी डिफ़ॉल्ट पसंद सैनिक था। ऐसा इसलिए है क्योंकि सैनिक के पास स्वास्थ्य, चाल, गति और मारक क्षमता का सबसे अच्छा संतुलन होता है।


मुझे ऐसा लगता है कि सॉफ्टवेयर इंजीनियर वास्तविक दुनिया के "सैनिक वर्ग" हैं क्योंकि हम किसी भी स्थिति के अनुकूल हो सकते हैं और ऐसे समाधान प्रदान करने पर ध्यान केंद्रित कर सकते हैं जो कुशल तरीके से अपेक्षाओं को पूरा करते हों।


अब कुछ वर्षों से, मैं निम्नलिखित मिशन वक्तव्य पर ध्यान केंद्रित कर रहा हूं, जो मुझे लगता है कि किसी भी आईटी पेशेवर पर लागू हो सकता है:


“अपना समय उन सुविधाओं/कार्यक्षमताओं को प्रदान करने पर केंद्रित करें जो आपकी बौद्धिक संपदा के मूल्य को बढ़ाती हैं। बाकी सभी चीजों के लिए रूपरेखाओं, उत्पादों और सेवाओं का लाभ उठाएं।''

- जे. वेस्टर


इस पोस्ट के उदाहरण में, हम पोस्टग्रेज़ डेटाबेस के साथ एंटरप्राइज़ डेटा को सिंक्रनाइज़ करने के लिए हेरोकू कनेक्ट का लाभ उठाने में सक्षम थे। पीजीवेक्टर एक्सटेंशन स्थापित करने के बाद, हमने उन सेल्सफोर्स खातों से प्रत्येक अद्वितीय उद्योग के लिए वर्ड वैक्टर बनाए। अंत में, हमने एक स्प्रिंग बूट सेवा शुरू की, जिसने सेल्सफोर्स खातों का पता लगाने की प्रक्रिया को सरल बना दिया, जिनका उद्योग किसी अन्य उद्योग के सबसे करीब था।


हमने मौजूदा ओपन-सोर्स प्रौद्योगिकियों, एक छोटी स्प्रिंग बूट सेवा और हेरोकू पास के साथ इस उपयोग के मामले को जल्दी से हल किया - पूरी तरह से मेरे मिशन कथन का पालन करते हुए। मैं कल्पना नहीं कर सकता कि इन ढाँचों, उत्पादों और सेवाओं के बिना कितना समय लगेगा।


यदि आप रुचि रखते हैं, तो आप GitLab पर इस लेख का मूल स्रोत कोड पा सकते हैं:


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


आपका दिन सचमुच बहुत अच्छा हो!