paint-brush
কার্যকরী এবং মাপযোগ্য সফ্টওয়্যার বিকাশের জন্য কীভাবে এলএলএম ব্যবহার করবেনদ্বারা@bishalbaral
527 পড়া
527 পড়া

কার্যকরী এবং মাপযোগ্য সফ্টওয়্যার বিকাশের জন্য কীভাবে এলএলএম ব্যবহার করবেন

দ্বারা Bishal11m2024/08/04
Read on Terminal Reader

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

YCombinator CEO গ্যারি ট্যান ক্লড 3.5 সনেটের সাথে কোড লেখার বিষয়ে YCombinator Reddit সম্প্রদায়ের সদস্যের একটি পোস্ট টুইট করেছেন। পোস্টটি তাদের প্রতিদিনের এলএলএম ব্যবহারের একটি গুরুত্বপূর্ণ অংশ হিসাবে স্থাপত্য এবং অবকাঠামোগত সিদ্ধান্ত নেওয়ার গুরুত্ব তুলে ধরে।
featured image - কার্যকরী এবং মাপযোগ্য সফ্টওয়্যার বিকাশের জন্য কীভাবে এলএলএম ব্যবহার করবেন
Bishal HackerNoon profile picture
0-item
1-item

সম্প্রতি, এক্স এবং রেডডিটের ব্যবহারকারীরা রিপোর্ট করেছেন যে ক্লড 3.5 সনেটের সাথে কোড লেখা তাদের "খুব শক্তিশালী" অনুভব করেছে। এমনই একটি পোস্ট যা বিশেষভাবে মনোযোগ আকর্ষণ করেছিল তা হল YCombinator CEO, গ্যারি ট্যানের একটি টুইট।


গ্যারি তাদের YCombinator Reddit সম্প্রদায়ের একজন সদস্যের নিম্নলিখিত পোস্টটি শেয়ার করেছেন যে জনপ্রিয় বৈশিষ্ট্যগুলি বাস্তবায়নের সময় ক্লাউড 3.5 সনেট ব্যবহার করে কীভাবে তাদের উত্পাদনশীলতা 10-গুণ বাড়িয়েছে।


পোস্টটি তাদের প্রতিদিনের এলএলএম ব্যবহারের একটি গুরুত্বপূর্ণ অংশ হিসাবে স্থাপত্য এবং অবকাঠামোগত সিদ্ধান্ত নেওয়ার গুরুত্বকেও তুলে ধরে।


যদিও Claude 3.5 এর মতো LLMগুলি অসামান্য সুবিধা দেয়, তবুও তাদের স্মৃতি এবং প্রসঙ্গ বজায় রাখার বিষয়ে সীমাবদ্ধতা রয়েছে। এই সীমাবদ্ধতাগুলি মোকাবেলা করার জন্য বেশ কয়েকটি উন্নয়ন কৌশল ব্যবহার করা যেতে পারে। এই কৌশলগুলি সফ্টওয়্যার ডেভেলপমেন্ট ফাউন্ডেশনগুলির চারপাশে ঘোরাফেরা করে যা সমস্ত বিকাশকারীরা অভিজ্ঞতার সাথে পূর্ণ করে কিন্তু সাধারণ ইংরেজিতে এলএলএম প্রম্পট করার সময় প্রায়শই মিস করা সহজ হয়।


ডেভেলপাররা প্রতিদিন ব্যবহার করে একই মৌলিক নীতিগুলি প্রয়োগ করে, যা Reddit লেখক স্থাপত্য সিদ্ধান্ত হিসাবে উল্লেখ করেছেন, LLM মিথস্ক্রিয়াগুলির ফলে অত্যন্ত মডুলার, স্কেলযোগ্য এবং ভাল-ডকুমেন্টেড কোড হতে পারে।


নিম্নলিখিত কিছু মূল কোডিং নীতি এবং বিকাশের অনুশীলন যা এলএলএম-সহায়তা সফ্টওয়্যার বিকাশে প্রয়োগ করা যেতে পারে, পাইথনের ব্যবহারিক উদাহরণ সহ:

উদাহরণের সমস্ত প্রম্পট Claude Sonnet 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]")

সামঞ্জস্যপূর্ণ নামকরণের নিয়মাবলী

LLM-তে কোড স্ট্রাকচার বর্ণনা করা সহজ করতে এবং তাদের পরামর্শগুলি বুঝতে, পরিষ্কার এবং সামঞ্জস্যপূর্ণ নামকরণের নিয়মগুলি ব্যবহার করুন।

 # 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 ব্যবহার করে ভবিষ্যতে প্রম্পটগুলিকে গাইড করতে পারে।


শীঘ্র:

 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

গবেষণা বা পরীক্ষা চালিত উন্নতি

এলএলএমগুলিকে বাস্তবায়নে সহায়তা করতে এবং বিশেষত এজ কেসগুলি পরিচালনা করতে, প্রকৃত ফাংশনটি বাস্তবায়নের আগে নিজে পরীক্ষা লিখুন বা এলএলএম ব্যবহার করুন। এলএলএমগুলি অভ্যন্তরীণভাবে কোড চালায় না তবে জেনারেট করা কোডটি ফাংশনের প্রয়োজনীয়তা পূরণ করে তা নিশ্চিত করার জন্য আগে থেকেই পরীক্ষা করা এলএলএম-জেনারেটেড কোডে বাগ ধরতে কার্যকর হতে পারে।


পরীক্ষা ক্ষেত্রে:

 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

কোড পর্যালোচনা চেকলিস্ট

গুণমান এবং ধারাবাহিকতা নিশ্চিত করতে, এলএলএম-জেনারেটেড কোড পর্যালোচনা করার জন্য একটি চেকলিস্ট তৈরি করুন।

 # 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

মডুলার প্রম্পটিং

LLM একটি সংজ্ঞায়িত কাঠামোর সাথে সবচেয়ে ভাল কাজ করে, তাই কোডিং কাজগুলিকে ছোট প্রম্পটে ভাঙার জন্য একটি কৌশল তৈরি করুন। একটি সংগঠিত পদ্ধতি অনুসরণ করা LLM-কে একাধিকবার জেনারেট করা কোড পুনরায় সংশোধন করার অনুরোধ না করেই কার্যকারী কোড তৈরি করতে সহায়তা করে।


শীঘ্র:

 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-এর উন্নতি অব্যাহত থাকায়, মৌলিক বিষয়গুলো থেকে সেরাটা পাওয়ার জন্য আরও গুরুত্বপূর্ণ হয়ে উঠবে।


সফ্টওয়্যার বিকাশের নীতিগুলির গভীরে ডুব দেওয়ার জন্য, এই ক্লাসিক পাঠ্যপুস্তকটি দেখুন: ক্লিন আর্কিটেকচার: রবার্ট সি. মার্টিনের সফ্টওয়্যার কাঠামো এবং নকশার জন্য একটি কারিগরের গাইড৷


আপনি যদি এই নিবন্ধটি উপভোগ করেন, তাহলে পরবর্তী নিবন্ধটির জন্য আমাদের সাথে থাকুন যেখানে আমরা LLM-সহায়ক উন্নয়নের জন্য একটি বিশদ কর্মপ্রবাহে ডুব দিয়েছি। মন্তব্যে গুরুত্বপূর্ণ মনে হয় অন্য কোন ধারণা শেয়ার করুন! ধন্যবাদ।