हाल ही में, एक्स और रेडिट पर उपयोगकर्ताओं ने बताया कि क्लाउड 3.5 सॉनेट के साथ कोड लिखने से उन्हें "बहुत शक्तिशाली" महसूस हुआ है। ऐसी ही एक पोस्ट जिसने विशेष रूप से ध्यान आकर्षित किया, वह वाईकॉम्बिनेटर के सीईओ गैरी टैन का एक ट्वीट था।
गैरी ने अपने YCombinator Reddit समुदाय के एक सदस्य द्वारा लिखी गई निम्नलिखित पोस्ट को साझा किया, जिसमें बताया गया था कि किस प्रकार क्लाउड 3.5 सॉनेट के उपयोग से लोकप्रिय सुविधाओं को लागू करते हुए उनकी उत्पादकता में 10 गुना वृद्धि हुई।
पोस्ट में एलएलएम के दैनिक उपयोग के महत्वपूर्ण भाग के रूप में ठोस वास्तुशिल्प और अवसंरचनात्मक निर्णय लेने के महत्व पर भी प्रकाश डाला गया।
हालाँकि क्लाउड 3.5 जैसे LLM बेहतरीन लाभ प्रदान करते हैं, फिर भी उनमें मेमोरी और संदर्भ बनाए रखने के मामले में सीमाएँ हैं। इन सीमाओं को संबोधित करने के लिए कई विकास रणनीतियों का उपयोग किया जा सकता है। ये रणनीतियाँ सॉफ़्टवेयर विकास की नींव के इर्द-गिर्द घूमती हैं, जिन्हें सभी डेवलपर्स अनुभव के साथ निखारते हैं, लेकिन अक्सर LLM को सादे अंग्रेजी में बताते समय आसानी से नज़रअंदाज़ कर दिया जाता है।
डेवलपर्स द्वारा दैनिक रूप से उपयोग किए जाने वाले उन्हीं मूल सिद्धांतों को लागू करने से, जिसे रेडिट लेखक आर्किटेक्चरल निर्णय के रूप में संदर्भित करता है, एलएलएम इंटरैक्शन के परिणामस्वरूप अत्यधिक मॉड्यूलर, स्केलेबल और अच्छी तरह से प्रलेखित कोड हो सकता है।
निम्नलिखित कुछ प्रमुख कोडिंग सिद्धांत और विकास अभ्यास हैं जिन्हें LLM-सहायता प्राप्त सॉफ्टवेयर विकास में लागू किया जा सकता है, साथ ही पायथन में व्यावहारिक उदाहरण भी दिए गए हैं:
उदाहरणों में सभी संकेत क्लाउड सॉनेट 3.5 के साथ उपयोग किए गए थे।
LLM को प्रत्येक तार्किक घटक का वर्णन करना आसान बनाने और सटीक घटक प्राप्त करने के लिए, कोडबेस को छोटे, अच्छी तरह से परिभाषित घटकों में विभाजित करें।
# database.py class Database: def __init__(self, sql_connection_string): .... def query(self, sql): .... # user_service.py class UserService: def __init__(self, database): self.db = database def get_user(self, user_id): return self.db.query(f"SELECT * FROM users WHERE id = {user_id}") # main.py db = Database("sql_connection_string") user_service = UserService(db) user = user_service.get_user(123)
जटिल कार्यान्वयनों को छिपाने के लिए, अमूर्तन परतों का उपयोग करें और प्रत्येक घटक के विवरण का उपयोग करते हुए उच्च-स्तरीय अमूर्तन पर ध्यान केंद्रित करें।
# top-level abstraction class BankingSystem: def __init__(self): self._account_manager = AccountManager() self._transaction_processor = TransactionProcessor() def create_account(self, acct_number: str, owner: str) -> None: self._account_manager.create_account(acct_number, owner) def process_transaction(self, acct_number: str, transaction_type: str, amount: float) -> None: account = self._account_manager.get_account(acct_number) self._transaction_processor.process(account, transaction_type, amount) # mid-level abstractions class AccountManager: def __init__(self): def create_account(self, acct_number: str, owner: str) -> None: def get_account(self, acct_number: str) -> 'Account': class TransactionProcessor: def process(self, account: 'Account', transaction_type: str, amount: float) -> None: # lower-level abstractions class Account(ABC): .... class Transaction(ABC): .... # concrete implementations class SavingsAccount(Account): .... class CheckingAccount(Account): .... class DepositTransaction(Transaction): .... class WithdrawalTransaction(Transaction): .... # lowest-level abstraction class TransactionLog: .... # usage focuses on the high-level abstraction cart = ShoppingCart() cart.add_item(Item("Book", 15)) cart.add_item(Item("Pen", 2)) total = cart.get_total()
एलएलएम से सहायता मांगते समय कार्यों को अधिक प्रबंधनीय बनाने के लिए, प्रत्येक घटक के लिए स्पष्ट इंटरफेस परिभाषित करें और उन सभी को अलग-अलग कार्यान्वित करने पर ध्यान केंद्रित करें।
class PaymentProcessor(ABC): @abstractmethod def process_payment(self, amount: float, card_no: str) -> bool: .... class StripeProcessor(PaymentProcessor): # stripe specific implementation def process_payment(self, amount: float, card_no: str) -> bool: .... class PayPalProcessor(PaymentProcessor): # paypal specific implementation def process_payment(self, amount: float, card_no: str) -> bool: ....
भ्रम को रोकने और दायरे को सीमित करने के लिए, एक समय में एक छोटे से हिस्से पर ध्यान केंद्रित करें और सुनिश्चित करें कि प्रत्येक वर्ग/फ़ंक्शन की एक एकल, अच्छी तरह से परिभाषित जिम्मेदारी हो। उत्पन्न किए जा रहे कोड पर अधिक नियंत्रण रखने के लिए क्रमिक रूप से विकास करें।
class UserManager: # user creation logic def create_user(self, username, email): ... class EmailService: # send welcome email logic def send_welcome_email(self, email): .... class NotificationService: # send sms notification def send_sms(self, username, email): ... # Usage user_manager = UserManager() email_svc = EmailService() user = user_manager.create_user("hacker", "[email protected]") email_svc.send_welcome_email("[email protected]")
एलएलएम को कोड संरचना का वर्णन सरल बनाने और उनके सुझावों को समझने के लिए, स्पष्ट और सुसंगत नामकरण नियमों का उपयोग करें।
# classes: PascalCase class UserAccount: pass # functions and variables: snake_case def calculate_total_price(item_price, quantity): total_cost = item_price * quantity return total_cost # constants: UPPERCASE_WITH_UNDERSCORES MAX_LOGIN_ATTEMPTS = 3 # private methods/variables: prefix with underscore class DatabaseConnection: def __init__(self): self._connection = None def _connect_to_database(self): pass
आवश्यकताओं के आधार पर विशिष्ट कार्यान्वयन उत्पन्न करने के लिए, सामान्य कोड संरचनाओं के लिए कंकाल कोड बनाएं, और उन्हें स्टार्टर कोड के रूप में उपयोग करें।
# Todo item - pydantic Model class TodoItem(BaseModel): id: Optional[int] = None title: str description: Optional[str] = None completed: bool = False todo_db = [<insert mock data>] @app.get("/todos", response_model=List[TodoItem]) async def get_todos(): # TODO: retrieve all todos @app.get("/todos/{todo_id}", response_model=TodoItem) async def get_todo(todo_id: int): # TODO: retrieve specific todo @app.post("/todos", response_model=TodoItem) async def create_todo(todo: TodoItem): # TODO: create todo @app.put("/todos/{todo_id}", response_model=TodoItem) async def update_todo(todo_id: int, todo: TodoItem): # TODO: update todo @app.delete("/todos/{todo_id}") async def delete_todo(todo_id: int): # TODO: delete todo
LLM को निर्देशित करने में मदद के लिए, कार्यान्वयन से पहले प्रत्येक घटक के लिए संक्षिप्त दस्तावेज़ लिखें। इसके अलावा, डॉकस्ट्रिंग तैयार करें जो भविष्य में LLM का उपयोग करके प्रॉम्प्ट को निर्देशित कर सकें।
तत्पर:
Use a Documentation Driven Development approach to write clear, concise docstrings for the following python function calculate_discount(price, discount_percentage) takes in - price (float), original price of the item. - discount_percentage (float), discount percentage range(0-100). returns - price after discount (float) raises - ValueError, when discount_percentage is out of range example - calculate_discount(100, 10) -> 10.0
प्रतिक्रिया:
def calculate_discount(price: float, discount_percent: float) -> float: """ Calculate the discounted price of an item. Args: price (float): original price for the item. discount_percentage (float): discount percentage range(0-100). Returns: float: The price after applying the discount. Raises: ValueError: If discount_percentage is not between 0 and 100. Example: >>> calculate_discount(100, 20) 80.0 """ if not 0 <= discount_percent <= 100: raise ValueError("Discount percent must be between 0 and 100") discount_amount = price * (discount_percent / 100) return price - discount_amount
कार्यान्वयन में LLM की मदद करने और विशेष रूप से एज केस को संभालने के लिए, स्वयं परीक्षण लिखें या वास्तविक फ़ंक्शन को लागू करने से पहले ऐसा करने के लिए LLM का उपयोग करें। LLM आंतरिक रूप से कोड नहीं चलाते हैं, लेकिन यह सुनिश्चित करने के लिए पहले से परीक्षण करना कि उत्पन्न कोड फ़ंक्शन आवश्यकताओं को पूरा करता है, LLM-जनरेटेड कोड में बग को पकड़ने में उपयोगी हो सकता है।
परीक्षण मामला:
def is_palindrome(s: str) -> bool: """check if string is palindrome.""" return s == s[::-1] class TestPalindrome(unittest.TestCase): def test_palindrome(self): self.assertTrue(is_palindrome("racecar")) self.assertTrue(is_palindrome("A man a plan a canal Panama")) self.assertFalse(is_palindrome("hello")) self.assertTrue(is_palindrome("")) # Edge case: empty string
तत्पर:
given the test case <insert test>, use Document Driven Development to write a function for TestPalindrome
प्रतिक्रिया:
def is_palindrome(s: str) -> bool: """ Check if a string is a palindrome. A palindrome is a word, phrase, number, or other sequence of characters that reads the same forward and backward, ignoring spaces, punctuation, and capitalization. Args: s (str): The input string to check. Returns: bool: True if the input is a palindrome, False otherwise. Examples: >>> is_palindrome("racecar") True >>> is_palindrome("A man a plan a canal Panama") True >>> is_palindrome("hello") False >>> is_palindrome("") True """ # Remove non-alphanumeric characters and convert to lowercase cleaned = ''.join(char.lower() for char in s if char.isalnum()) # Compare the cleaned string with its reverse return cleaned == cleaned[::-1]
एलएलएम के साथ कई कार्यान्वयन विवरणों पर चर्चा करने के लिए, संदर्भ के लिए सामान्यतः प्रयुक्त डिज़ाइन पैटर्नों की एक लाइब्रेरी बनाए रखें।
# Singleton pattern class DatabaseConnection: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) # initialize database connection return cls._instance # Factory pattern class AnimalFactory: @staticmethod def create_animal(animal_type): if animal_type == "dog": return Dog() elif animal_type == "cat": return Cat() else: raise ValueError("Unknown animal type") # Observer pattern class Subject: def __init__(self): self._observers = [] def attach(self, observer): self._observers.append(observer) def detach(self, observer): self._observers.remove(observer) def notify(self): for observer in self._observers: observer.update() # Adapter pattern class LLMAdapter: def __init__(self, llm_service): self.llm_service = llm_service def generate_code(self, prompt): llm_response = self.llm_service.complete(prompt) return self.extract_code(llm_response) def extract_code(self, response): pass
गुणवत्ता और स्थिरता सुनिश्चित करने के लिए, LLM-जनरेटेड कोड की समीक्षा के लिए एक चेकलिस्ट बनाएं।
# Code Review Checklist ## Functionality - [ ] Code performs the intended task correctly - [ ] Edge cases are handled appropriately ## Code Quality - [ ] Code follows project's style guide - [ ] Variable and function names are descriptive and consistent - [ ] No unnecessary comments or dead code ## Performance - [ ] Code is optimized for efficiency - [ ] No potential performance bottlenecks ## Security - [ ] Input validation is implemented - [ ] Sensitive data is handled securely ## Testing - [ ] Unit tests are included and pass - [ ] Edge cases are covered in tests ## Documentation - [ ] Functions and classes are properly documented - [ ] Complex logic is explained in comments
एलएलएम एक परिभाषित संरचना के साथ सबसे अच्छा काम करते हैं, इसलिए कोडिंग कार्यों को छोटे संकेतों में तोड़ने के लिए एक रणनीति विकसित करें। एक संगठित दृष्टिकोण का पालन करने से एलएलएम को कई बार उत्पन्न कोड को फिर से सही करने के लिए संकेत दिए बिना काम करने वाला कोड बनाने में मदद मिलती है।
तत्पर:
I need to implement a function to calculate the Fibonacci number sequence using a Document Driven Development approach. 1. Purpose: function that generates the Fibonacci sequence up to a given number of terms. 2. Interface: def fibonacci_seq(n: int) -> List[int]: """ generate Fibonacci sequence up to n terms. Args: n (int): number of terms in the sequence Returns: List[int]: fibonacci sequence """ 3. Key Functionalities: - handle input validation (n should always be a positive integer) - generate the sequence starting with 0 and 1 - each subsequent number is the sum of two preceding ones - return the sequence as a list 4. Implementation Details: - use a loop to generate the sequence - store the sequence in a list - optimize for memory by only keeping the last two numbers in memory if needed 5. Test Cases: - fibonacci_seq(0) should return [] - fibonacci_seq(1) should return [0] - fibonacci_seq(5) should return [0, 1, 1, 2, 3]
जबकि उपरोक्त सभी उदाहरण सीधे लग सकते हैं, मॉड्यूलर आर्किटेक्चर और प्रभावी प्रॉम्प्ट इंजीनियरिंग जैसी मूलभूत प्रथाओं का पालन करना और एलएलएम-सहायता प्राप्त विकास में एक ठोस संरचित दृष्टिकोण अपनाना, बड़े पैमाने पर एक बड़ा अंतर लाता है। इन प्रथाओं को लागू करके, अधिक डेवलपर्स एलएलएम का उपयोग करने के लाभों को अधिकतम कर सकते हैं, जिसके परिणामस्वरूप उत्पादकता और कोड की गुणवत्ता में वृद्धि होती है।
एलएलएम शक्तिशाली उपकरण हैं जो सॉफ्टवेयर इंजीनियरिंग सिद्धांतों द्वारा निर्देशित होने पर सबसे अच्छा काम करते हैं जिन्हें अनदेखा करना आसान है। उन्हें आंतरिक बनाना सुंदर ढंग से तैयार किए गए कोड और बेतरतीब ढंग से उत्पन्न के बीच का अंतर हो सकता है।
इस लेख का लक्ष्य डेवलपर्स को प्रोत्साहित करना है कि वे भविष्य में उच्च गुणवत्ता वाला कोड बनाने और समय बचाने के लिए LLM का उपयोग करते समय इन प्रथाओं को हमेशा ध्यान में रखें। जैसे-जैसे LLM में सुधार होता रहेगा, उनसे सर्वश्रेष्ठ प्राप्त करने के लिए बुनियादी बातें और भी महत्वपूर्ण होती जाएँगी।
सॉफ्टवेयर विकास सिद्धांतों को गहराई से समझने के लिए, इस क्लासिक पाठ्यपुस्तक को देखें: क्लीन आर्किटेक्चर: ए क्राफ्ट्समैन्स गाइड टू सॉफ्टवेयर स्ट्रक्चर एंड डिजाइन, लेखक - रॉबर्ट सी. मार्टिन।
अगर आपको यह लेख पसंद आया है, तो अगले लेख के लिए बने रहें, जिसमें हम LLM-सहायता प्राप्त विकास के लिए विस्तृत कार्यप्रवाह पर चर्चा करेंगे। कृपया टिप्पणियों में कोई अन्य अवधारणाएँ साझा करें जो आपको महत्वपूर्ण लगती हैं! धन्यवाद।