<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>5 Python decorator giúp viết code AI sạch và dễ kiểm soát hơn</title>
<meta name="description" content="5 Python decorator giúp viết code AI sạch và dễ kiểm soát hơn - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="5 Python decorator giúp viết code AI sạch và dễ kiểm soát hơn">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;5-python-decorator-giup-viet-code-ai-sach-va-de-kiem-soat-hon-12728.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/5-python-decorator-giup-viet-code-ai-sach-va-de-kiem-soat-hon-12728.html">
<link rel="shortcut icon" href="https://nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/5-python-decorator-giup-viet-code-ai-sach-va-de-kiem-soat-hon-12728.html">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://nguoicodonvn2008.info/">https://nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>5 Python decorator giúp viết code AI sạch và dễ kiểm soát hơn</h1>
		<ul class="list-inline">
			<li>Chủ nhật - 03/05/2026 21:54</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="5 Python decorator giúp viết code AI sạch và dễ kiểm soát hơn" src="https://st.quantrimang.com/photos/image/2026/04/24/repository-github-giup-hoc-quantum-machine-learning200-size-80x80-znd.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<figure class="nv-media"><audio controls="" src="https://st.quantrimang.com/photos/media/2026/05/03/214868-2026531810.mp3"></audio></figure><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Nhờ đó, code trở nên sạch hơn, dễ đọc hơn và dễ mở rộng hơn, đặc biệt khi hệ thống bắt đầu phức tạp.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Bài viết này giới thiệu 5 decorator Python đã được nhiều developer sử dụng thực tế và chứng minh hiệu quả trong việc cải thiện chất lượng code AI. Các ví dụ minh họa sử dụng thư viện chuẩn của Python (như <code style="border-radius:5px;border:1px solid rgb(221, 221, 221);color:rgb(88, 37, 123);font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:inherit;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px 2px;padding:2px 8px;">functools.wraps</code>) để tập trung vào cách hoạt động của decorator, giúp bạn dễ dàng áp dụng vào dự án của mình.</span></p><h2 style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:20px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;letter-spacing:normal;line-height:32px;margin:10px 0px;orphans:2;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);"><strong>Giới hạn concurrency khi gọi LLM</strong></span></h2><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Khi làm việc với các mô hình ngôn ngữ lớn (LLM), đặc biệt là API bên thứ ba, bạn rất dễ gặp giới hạn về số lượng request — nhất là với gói miễn phí.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Decorator giới hạn concurrency giúp giải quyết vấn đề này bằng cách kiểm soát số lượng hàm bất đồng bộ được chạy cùng lúc. Thông qua cơ chế semaphore, nó tạo ra một lớp “điều tiết”, đảm bảo bạn không gửi quá nhiều request cùng lúc và tránh bị lỗi rate limit.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Đây là một giải pháp đơn giản nhưng rất hiệu quả để ổn định hệ thống khi tích hợp LLM.</span></p><div class="codebar" style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px;orphans:2;padding:0px;position:relative;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;</div><pre class="language-python prettyprint hljs" style="-webkit-text-stroke-width:0px;background-color:rgb(254, 255, 239);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:14px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px 0px 16px;max-height:600px;max-width:100%;orphans:2;overflow:auto;padding:8px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;" id="pre0"><span style="color:hsl(0, 0%, 0%);"><span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> asyncio
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">from</span> functools <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> wraps

<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">limit_concurrency</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">limit=</span><span class="hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">5</span>):
    sem = asyncio.Semaphore(limit)
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">decorator</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span>):
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">        @wraps(</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">async</span> <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">wrapper</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">*args, **kwargs</span>):
            <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">async</span> <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">with</span> sem:
                <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">await</span> func(*args, **kwargs)
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> wrapper
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> decorator

<span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Application</span>
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">@limit_concurrency(</span><span class="hljs-meta hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">5</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">async</span> <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">fetch_llm_batch</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">prompt</span>):
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">await</span> async_api_client.generate(prompt)</span></pre><h2 style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:20px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;letter-spacing:normal;line-height:32px;margin:10px 0px;orphans:2;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);"><strong>Logger có cấu trúc cho hệ thống machine learning</strong></span></h2><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Trong các hệ thống machine learning phức tạp, việc dùng print() gần như vô dụng, đặc biệt khi đã deploy production. Log rất dễ bị “trôi” và khó truy vết.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Decorator logging có cấu trúc giúp ghi lại quá trình thực thi và lỗi dưới dạng JSON. Điều này cho phép bạn tìm kiếm log nhanh hơn, dễ debug hơn và tích hợp tốt với các hệ thống monitoring.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Ví dụ, bạn có thể áp dụng decorator này cho hàm huấn luyện một epoch trong mô hình neural network để theo dõi chi tiết từng bước.</span></p><div class="codebar" style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px;orphans:2;padding:0px;position:relative;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;</div><pre class="language-python prettyprint hljs" style="-webkit-text-stroke-width:0px;background-color:rgb(254, 255, 239);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:14px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px 0px 16px;max-height:600px;max-width:100%;orphans:2;overflow:auto;padding:8px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;" id="pre1"><span style="color:hsl(0, 0%, 0%);"><span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> logging, json, time
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">from</span> functools <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> wraps

