<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Cách xây dựng workflow LLM với Promptflow và OpenAI &#40;có đánh giá, tracing&#41;</title>
<meta name="description" content="Cách xây dựng workflow LLM với Promptflow và OpenAI &#40;có đánh giá, tracing&#41; - 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="Cách xây dựng workflow LLM với Promptflow và OpenAI &#40;có đánh giá, tracing&#41;">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức -...">
<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/cach-xay-dung-workflow-llm-voi-promptflow-va-openai-co-danh-gia-tracing-12726.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/cach-xay-dung-workflow-llm-voi-promptflow-va-openai-co-danh-gia-tracing-12726.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>Cách xây dựng workflow LLM với Promptflow và OpenAI &#40;có đánh giá, tracing&#41;</h1>
		<ul class="list-inline">
			<li>Chủ nhật - 03/05/2026 21:51</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="Cách xây dựng workflow LLM với Promptflow và OpenAI &#40;có đánh giá, tracing&#41;" src="https://st.quantrimang.com/photos/image/2026/04/08/Sua-loi-code-tren-Claude-200-size-80x80-znd.png" 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/214847-2026531344.mp3"></audio></figure><p style="text-align:justify;"><span style="background-color:rgb(255,255,255);color:rgba(0,0,0,0.87);font-family:Arial, sans-serif;font-size:16px;"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;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;">Bài hướng dẫn này trình bày cách xây dựng một workflow LLM hoàn chỉnh theo phong cách production, sử dụng </span></span>Promptflow<span style="background-color:rgb(255,255,255);color:rgba(0,0,0,0.87);font-family:Arial, sans-serif;font-size:16px;"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;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;"> trong môi trường Colab. Quá trình bắt đầu từ việc thiết lập một backend keyring ổn định nhằm tránh các vấn đề phụ thuộc hệ điều hành, đồng thời cấu hình kết nối với OpenAI một cách an toàn.</span></span></p><div 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 0px 16px;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;" id="vid"><div class="AV67fd319df16401cb0e00414b" style="border-width:0px;font:inherit;margin:0px auto;max-width:400px;padding:0px;width:400px;"><div style="border-width:0px;font:inherit;margin:0px;padding:0px;width:400px;" id="aniBox"><div style="border-width:0px;font:inherit;margin:0px;padding:0px;width:400px;" id="aniplayer_AV67fd319df16401cb0e00414b-1777859229719"><div class="avp-floating-container avp-move-left-enter-done" style="aspect-ratio:auto;background-color:rgba(0, 0, 0, 0);border-image:initial;border-radius:0px;border:medium none currentcolor;box-shadow:none;box-sizing:border-box;color:inherit;cursor:inherit;display:block;flex-direction:row;flex:0 1 auto;font-family:inherit;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;height:auto;letter-spacing:inherit;line-height:1;margin:0px;max-width:none;min-height:0px;min-width:0px;outline:none;overflow:visible;padding:0px;pointer-events:inherit;position:static;text-align:inherit;text-decoration:none;transform:none;transition:none 0.75s;vertical-align:initial;white-space:inherit;width:auto;will-change:auto;word-break:inherit;" tabindex="0" avp="" _382ee1e6="" id="aniplayer_AV67fd319df16401cb0e00414b-1777859229719Wrapper"><div class="avp-body" style="aspect-ratio:auto;background-color:rgba(0, 0, 0, 0);border-image:initial;border-radius:0px;border:medium none currentcolor;box-shadow:none;box-sizing:border-box;color:inherit;cursor:inherit;display:flex;flex-direction:row;flex:0 1 auto;font-family:inherit;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;height:auto;justify-content:center;letter-spacing:inherit;line-height:1;margin:0px;max-width:none;min-height:0px;min-width:0px;outline:none;overflow:visible;padding:0px;pointer-events:inherit;position:relative;text-align:inherit;text-decoration:none;transform:none;transition:none;vertical-align:initial;white-space:inherit;width:auto;will-change:auto;word-break:inherit;" avp="" _382ee1e6=""><div class="avp-main" style="aspect-ratio:auto;border-image:initial;border-radius:0px;border:medium none currentcolor;box-shadow:none;box-sizing:border-box;color:inherit;cursor:inherit;display:flex;flex-direction:column;flex:0 0 auto;font-family:inherit;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;height:auto;letter-spacing:inherit;line-height:1;margin:0px;max-width:none;min-height:0px;min-width:0px;outline:none;overflow:visible;padding:0px;pointer-events:inherit;position:static;text-align:inherit;text-decoration:none;transform:none;transition:none;vertical-align:initial;white-space:inherit;width:auto;will-change:auto;word-break:inherit;" avp="" _382ee1e6=""><div class="avp-source-placeholder" style="aspect-ratio:auto;border-image:initial;border-radius:0px;border:medium none currentcolor;box-shadow:none;box-sizing:border-box;color:inherit;cursor:inherit;display:block;flex-direction:row;flex:0 1 auto;font-family:inherit;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;height:auto;letter-spacing:inherit;line-height:1;margin:0px;max-width:none;min-height:0px;min-width:0px;outline:none;overflow:visible;padding:0px;pointer-events:inherit;position:static;text-align:justify;text-decoration:none;transform:none;transition:none;vertical-align:initial;white-space:inherit;width:auto;will-change:auto;word-break:inherit;" avp="" _382ee1e6="">&nbsp;</div></div></div></div><div class="avp-floating-placeholder" style="aspect-ratio:auto;border-image:initial;border-radius:0px;border:medium none currentcolor;box-shadow:none;box-sizing:border-box;color:inherit;cursor:inherit;display:block;flex-direction:row;flex:0 1 auto;font-family:inherit;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;height:auto;letter-spacing:inherit;line-height:1;margin:0px;max-width:none;min-height:0px;min-width:0px;outline:none;overflow:visible;padding:0px;pointer-events:inherit;position:static;text-align:justify;text-decoration:none;transform:none;transition:none;vertical-align:initial;white-space:inherit;width:auto;will-change:auto;word-break:inherit;" avp="" _382ee1e6="">&nbsp;</div></div></div></div></div><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:justify;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;">Tiếp đó, hệ thống thiết lập một workspace rõ ràng và định nghĩa một file Prompty đóng vai trò là thành phần LLM cốt lõi trong pipeline. Trên nền tảng này, một flow dạng class được xây dựng, kết hợp giữa xử lý tiền định (deterministic preprocessing) và khả năng suy luận của LLM. Cách tiếp cận này cho phép chèn các “gợi ý” đã được tính toán sẵn vào phản hồi của mô hình.</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:justify;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;">Hệ thống cũng được kích hoạt tính năng tracing để theo dõi chi tiết từng bước thực thi. Sau đó, workflow được chạy thử với cả truy vấn đơn lẻ và theo lô (batch), đồng thời xuất kết quả dưới dạng có cấu trúc. Cuối cùng, pipeline được mở rộng bằng một hệ thống đánh giá, trong đó một LLM đóng vai trò “giám khảo” để chấm điểm câu trả lời dựa trên kết quả kỳ vọng.</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:justify;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;"><strong>Thiết lập môi trường và kết nối OpenAI</strong></h2><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:justify;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- language-none prettyprint" style="-webkit-text-stroke-width:0px;background-color:rgb(244, 251, 244);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Menlo, &#039;Bitstream Vera Sans Mono&#039;, &#039;DejaVu Sans Mono&#039;, Monaco, Consolas, 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"><code class="language-plaintext" style="border-radius:5px;border-width:0px;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;padding:0px;">!pip install -q keyrings.alt
