{"product_id":"dynamic-prompt-generation-tạo-prompt-tự-dộng-theo-context-va-user-input","title":"Dynamic Prompt Generation — Tạo prompt tự động theo context và user input","description":"\n\u003cp\u003eTrong hầu hết ứng dụng AI production, prompt không phải là chuỗi ký tự cố định. Nó cần thay đổi theo ngữ cảnh người dùng, loại tác vụ, dữ liệu đầu vào, và thậm chí cả thời điểm trong ngày. Dynamic prompt generation là kỹ thuật xây dựng hệ thống tự động tạo prompt phù hợp nhất cho từng tình huống cụ thể, thay vì dùng một prompt duy nhất cho mọi trường hợp.\u003c\/p\u003e\n\n\u003ch2\u003eStatic vs Dynamic Prompts\u003c\/h2\u003e\n\u003cp\u003eTrước khi đi vào kỹ thuật, hãy hiểu rõ sự khác biệt giữa hai cách tiếp cận.\u003c\/p\u003e\n\n\u003ch3\u003eStatic prompt\u003c\/h3\u003e\n\u003cp\u003ePrompt được viết cố định, dùng cho mọi trường hợp:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eSYSTEM_PROMPT = \"\"\"\nBạn là trợ lý viết nội dung.\nViết bài blog SEO-friendly về chủ đề người dùng yêu cầu.\nĐộ dài 800-1000 từ, bao gồm tiêu đề H2 và H3.\n\"\"\"\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eVấn đề: Prompt này áp dụng cho mọi chủ đề, mọi đối tượng, mọi giọng điệu. Bài về công nghệ blockchain sẽ có cùng cấu trúc và phong cách với bài về nấu ăn gia đình. Kết quả là nội dung generic, không có cá tính.\u003c\/p\u003e\n\n\u003ch3\u003eDynamic prompt\u003c\/h3\u003e\n\u003cp\u003ePrompt được xây dựng tự động dựa trên ngữ cảnh:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef build_prompt(topic, audience, tone, word_count, seo_keywords):\n    return f\"\"\"\nBạn là chuyên gia viết nội dung trong lĩnh vực {topic.category}.\n\nViết bài blog về: {topic.title}\nĐối tượng đọc: {audience.description}\nGiọng điệu: {tone}\nĐộ dài: {word_count} từ\n\nTừ khóa SEO cần bao gồm: {', '.join(seo_keywords)}\n\nCấu trúc bài viết:\n{generate_structure(topic.complexity)}\n\nLưu ý đặc biệt cho đối tượng {audience.level}:\n{get_audience_guidelines(audience)}\n\"\"\"\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eVới cách này, prompt cho bài blockchain sẽ khác hoàn toàn prompt cho bài nấu ăn — về chuyên gia được gán vai, cấu trúc bài, giọng điệu, và hướng dẫn đặc thù.\u003c\/p\u003e\n\n\u003ch2\u003eTemplate Engine Approach\u003c\/h2\u003e\n\u003cp\u003eCách phổ biến nhất để tạo dynamic prompt là sử dụng template engine. Bạn định nghĩa template với các biến, sau đó điền giá trị vào runtime.\u003c\/p\u003e\n\n\u003ch3\u003eJinja2-style template\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003efrom jinja2 import Template\n\nPROMPT_TEMPLATE = Template(\"\"\"\nBạn là {{ role }}.\n\n{% if context %}\nNgữ cảnh:\n{{ context }}\n{% endif %}\n\nNhiệm vụ: {{ task_description }}\n\n{% if examples %}\nVí dụ mẫu:\n{% for example in examples %}\nInput: {{ example.input }}\nOutput: {{ example.output }}\n{% endfor %}\n{% endif %}\n\nYêu cầu format:\n- Ngôn ngữ: {{ language }}\n- Độ dài: {{ word_count }} từ\n- Giọng điệu: {{ tone }}\n\n{% if constraints %}\nRàng buộc:\n{% for constraint in constraints %}\n- {{ constraint }}\n{% endfor %}\n{% endif %}\n\"\"\")\n\n# Sử dụng\nprompt = PROMPT_TEMPLATE.render(\n    role=\"chuyên gia phân tích tài chính\",\n    context=\"Báo cáo Q4 2024 của công ty ABC\",\n    task_description=\"Phân tích hiệu suất tài chính và dự báo Q1 2025\",\n    examples=[\n        {\"input\": \"Doanh thu tăng 15%\", \"output\": \"Tín hiệu tích cực...\"},\n    ],\n    language=\"Tiếng Việt\",\n    word_count=500,\n    tone=\"chuyên nghiệp, dựa trên dữ liệu\",\n    constraints=[\n        \"Không đưa ra lời khuyên đầu tư\",\n        \"Trích dẫn số liệu cụ thể từ báo cáo\",\n        \"So sánh với cùng kỳ năm trước\"\n    ]\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eƯu điểm của template approach\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTách biệt logic và nội dung:\u003c\/strong\u003e Template là nội dung, code điền giá trị là logic. Dễ thay đổi một bên mà không ảnh hưởng bên kia.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTái sử dụng:\u003c\/strong\u003e Cùng template có thể phục vụ nhiều use case khác nhau chỉ bằng cách thay đổi giá trị biến.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTestable:\u003c\/strong\u003e Có thể viết unit test cho từng template với các bộ giá trị khác nhau.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eVersion control:\u003c\/strong\u003e Template là file text, dễ dàng track changes trong Git.\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eContext-Aware Prompt Construction\u003c\/h2\u003e\n\u003cp\u003eTemplate engine giải quyết vấn đề cấu trúc, nhưng prompt thực sự thông minh cần hiểu ngữ cảnh để tự điều chỉnh. Đây là kỹ thuật context-aware construction.\u003c\/p\u003e\n\n\u003ch3\u003eThu thập context\u003c\/h3\u003e\n\u003cp\u003eCác nguồn context phổ biến trong ứng dụng production:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eclass PromptContext:\n    def __init__(self, user, request, session):\n        # User context\n        self.user_level = user.expertise_level    # beginner\/intermediate\/expert\n        self.user_language = user.preferred_lang   # vi\/en\n        self.user_history = user.recent_queries    # 10 queries gần nhất\n\n        # Request context\n        self.task_type = request.classify_task()    # analysis\/generation\/translation\n        self.input_length = len(request.content)    # Độ dài input\n        self.input_complexity = request.complexity_score()\n\n        # Session context\n        self.conversation_turn = session.turn_count\n        self.previous_response = session.last_response\n        self.accumulated_context = session.context_window_usage\n\n    def get_appropriate_detail_level(self):\n        \"\"\"Quyết định mức độ chi tiết phù hợp.\"\"\"\n        if self.user_level == \"beginner\":\n            return \"chi tiết, giải thích từng bước, dùng ví dụ đơn giản\"\n        elif self.user_level == \"expert\":\n            return \"ngắn gọn, tập trung vào điểm chính, dùng thuật ngữ chuyên môn\"\n        return \"cân bằng giữa chi tiết và ngắn gọn\"\n\n    def get_response_length(self):\n        \"\"\"Tính toán độ dài response phù hợp.\"\"\"\n        if self.input_length \u0026lt; 50:\n            return \"200-400 từ\"\n        elif self.input_length \u0026lt; 500:\n            return \"400-800 từ\"\n        return \"800-1200 từ\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eXây dựng prompt từ context\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eclass DynamicPromptBuilder:\n    def __init__(self, template_registry):\n        self.templates = template_registry\n\n    def build(self, context):\n        \"\"\"Xây dựng prompt dựa trên context.\"\"\"\n        # Chọn template phù hợp với loại tác vụ\n        template = self.templates.get(context.task_type)\n\n        # Điều chỉnh theo user level\n        detail_level = context.get_appropriate_detail_level()\n        response_length = context.get_response_length()\n\n        # Thêm conversation history nếu multi-turn\n        history_section = \"\"\n        if context.conversation_turn \u0026gt; 1:\n            history_section = f\"\"\"\nĐây là lượt hội thoại thứ {context.conversation_turn}.\nCâu trả lời trước đó:\n{context.previous_response[:500]}\n\nHãy tiếp nối ngữ cảnh cuộc hội thoại.\n\"\"\"\n\n        # Điều chỉnh context window\n        if context.accumulated_context \u0026gt; 0.7:\n            # Đang dùng hơn 70% context window\n            # Cần tóm tắt thay vì giữ nguyên\n            history_section = self._summarize_history(context)\n\n        return template.render(\n            detail_level=detail_level,\n            response_length=response_length,\n            history=history_section,\n            language=context.user_language,\n        )\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eUser Profiling cho Prompt Customization\u003c\/h2\u003e\n\u003cp\u003ePrompt có thể được cá nhân hóa dựa trên hồ sơ người dùng. Đây là cấp độ nâng cao của dynamic prompting, nơi hệ thống \"học\" cách giao tiếp tốt nhất với từng người dùng.\u003c\/p\u003e\n\n\u003ch3\u003eXây dựng user profile\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eclass UserProfile:\n    def __init__(self, user_id):\n        self.user_id = user_id\n        self.preferences = self._load_preferences()\n\n    def _load_preferences(self):\n        \"\"\"Load preferences từ database hoặc phân tích lịch sử.\"\"\"\n        return {\n            \"response_style\": \"concise\",     # concise \/ detailed \/ balanced\n            \"technical_level\": \"intermediate\",\n            \"preferred_format\": \"bullet_points\",  # prose \/ bullet_points \/ table\n            \"domain_expertise\": [\"python\", \"data-science\"],\n            \"language_mix\": 0.3,  # 0 = thuần Việt, 1 = thuần Anh, 0.3 = chủ yếu Việt kèm thuật ngữ Anh\n        }\n\n    def get_style_instructions(self):\n        \"\"\"Tạo chỉ dẫn phong cách dựa trên preferences.\"\"\"\n        instructions = []\n\n        if self.preferences[\"response_style\"] == \"concise\":\n            instructions.append(\"Trả lời ngắn gọn, đi thẳng vào vấn đề\")\n        elif self.preferences[\"response_style\"] == \"detailed\":\n            instructions.append(\"Giải thích chi tiết từng bước\")\n\n        if self.preferences[\"preferred_format\"] == \"bullet_points\":\n            instructions.append(\"Ưu tiên dùng bullet points thay vì đoạn văn dài\")\n        elif self.preferences[\"preferred_format\"] == \"table\":\n            instructions.append(\"Dùng bảng khi so sánh hoặc liệt kê\")\n\n        if self.preferences[\"language_mix\"] \u0026gt; 0:\n            instructions.append(\n                \"Có thể dùng thuật ngữ tiếng Anh cho các khái niệm kỹ thuật\"\n            )\n\n        return \"\n\".join(f\"- {i}\" for i in instructions)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eTích hợp vào prompt builder\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003edef build_personalized_prompt(task, user_profile, context):\n    style = user_profile.get_style_instructions()\n    expertise = user_profile.preferences[\"domain_expertise\"]\n\n    return f\"\"\"\nBạn đang hỗ trợ một người dùng có chuyên môn về: {', '.join(expertise)}.\n\nPhong cách giao tiếp:\n{style}\n\nNhiệm vụ: {task.description}\n\nNgữ cảnh: {context.summary}\n\n{task.specific_instructions}\n\"\"\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eA\/B Testing Prompt Variants trong Production\u003c\/h2\u003e\n\u003cp\u003eKhi hệ thống đã chạy, bạn cần cơ chế A\/B test để liên tục cải thiện prompt. Đây không phải A\/B test thủ công như trong phát triển, mà là hệ thống tự động phân bổ traffic và đo lường kết quả.\u003c\/p\u003e\n\n\u003ch3\u003ePrompt Experiment Framework\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport random\nimport hashlib\n\nclass PromptExperiment:\n    def __init__(self, experiment_id, variants, traffic_split):\n        self.experiment_id = experiment_id\n        self.variants = variants          # {\"control\": prompt_a, \"variant_1\": prompt_b}\n        self.traffic_split = traffic_split  # {\"control\": 0.5, \"variant_1\": 0.5}\n\n    def assign_variant(self, user_id):\n        \"\"\"Gán variant nhất quán cho mỗi user.\"\"\"\n        hash_input = f\"{self.experiment_id}:{user_id}\"\n        hash_value = int(hashlib.md5(hash_input.encode()).hexdigest(), 16)\n        ratio = (hash_value % 1000) \/ 1000\n\n        cumulative = 0\n        for variant_name, split in self.traffic_split.items():\n            cumulative += split\n            if ratio \u0026lt; cumulative:\n                return variant_name\n        return list(self.variants.keys())[-1]\n\n    def get_prompt(self, user_id):\n        \"\"\"Lấy prompt cho user dựa trên variant assignment.\"\"\"\n        variant = self.assign_variant(user_id)\n        return self.variants[variant], variant\n\n    def log_result(self, user_id, variant, metrics):\n        \"\"\"Ghi lại kết quả để phân tích sau.\"\"\"\n        record = {\n            \"experiment_id\": self.experiment_id,\n            \"user_id\": user_id,\n            \"variant\": variant,\n            \"metrics\": metrics,  # {\"satisfaction\": 4, \"task_completed\": True}\n        }\n        # Lưu vào database hoặc analytics service\n        save_experiment_result(record)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eMetrics để đo lường\u003c\/h3\u003e\n\u003cp\u003eĐo lường hiệu quả prompt trong production cần các metric khách quan:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTask completion rate:\u003c\/strong\u003e Tỷ lệ người dùng hoàn thành tác vụ sau khi nhận response\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFollow-up rate:\u003c\/strong\u003e Tỷ lệ người dùng cần hỏi thêm. Thấp hơn thường tốt hơn.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eUser satisfaction:\u003c\/strong\u003e Rating hoặc feedback từ người dùng\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eResponse quality score:\u003c\/strong\u003e Đánh giá tự động bằng model khác hoặc rubric\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eLatency impact:\u003c\/strong\u003e Prompt dài hơn có tăng latency đáng kể không\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003ePrompt Registry Pattern\u003c\/h2\u003e\n\u003cp\u003eTrong production, prompt không nên nằm rải rác trong code. Prompt Registry là pattern tập trung quản lý tất cả prompt ở một nơi, giống như config management.\u003c\/p\u003e\n\n\u003ch3\u003eKiến trúc Prompt Registry\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eclass PromptRegistry:\n    def __init__(self, storage_backend):\n        self.storage = storage_backend  # Database, file system, hoặc remote config\n        self.cache = {}\n        self.experiments = {}\n\n    def register(self, prompt_id, template, metadata):\n        \"\"\"Đăng ký prompt mới.\"\"\"\n        self.storage.save({\n            \"id\": prompt_id,\n            \"template\": template,\n            \"version\": metadata.get(\"version\", \"1.0.0\"),\n            \"author\": metadata.get(\"author\"),\n            \"created_at\": datetime.now().isoformat(),\n            \"tags\": metadata.get(\"tags\", []),\n            \"test_results\": metadata.get(\"test_results\"),\n        })\n\n    def get(self, prompt_id, context=None, user_id=None):\n        \"\"\"Lấy prompt, có tính đến experiment và context.\"\"\"\n        # Kiểm tra xem prompt có đang trong experiment không\n        if prompt_id in self.experiments:\n            experiment = self.experiments[prompt_id]\n            template, variant = experiment.get_prompt(user_id)\n        else:\n            template = self._get_template(prompt_id)\n            variant = \"default\"\n\n        # Render template với context\n        if context:\n            return template.render(**context), variant\n        return template, variant\n\n    def rollback(self, prompt_id, target_version):\n        \"\"\"Rollback prompt về phiên bản cũ.\"\"\"\n        old_version = self.storage.get_version(prompt_id, target_version)\n        self.storage.set_active(prompt_id, old_version)\n        self.cache.pop(prompt_id, None)\n\n    def list_prompts(self, tag=None):\n        \"\"\"Liệt kê tất cả prompt, có thể lọc theo tag.\"\"\"\n        return self.storage.list(tag_filter=tag)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eSử dụng Prompt Registry trong ứng dụng\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Khởi tạo registry\nregistry = PromptRegistry(storage_backend=PostgresStorage())\n\n# Đăng ký prompt\nregistry.register(\n    prompt_id=\"customer-support-v2\",\n    template=support_template,\n    metadata={\n        \"version\": \"2.1.0\",\n        \"author\": \"prompt-team\",\n        \"tags\": [\"customer-support\", \"production\"],\n        \"test_results\": {\"accuracy\": 0.94, \"red_team_score\": 0.97}\n    }\n)\n\n# Sử dụng trong API handler\nasync def handle_customer_query(request):\n    context = build_context(request)\n    prompt, variant = registry.get(\n        \"customer-support-v2\",\n        context=context.__dict__,\n        user_id=request.user_id\n    )\n\n    response = await claude_client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        system=prompt,\n        messages=[{\"role\": \"user\", \"content\": request.message}]\n    )\n\n    # Log experiment metrics\n    registry.experiments.get(\"customer-support-v2\", {}).log_result(\n        user_id=request.user_id,\n        variant=variant,\n        metrics={\"response_time\": response.usage.output_tokens}\n    )\n\n    return response\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eChiến lược quản lý prompt trong team\u003c\/h2\u003e\n\u003cp\u003eKhi team có nhiều người cùng làm việc với prompt, cần quy trình rõ ràng:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePrompt review process:\u003c\/strong\u003e Giống code review, mỗi thay đổi prompt cần ít nhất một người review trước khi merge\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eStaging environment:\u003c\/strong\u003e Test prompt mới trong staging trước khi deploy lên production\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eGradual rollout:\u003c\/strong\u003e Deploy prompt mới cho 5% traffic trước, đo lường, rồi mới tăng dần\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eRollback plan:\u003c\/strong\u003e Luôn có khả năng rollback về phiên bản trước trong vòng vài phút\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eDocumentation:\u003c\/strong\u003e Mỗi prompt cần có doc mô tả mục đích, ràng buộc, và lý do thiết kế\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eXử lý edge cases trong dynamic prompting\u003c\/h2\u003e\n\u003cp\u003eDynamic prompt có thể gặp vấn đề khi các biến đầu vào bất thường:\u003c\/p\u003e\n\n\u003ch3\u003eContext quá dài\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003edef truncate_context(context, max_tokens=2000):\n    \"\"\"Cắt ngắn context khi vượt quá giới hạn.\"\"\"\n    estimated_tokens = len(context.split()) * 1.3\n    if estimated_tokens \u0026gt; max_tokens:\n        # Giữ phần đầu và phần cuối, bỏ phần giữa\n        words = context.split()\n        keep_count = int(max_tokens \/ 1.3)\n        half = keep_count \/\/ 2\n        truncated = ' '.join(words[:half]) +                     '\n[... nội dung đã được tóm tắt ...]\n' +                     ' '.join(words[-half:])\n        return truncated\n    return context\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBiến bị thiếu hoặc rỗng\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003edef safe_render(template, variables):\n    \"\"\"Render template với fallback cho biến thiếu.\"\"\"\n    defaults = {\n        \"role\": \"trợ lý AI thông minh\",\n        \"tone\": \"chuyên nghiệp và thân thiện\",\n        \"language\": \"Tiếng Việt\",\n        \"word_count\": \"phù hợp với nội dung\",\n    }\n    # Merge defaults với variables, ưu tiên variables\n    merged = {**defaults, **{k: v for k, v in variables.items() if v}}\n    return template.render(**merged)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePrompt tham khảo cho thiết kế hệ thống\u003c\/h2\u003e\n\u003cpre\u003e\u003ccode\u003eTôi đang xây dựng hệ thống dynamic prompt cho ứng dụng sau:\n- Loại ứng dụng: [Mô tả]\n- Số lượng prompt templates: [Số lượng]\n- Traffic dự kiến: [Requests\/ngày]\n- Team size: [Số người]\n\nHãy thiết kế:\n1. Kiến trúc prompt registry phù hợp\n2. Chiến lược A\/B testing\n3. Quy trình review và deploy prompt\n4. Monitoring và alerting cho prompt quality\n5. Rollback procedure\n\nƯu tiên đơn giản và pragmatic hơn là phức tạp.\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMonitoring và Debugging Dynamic Prompts\u003c\/h2\u003e\n\u003cp\u003eKhi prompt được tạo động, debugging trở nên khó hơn vì bạn không thể nhìn thấy prompt cuối cùng chỉ bằng cách đọc code. Cần có hệ thống logging và monitoring chuyên biệt.\u003c\/p\u003e\n\n\u003ch3\u003ePrompt Logging\u003c\/h3\u003e\n\u003cp\u003eGhi lại prompt cuối cùng được gửi đến model, kèm metadata về context đã dùng để tạo prompt:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport logging\nimport hashlib\n\nprompt_logger = logging.getLogger(\"prompt_system\")\n\ndef log_prompt_execution(prompt_id, rendered_prompt, context, response, metrics):\n    \"\"\"Ghi log đầy đủ cho mỗi lần thực thi prompt.\"\"\"\n    log_entry = {\n        \"prompt_id\": prompt_id,\n        \"prompt_hash\": hashlib.sha256(rendered_prompt.encode()).hexdigest()[:12],\n        \"prompt_length\": len(rendered_prompt),\n        \"context_keys\": list(context.keys()),\n        \"user_level\": context.get(\"user_level\"),\n        \"task_type\": context.get(\"task_type\"),\n        \"response_tokens\": metrics.get(\"output_tokens\"),\n        \"latency_ms\": metrics.get(\"latency_ms\"),\n        \"variant\": metrics.get(\"variant\", \"default\"),\n    }\n    prompt_logger.info(\"prompt_executed\", extra=log_entry)\n\n    # Lưu prompt đầy đủ để debug (chỉ trong development)\n    if settings.DEBUG:\n        prompt_logger.debug(\n            \"full_prompt\",\n            extra={\"prompt_text\": rendered_prompt[:2000]}\n        )\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003ePrompt Quality Monitoring\u003c\/h3\u003e\n\u003cp\u003eTheo dõi chất lượng prompt qua các metrics tổng hợp theo thời gian:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePrompt length distribution:\u003c\/strong\u003e Prompt ngắn quá hoặc dài quá đều có thể là vấn đề. Theo dõi phân phối độ dài theo prompt_id.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTemplate usage frequency:\u003c\/strong\u003e Template nào được dùng nhiều nhất? Template nào không bao giờ được dùng (có thể xóa)?\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eError rate by template:\u003c\/strong\u003e Template nào có tỷ lệ lỗi cao? Có thể template đó cần được cải thiện.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eA\/B test convergence:\u003c\/strong\u003e Experiment nào đã có đủ data để kết luận? Experiment nào cần chạy thêm?\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eAlerting rules\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eGiúp tôi thiết lập alerting rules cho hệ thống dynamic prompt:\n\nMetrics hiện có:\n- prompt_render_time: Thời gian render template (ms)\n- prompt_length: Số ký tự của prompt cuối cùng\n- claude_error_rate: Tỷ lệ lỗi từ Claude API (%)\n- user_satisfaction: Điểm hài lòng trung bình (1-5)\n- follow_up_rate: Tỷ lệ user hỏi lại (%)\n\nVới mỗi metric, đề xuất:\n1. Ngưỡng cảnh báo (warning) và ngưỡng nghiêm trọng (critical)\n2. Cửa sổ thời gian đánh giá (5 phút, 1 giờ, 1 ngày)\n3. Hành động khuyến nghị khi alert trigger\n4. Cách phân biệt anomaly thật vs false positive\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eAnti-patterns cần tránh\u003c\/h2\u003e\n\u003cp\u003eKhi xây dựng hệ thống dynamic prompt, có một số sai lầm phổ biến cần tránh:\u003c\/p\u003e\n\n\u003ch3\u003eAnti-pattern 1: Over-engineering\u003c\/h3\u003e\n\u003cp\u003eKhông phải mọi prompt đều cần dynamic generation. Nếu prompt chỉ phục vụ một use case duy nhất và ít thay đổi, static prompt đơn giản hơn và dễ debug hơn. Chỉ chuyển sang dynamic khi có nhu cầu thực tế rõ ràng.\u003c\/p\u003e\n\n\u003ch3\u003eAnti-pattern 2: Quá nhiều biến\u003c\/h3\u003e\n\u003cp\u003eTemplate với 20+ biến trở nên khó hiểu và khó test. Nếu template cần nhiều biến như vậy, có thể bạn đang cố nhồi quá nhiều logic vào một prompt. Hãy cân nhắc chia thành nhiều prompt nhỏ hơn.\u003c\/p\u003e\n\n\u003ch3\u003eAnti-pattern 3: Bỏ qua fallback\u003c\/h3\u003e\n\u003cp\u003eKhi một biến trong template là null hoặc empty, prompt có thể bị hỏng cấu trúc. Luôn có giá trị mặc định cho mọi biến và validate template output trước khi gửi đến model.\u003c\/p\u003e\n\n\u003ch3\u003eAnti-pattern 4: Không test đủ combinations\u003c\/h3\u003e\n\u003cp\u003eNếu template có 5 biến, mỗi biến có 3 giá trị khả dĩ, bạn có 243 combinations. Không cần test hết, nhưng cần test các combinations thường gặp nhất và các edge cases. Dùng property-based testing để tự động sinh combinations.\u003c\/p\u003e\n\n\u003ch3\u003eAnti-pattern 5: Quên tính chi phí token\u003c\/h3\u003e\n\u003cp\u003eDynamic prompt dài hơn static prompt vì thêm context, examples, và instructions. Mỗi token thêm vào đều tốn tiền. Theo dõi prompt length và tối ưu khi cần — loại bỏ context không cần thiết, rút gọn instructions, giảm số ví dụ mẫu khi user đã quen với hệ thống.\u003c\/p\u003e\n\n\u003ch2\u003eBước tiếp theo\u003c\/h2\u003e\n\u003cp\u003eDynamic prompt generation chuyển prompt engineering từ việc viết tay thủ công sang một hệ thống có kiến trúc rõ ràng, testable, và scalable. Bắt đầu bằng cách chuyển 2-3 static prompt quan trọng nhất của bạn sang template, thêm context-aware logic, và thiết lập A\/B testing cơ bản. Tìm hiểu thêm các pattern nâng cao tại \u003ca href=\"\/collections\/nang-cao\"\u003eThư viện Nâng cao\u003c\/a\u003e.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47730163581140,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/dynamic-prompt-generation-t_o-prompt-t_-d_ng-theo-context-va-user-input.jpg?v=1774716298","url":"https:\/\/claude.vn\/products\/dynamic-prompt-generation-t%e1%ba%a1o-prompt-t%e1%bb%b1-d%e1%bb%99ng-theo-context-va-user-input","provider":"CLAUDE.VN","version":"1.0","type":"link"}