<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">json_log</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span>):
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">    @wraps(</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">wrapper</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">*args, **kwargs</span>):
        start = time.time()
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">try</span>:
            res = func(*args, **kwargs)
            logging.info(json.dumps({<span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&quot;step&quot;</span>: func.__name__, <span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&quot;status&quot;</span>: <span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&quot;success&quot;</span>, <span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&quot;time&quot;</span>: time.time() - start}))
            <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> res
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">except</span> Exception <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">as</span> e:
            logging.error(json.dumps({<span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&quot;step&quot;</span>: func.__name__, <span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&quot;error&quot;</span>: <span class="hljs-built_in" style="border-width:0px;font:inherit;margin:0px;padding:0px;">str</span>(e)}))
            <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">raise</span>
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> wrapper

<span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Application</span>
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">@json_log</span>
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">train_epoch</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">model, training_data</span>):
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> model.fit(training_data)</span></pre><h2 style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:20px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;letter-spacing:normal;line-height:32px;margin:10px 0px;orphans:2;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);"><strong>Tự động tạo feature đầu vào (Feature Injector)</strong></span></h2><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Trong giai đoạn triển khai model, một vấn đề rất phổ biến là đảm bảo dữ liệu đầu vào từ người dùng được xử lý giống hệt dữ liệu training ban đầu. Khi chuyển model từ môi trường notebook (như Jupyter) sang production (ví dụ FastAPI), việc lặp lại các bước transform dữ liệu thường khá phiền phức và dễ sai sót.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Decorator “feature injector” giải quyết vấn đề này bằng cách tự động thêm các feature cần thiết vào dữ liệu đầu vào trước khi đưa vào model. Nhờ đó, bạn đảm bảo được tính nhất quán mà không cần xử lý thủ công mỗi lần.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Ví dụ đơn giản là tự động thêm feature <code style="border-radius:5px;border:1px solid rgb(221, 221, 221);color:rgb(88, 37, 123);font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:inherit;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px 2px;padding:2px 8px;">is_weekend</code> dựa trên cột ngày trong dataset, xác định đó có phải thứ Bảy hoặc Chủ nhật hay không.</span></p><div class="codebar" style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px;orphans:2;padding:0px;position:relative;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;</div><pre class="language-python prettyprint hljs" style="-webkit-text-stroke-width:0px;background-color:rgb(254, 255, 239);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:14px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px 0px 16px;max-height:600px;max-width:100%;orphans:2;overflow:auto;padding:8px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;" id="pre2"><span style="color:hsl(0, 0%, 0%);"><span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">from</span> functools <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> wraps

<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">add_weekend_feature</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span>):
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">    @wraps(</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">wrapper</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">df, *args, **kwargs</span>):
        df = df.copy() <span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Prevents Pandas mutation warnings</span>
        df&#91;<span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&#039;is_weekend&#039;</span>&#93; = df&#91;<span class="hljs-string" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&#039;date&#039;</span>&#93;.dt.dayofweek.isin(&#91;<span class="hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">5</span>, <span class="hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">6</span>&#93;).astype(<span class="hljs-built_in" style="border-width:0px;font:inherit;margin:0px;padding:0px;">int</span>)
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> func(df, *args, **kwargs)
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> wrapper

<span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Application</span>
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">@add_weekend_feature</span>
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">process_data</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">df</span>):
    <span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># &#039;is_weekend&#039; is guaranteed to exist here</span>
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> df.dropna()</span></pre><h2 style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:20px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;letter-spacing:normal;line-height:32px;margin:10px 0px;orphans:2;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);"><strong>Cố định random seed để đảm bảo reproducibility</strong></span></h2><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Trong quá trình thử nghiệm và tuning hyperparameter, kết quả model có thể thay đổi chỉ vì yếu tố ngẫu nhiên.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Decorator “seed setter” giúp cố định random seed, từ đó đảm bảo các lần chạy thử có thể so sánh công bằng với nhau. Điều này đặc biệt quan trọng khi bạn đang kiểm tra ảnh hưởng của một thay đổi, ví dụ như learning rate.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Nếu không kiểm soát seed, bạn sẽ khó biết sự thay đổi hiệu suất đến từ cấu hình mới hay chỉ đơn giản là do khởi tạo ngẫu nhiên không thuận lợi. Việc cố định seed giúp cô lập biến số và làm cho các thử nghiệm như A/B testing đáng tin cậy hơn.</span></p><div class="codebar" style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px;orphans:2;padding:0px;position:relative;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;</div><pre class="language-python prettyprint hljs" style="-webkit-text-stroke-width:0px;background-color:rgb(254, 255, 239);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:14px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px 0px 16px;max-height:600px;max-width:100%;orphans:2;overflow:auto;padding:8px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;" id="pre3"><span style="color:hsl(0, 0%, 0%);"><span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> random, numpy <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">as</span> np
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">from</span> functools <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> wraps