import keyring
from keyrings.alt.file import PlaintextKeyring
keyring.set_keyring(PlaintextKeyring())
import os
from promptflow.client import PFClient
from promptflow.connections import OpenAIConnection
pf = PFClient()
CONN = &quot;open_ai_connection&quot;
try:
   pf.connections.get(name=CONN)
   print(f&quot;Using existing connection &#039;{CONN}&#039;&quot;)
except Exception:
   pf.connections.create_or_update(
       OpenAIConnection(name=CONN, api_key=os.environ&#91;&quot;OPENAI_API_KEY&quot;&#93;)
   )
   print(f&quot;Created connection &#039;{CONN}&#039;&quot;)</code></pre><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:justify;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;">Quy trình bắt đầu bằng việc cài đặt một backend keyring dự phòng nhằm tránh lỗi phụ thuộc môi trường, đặc biệt trong Colab. Sau đó, client của Promptflow được khởi tạo và kiểm tra xem kết nối tới OpenAI đã tồn tại hay chưa.</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:justify;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;">Nếu chưa có, hệ thống sẽ tạo kết nối mới bằng API key lấy từ biến môi trường, đảm bảo tính nhất quán và khả năng tái sử dụng về sau.</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:justify;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;">Tiếp theo, toàn bộ thư viện cần thiết của Promptflow được cài đặt, đồng thời thiết lập thư mục làm việc cho dự án. API key của OpenAI được cấu hình một cách an toàn nếu chưa tồn tại, rồi môi trường được thiết lập lại để đảm bảo mọi thành phần hoạt động chính xác.</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:justify;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- language-none prettyprint" style="-webkit-text-stroke-width:0px;background-color:rgb(244, 251, 244);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Menlo, &#039;Bitstream Vera Sans Mono&#039;, &#039;DejaVu Sans Mono&#039;, Monaco, Consolas, 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"><code class="language-plaintext" style="border-radius:5px;border-width:0px;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;padding:0px;">!pip install -q &quot;promptflow&gt;=1.13.0&quot; &quot;promptflow-tracing&quot; &quot;promptflow-tools&quot; openai
import os, sys, json, getpass, textwrap, importlib
from pathlib import Path
if &quot;OPENAI_API_KEY&quot; not in os.environ:
   os.environ&#91;&quot;OPENAI_API_KEY&quot;&#93; = getpass.getpass(&quot;Paste your OpenAI API key: &quot;)
WORK_DIR = Path(&quot;/content/pf_demo&quot;); WORK_DIR.mkdir(exist_ok=True, parents=True)
os.chdir(WORK_DIR); sys.path.insert(0, str(WORK_DIR))
from promptflow.client import PFClient
from promptflow.connections import OpenAIConnection
from promptflow.tracing import start_trace
pf = PFClient()
CONN = &quot;open_ai_connection&quot;
try:
   pf.connections.get(name=CONN); print(f&quot;Using existing connection &#039;{CONN}&#039;&quot;)
except Exception:
   pf.connections.create_or_update(OpenAIConnection(name=CONN, api_key=os.environ&#91;&quot;OPENAI_API_KEY&quot;&#93;))
   print(f&quot;Created connection &#039;{CONN}&#039;&quot;)</code></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:justify;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;"><strong>Xây dựng Prompty và flow xử lý</strong></h2><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:justify;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- language-none prettyprint" style="-webkit-text-stroke-width:0px;background-color:rgb(244, 251, 244);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Menlo, &#039;Bitstream Vera Sans Mono&#039;, &#039;DejaVu Sans Mono&#039;, Monaco, Consolas, 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"><code class="language-plaintext" style="border-radius:5px;border-width:0px;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;padding:0px;">(WORK_DIR / &quot;researcher.prompty&quot;).write_text(&quot;&quot;&quot;---
name: Researcher
description: Concise research assistant.
model:
 api: chat
 configuration:
   type: openai
   connection: open_ai_connection
   model: gpt-4o-mini
 parameters:
   temperature: 0.2
   max_tokens: 350
inputs:
 question: {type: string}
 hint:     {type: string, default: &quot;&quot;}
sample:
 question: &quot;What is the speed of light in vacuum?&quot;
 hint: &quot;&quot;
---
system:
You are a precise research assistant. Answer in 1-3 sentences. If a `hint` is given, weave it in.
user:
Q: {{question}}
{% if hint %}Hint: {{hint}}{% endif %}
&quot;&quot;&quot;)
(WORK_DIR / &quot;flow.py&quot;).write_text(textwrap.dedent(&#039;&#039;&#039;
   from pathlib import Path
   from promptflow.tracing import trace
   from promptflow.core import Prompty
   BASE = Path(__file__).parent
   @trace
   def safe_calc(expression: str) -&gt; str:
       &quot;&quot;&quot;A tiny deterministic &#039;tool&#039; the assistant can lean on.&quot;&quot;&quot;
       if not set(expression) &lt;= set(&quot;0123456789+-*/(). &quot;):
           return &quot;unsafe&quot;
       try: return str(eval(expression))
       except Exception as e: return f&quot;error:{e}&quot;
   class ResearchAssistant:
       &quot;&quot;&quot;Class-based flex flow. __init__ args become flow init parameters.&quot;&quot;&quot;
       def __init__(self, model: str = &quot;gpt-4o-mini&quot;):
           self.model = model
           self.llm = Prompty.load(source=BASE / &quot;researcher.prompty&quot;)
       @trace
       def __call__(self, question: str) -&gt; dict:
           hint = &quot;&quot;
           if &quot;*&quot; in question or &quot;+&quot; in question:
               tokens = &#91;t for t in question.replace(&quot;?&quot;,&quot;&quot;).split() if any(c.isdigit() for c in t)&#93;
               expr = &quot;&quot;.join(tokens)
               if expr:
                   hint = f&quot;computed: {expr} = {safe_calc(expr)}&quot;
           answer = self.llm(question=question, hint=hint)
           return {&quot;question&quot;: question, &quot;answer&quot;: str(answer).strip(), &quot;hint_used&quot;: hint}
&#039;&#039;&#039;))
(WORK_DIR / &quot;flow.flex.yaml&quot;).write_text(
   &quot;$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json\n&quot;
   &quot;entry: flow:ResearchAssistant\n&quot;
)</code></pre><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:justify;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;">Một file Prompty được định nghĩa để mô tả cách LLM hoạt động như một trợ lý nghiên cứu ngắn gọn, có cấu trúc rõ ràng.</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:justify;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;">Sau đó, một flow dạng class được tạo ra, kết hợp giữa công cụ tính toán mang tính xác định và lời gọi tới LLM. Cách thiết kế này cho phép hệ thống thực hiện suy luận “lai” (hybrid reasoning), trong đó một phần logic được xử lý bằng code, phần còn lại do LLM đảm nhiệm.</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:justify;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;">Flow này được đăng ký thông qua file cấu hình YAML, giúp nó có thể được thực thi trực tiếp trong hệ sinh thái Promptflow.</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:justify;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- language-none prettyprint" style="-webkit-text-stroke-width:0px;background-color:rgb(244, 251, 244);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Menlo, &#039;Bitstream Vera Sans Mono&#039;, &#039;DejaVu Sans Mono&#039;, Monaco, Consolas, 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"><code class="language-plaintext" style="border-radius:5px;border-width:0px;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;padding:0px;">try: start_trace()
except Exception as e: print(&quot;trace ui unavailable on Colab — traces still recorded:&quot;, e)
import flow as _flow; importlib.reload(_flow)
agent = _flow.ResearchAssistant(model=&quot;gpt-4o-mini&quot;)
print(&quot;\n=== Single call ===&quot;)
print(json.dumps(agent(question=&quot;In one sentence, what is photosynthesis?&quot;), indent=2))
print(json.dumps(agent(question=&quot;What is 21 * 19 ?&quot;), indent=2))
data = &#91;
   {&quot;question&quot;: &quot;What is the capital of France?&quot;,          &quot;expected&quot;: &quot;Paris&quot;},
   {&quot;question&quot;: &quot;Chemical symbol for gold?&quot;,               &quot;expected&quot;: &quot;Au&quot;},
   {&quot;question&quot;: &quot;Who wrote the play Hamlet?&quot;,              &quot;expected&quot;: &quot;Shakespeare&quot;},
   {&quot;question&quot;: &quot;What is 12 * 11 ?&quot;,                       &quot;expected&quot;: &quot;132&quot;},
   {&quot;question&quot;: &quot;Boiling point of water at sea level (C)?&quot;,&quot;expected&quot;: &quot;100&quot;},
   {&quot;question&quot;: &quot;Largest planet in our solar system?&quot;,     &quot;expected&quot;: &quot;Jupiter&quot;},
&#93;
data_path = WORK_DIR / &quot;data.jsonl&quot;
data_path.write_text(&quot;\n&quot;.join(json.dumps(r) for r in data))
print(&quot;\n=== Batch run ===&quot;)
base_run = pf.run(
   flow=str(WORK_DIR / &quot;flow.flex.yaml&quot;),
   data=str(data_path),
   column_mapping={&quot;question&quot;: &quot;${data.question}&quot;},
   stream=True,
)
print(pf.get_details(base_run))</code></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:justify;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;"><strong>Chạy thử và theo dõi workflow</strong></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:justify;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;">Tính năng tracing được bật để ghi lại toàn bộ quá trình thực thi. Flow trợ lý nghiên cứu sau đó được khởi tạo và kiểm tra với các truy vấn riêng lẻ nhằm đảm bảo hệ thống xử lý tốt cả ngôn ngữ tự nhiên lẫn các phép toán.</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:justify;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;">Sau khi xác nhận hoạt động ổn định, một dataset được chuẩn bị để chạy thử nghiệm theo lô. Promptflow sẽ xử lý batch này và trả về kết quả dưới dạng dữ liệu có cấu trúc, sẵn sàng cho bước đánh giá tiếp theo.</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:justify;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- language-none prettyprint" style="-webkit-text-stroke-width:0px;background-color:rgb(244, 251, 244);border-radius:5px;border:1px solid !important;color:rgba(0, 0, 0, 0.87);display:block;font-family:Menlo, &#039;Bitstream Vera Sans Mono&#039;, &#039;DejaVu Sans Mono&#039;, Monaco, Consolas, 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"><code class="language-plaintext" style="border-radius:5px;border-width:0px;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;padding:0px;">(WORK_DIR / &quot;judge.prompty&quot;).write_text(&quot;&quot;&quot;---
name: Judge
model:
 api: chat
 configuration:
   type: openai
   connection: open_ai_connection
   model: gpt-4o-mini
 parameters:
   temperature: 0
   max_tokens: 150
   response_format: {type: json_object}
inputs:
 question: {type: string}
 answer:   {type: string}
 expected: {type: string}
---
system:
You are an exacting grader. Decide whether the assistant&#039;s answer contains the expected fact (case-insensitive, allowing reasonable phrasing/synonyms). Reply ONLY as JSON: {&quot;score&quot;: 0 or 1, &quot;reason&quot;: &quot;...&quot;}.
user:
Question: {{question}}
Expected: {{expected}}
Answer:   {{answer}}
&quot;&quot;&quot;)
(WORK_DIR / &quot;eval_flow.py&quot;).write_text(textwrap.dedent(&#039;&#039;&#039;
   import json
   from pathlib import Path
   from promptflow.tracing import trace
   from promptflow.core import Prompty
   BASE = Path(__file__).parent
   class Evaluator:
       def __init__(self):
           self.judge = Prompty.load(source=BASE / &quot;judge.prompty&quot;)
       @trace
       def __call__(self, question: str, answer: str, expected: str) -&gt; dict:
           raw = self.judge(question=question, answer=answer, expected=expected)
           if isinstance(raw, str):
               try: raw = json.loads(raw)
               except Exception: raw = {&quot;score&quot;: 0, &quot;reason&quot;: f&quot;unparseable:{raw&#91;:80&#93;}&quot;}
           return {&quot;score&quot;: int(raw.get(&quot;score&quot;, 0)), &quot;reason&quot;: str(raw.get(&quot;reason&quot;,&quot;&quot;))}
       def __aggregate__(self, line_results):
           &quot;&quot;&quot;Run-level aggregation. Whatever this returns shows up in pf.get_metrics().&quot;&quot;&quot;
           scores = &#91;r&#91;&quot;score&quot;&#93; for r in line_results if r&#93;
           return {
               &quot;accuracy&quot;: (sum(scores) / len(scores)) if scores else 0.0,
               &quot;passed&quot;:   sum(scores),
               &quot;total&quot;:    len(scores),
           }
&#039;&#039;&#039;))
(WORK_DIR / &quot;eval.flex.yaml&quot;).write_text(
   &quot;$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json\n&quot;
   &quot;entry: eval_flow:Evaluator\n&quot;
)
print(&quot;\n=== Evaluation run ===&quot;)
eval_run = pf.run(
   flow=str(WORK_DIR / &quot;eval.flex.yaml&quot;),
   data=str(data_path),
   run=base_run,
   column_mapping={
       &quot;question&quot;: &quot;${data.question}&quot;,
       &quot;expected&quot;: &quot;${data.expected}&quot;,
       &quot;answer&quot;:   &quot;${run.outputs.answer}&quot;,
   },
   stream=True,
)
eval_details = pf.get_details(eval_run)
print(eval_details)
print(&quot;\n=== Aggregated metrics (from __aggregate__) ===&quot;)
print(json.dumps(pf.get_metrics(eval_run), indent=2))
import pandas as pd
if &quot;outputs.score&quot; in eval_details.columns:
   s = pd.to_numeric(eval_details&#91;&quot;outputs.score&quot;&#93;, errors=&quot;coerce&quot;).fillna(0)
   print(f&quot;Manual accuracy: {s.mean():.2%}  ({int(s.sum())}/{len(s)})&quot;)</code></pre><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:justify;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;">Một Prompty khác được tạo ra để đóng vai trò “giám khảo”, có nhiệm vụ đánh giá đầu ra của mô hình so với đáp án kỳ vọng. Kết quả được trả về dưới dạng JSON có cấu trúc.</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:justify;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;">Tiếp đó, một lớp evaluator được triển khai để phân tích kết quả, tính điểm và tổng hợp các chỉ số đánh giá. Hệ thống cũng hỗ trợ phương thức tổng hợp để đưa ra metric tổng thể.</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:justify;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;">Pipeline đánh giá được chạy song song với pipeline chính, liên kết trực tiếp với lần chạy trước đó. Độ chính xác được tính toán thông qua metric của Promptflow, đồng thời có cơ chế fallback để kiểm tra thủ công khi cần.</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:justify;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;"><strong>Kết luận</strong></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:justify;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;">Workflow được xây dựng trong hướng dẫn này không chỉ dừng ở việc gửi prompt và nhận phản hồi. Thay vào đó, nó là một hệ thống LLM hoàn chỉnh, có cấu trúc rõ ràng, dễ mở rộng và có thể kiểm soát.</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:justify;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;">Việc kết hợp các công cụ xử lý xác định, prompt có cấu trúc và flow có thể tái sử dụng giúp hệ thống trở nên minh bạch và linh hoạt hơn. Khi bổ sung thêm batch execution và pipeline đánh giá, toàn bộ quy trình tạo thành một vòng lặp phản hồi rõ ràng, cho phép đo lường hiệu suất dựa trên độ chính xác và phân tích chi tiết.</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:justify;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;">Ngoài ra, việc tích hợp tracing và các hàm tổng hợp giúp quá trình debug, giám sát và cải tiến trở nên hiệu quả hơn. Đây là một ví dụ điển hình cho cách xây dựng các ứng dụng LLM end-to-end có nền tảng vững chắc về cấu trúc, đánh giá và khả năng tái lập.</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/cach-xay-dung-workflow-llm-voi-promptflow-va-openai-co-danh-gia-tracing-12726.html" title="Cách xây dựng workflow LLM với Promptflow và OpenAI &#40;có đánh giá, tracing&#41;">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-xay-dung-workflow-llm-voi-promptflow-va-openai-co-danh-gia-tracing-12726.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>
<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>