<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">lock_seed</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">seed=</span><span class="hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">42</span>):
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">decorator</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span>):
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">        @wraps(</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">wrapper</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">*args, **kwargs</span>):
            random.seed(seed)
            np.random.seed(seed)
            <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> func(*args, **kwargs)
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> wrapper
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> decorator

<span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Application</span>
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">@lock_seed(</span><span class="hljs-meta hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">42</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">initialize_weights</span>():
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> np.random.randn(<span class="hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">10</span>, <span class="hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">10</span>)</span></pre><h2 style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:20px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;letter-spacing:normal;line-height:32px;margin:10px 0px;orphans:2;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);"><strong>Fallback trong môi trường phát triển</strong></span></h2><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Khi xây dựng ứng dụng AI — đặc biệt là các hệ thống như RAG — bạn thường phụ thuộc vào dịch vụ bên ngoài như API LLM. Nếu các dịch vụ này gặp lỗi (timeout, hết quota…), toàn bộ hệ thống có thể bị gián đoạn.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Decorator “dev-mode fallback” hoạt động như một lớp bảo vệ. Khi hàm gặp lỗi, thay vì crash, nó sẽ trả về dữ liệu giả lập (mock data) đã định nghĩa sẵn.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Điều này đặc biệt hữu ích trong môi trường phát triển hoặc CI/CD, giúp hệ thống vẫn chạy ổn định ngay cả khi dịch vụ bên ngoài gặp vấn đề tạm thời.</span></p><div class="codebar" style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px;orphans:2;padding:0px;position:relative;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;</div><pre class="language-python prettyprint hljs" style="-webkit-text-stroke-width:0px;background-color:rgb(254, 255, 239);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Consolas, Monaco, monospace;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:14px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;margin:0px 0px 16px;max-height:600px;max-width:100%;orphans:2;overflow:auto;padding:8px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;" id="pre4"><span style="color:hsl(0, 0%, 0%);"><span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">from</span> functools <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">import</span> wraps

<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">fallback_mock</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">mock_data</span>):
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">decorator</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span>):
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">        @wraps(</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">func</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">wrapper</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">*args, **kwargs</span>):
            <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">try</span>:
                <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> func(*args, **kwargs)
            <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">except</span> Exception: <span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Catches timeouts and rate limits</span>
                <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> mock_data
        <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> wrapper
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> decorator

<span class="hljs-comment" style="border-width:0px;font:inherit;margin:0px;padding:0px;"># Application</span>
<span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">@fallback_mock(</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">mock_data=&#91;</span><span class="hljs-meta hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">0.01</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">, -</span><span class="hljs-meta hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">0.05</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">, </span><span class="hljs-meta hljs-params hljs-number" style="border-width:0px;font:inherit;margin:0px;padding:0px;">0.02</span><span class="hljs-meta hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">&#93;</span><span class="hljs-meta" style="border-width:0px;font:inherit;margin:0px;padding:0px;">)</span>
<span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">def</span> <span class="hljs-title function_" style="border-width:0px;font:inherit;margin:0px;padding:0px;">get_text_embeddings</span>(<span class="hljs-params" style="border-width:0px;font:inherit;margin:0px;padding:0px;">text</span>):
    <span class="hljs-keyword" style="border-width:0px;font:inherit;margin:0px;padding:0px;">return</span> external_api.embed(text)</span></pre><hr style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);font-family:Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;" /><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Các Python decorator trong bài viết không làm thay đổi logic cốt lõi của hệ thống AI, nhưng lại giúp tổ chức code tốt hơn và tăng độ tin cậy của toàn bộ pipeline.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Từ việc kiểm soát request LLM, logging có cấu trúc, đảm bảo tính nhất quán dữ liệu, cho tới kiểm soát randomness và xử lý lỗi, mỗi decorator giải quyết một vấn đề rất thực tế trong quá trình phát triển AI.</span></p><p style="-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;color:rgba(0, 0, 0, 0.87);font-family:Arial, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-language-override:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:26px;margin:10px 0px;orphans:2;overflow-wrap:break-word;padding:0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:hsl(0, 0%, 0%);">Khi kết hợp lại, chúng tạo thành một lớp “hạ tầng mềm” giúp code sạch hơn, dễ debug hơn và sẵn sàng cho production.</span></p>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/5-python-decorator-giup-viet-code-ai-sach-va-de-kiem-soat-hon-12728.html" title="5 Python decorator giúp viết code AI sạch và dễ kiểm soát hơn">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/5-python-decorator-giup-viet-code-ai-sach-va-de-kiem-soat-hon-12728.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<div id="run_cronjobs" style="visibility:hidden;display:none;"><img alt="cron" src="/index.php?second=cronjobs&amp;p=z5N24zql" width="1" height="1" /></div>
<script src="https://nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://nguoicodonvn2008.info",
            "logo": "https://nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>