<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Perficient Blogs</title>
	<atom:link href="https://blogs.perficient.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blogs.perficient.com/</link>
	<description>Expert Digital Insights</description>
	<lastBuildDate>Thu, 30 Jul 2026 16:27:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://blogs.perficient.com/wp-content/uploads/2026/03/cropped-Perficient-Favicon-512-150x150.png</url>
	<title>Perficient Blogs</title>
	<link>https://blogs.perficient.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">30508587</site>	<item>
		<title>Shift-Left Infrastructure Compliance Automation</title>
		<link>https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/</link>
		
		<dc:creator><![CDATA[Suraj Thakur]]></dc:creator>
		<pubDate>Thu, 30 Jul 2026 15:15:42 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392120</guid>

					<description><![CDATA[<p>Using n8n, Azure DevOps, FastAPI, RAG, and AI to audit Terraform changes before merge Infrastructure teams are increasingly using Infrastructure-as-Code to define, review, and deploy&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/">Shift-Left Infrastructure Compliance Automation</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Using n8n, Azure DevOps, FastAPI, RAG, and AI to audit Terraform changes before merge</em></p>
<p>Infrastructure teams are increasingly using Infrastructure-as-Code to define, review, and deploy cloud resources. Terraform makes infrastructure repeatable and version-controlled, but compliance review often still depends on manual checks, late-stage audit activity, or reviewer experience. That creates a gap between how fast infrastructure code moves and how quickly teams can validate security and compliance expectations.</p>
<p>This automation initiative was built to close that gap. The objective was to automate Terraform compliance review during the Azure DevOps pull request process, before code is merged or deployed. The result is a working shift-left audit flow that detects changed Terraform files, audits the content, maps findings to CIS and SOC2 context, uses AI to express the finding clearly, and sends PASS, FAIL, or SKIPPED notifications to reviewers.</p>
<p><img fetchpriority="high" decoding="async" data-attachment-id="392122" data-permalink="https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/terra1/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra1.png" data-orig-size="1037,567" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Terra1" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra1-1024x560.png" class="alignnone wp-image-392122 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/terra1-1024x560.png" alt="Terra1" width="1024" height="560" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/terra1-1024x560.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra1-300x164.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra1-768x420.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra1.png 1037w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h2>Why This Automation Was Needed</h2>
<p>In a traditional process, infrastructure code is written, reviewed, merged, and deployed before deeper compliance issues are discovered. A reviewer may catch obvious mistakes during pull request review, but detailed compliance checks are hard to perform manually. This becomes even more difficult when a pull request contains multiple Terraform files or mixed changes such as README files, YAML files, scripts, and infrastructure code.</p>
<p>The risk is both technical and operational. A small Terraform setting can become a security or audit finding if it violates a control expectation. If this is discovered after merge or deployment, the team must revisit the code, redeploy the infrastructure, and manually collect evidence. The automation solution was designed around a simple question: can we give reviewers meaningful compliance feedback while the pull request is still open?</p>
<h2>The Logic Behind the Automation Flow</h2>
<p>The logic behind the automation solution is intentionally simple: treat every infrastructure pull request as an opportunity to validate compliance before risk enters the environment. The workflow does not try to audit everything blindly. It first understands what changed, filters only relevant Terraform files, and then audits the actual Terraform content from the pull request commit.</p>
<p>This makes the workflow practical. If a pull request has only documentation changes, the audit is skipped. If the pull request has Terraform files, the workflow processes each file. If one file fails and another passes, the result is aggregated into one pull-request-level decision. This keeps the result easy for reviewers to understand.</p>
<h3 style="text-align: center"><strong>Trigger → Validate → Execute → Decide → Notify</strong></h3>
<p>The trigger is the Azure DevOps pull request event. The validation step checks changed files and keeps only Terraform content. The execution step sends Terraform content to the audit backend. The decision step determines PASS, FAIL, or SKIPPED. The notification step sends a clean email to reviewers with the result and context.</p>
<h2>Where AI and RAG Add Value</h2>
<p>The most important part of this automation solution is not only automation. The value increases when automation is combined with RAG and AI. Traditional automation can tell whether a rule passed or failed. RAG and AI help explain why the result matters and turn raw compliance checks into readable, evidence-backed findings.</p>
<p>RAG, or Retrieval-Augmented Generation, is used to bring relevant compliance knowledge into the audit process. Instead of asking the AI model to answer from general knowledge, the workflow retrieves related CIS and SOC2 context from a knowledge store. This allows the audit response to be grounded in the controls that matter for the resource being reviewed.</p>
<p>AI then uses the Terraform configuration and retrieved compliance context to generate a structured finding. For example, if a storage account does not enforce HTTPS-only traffic, the AI-assisted finding can explain the failed setting, the current value, the expected value, the risk, and the relevant CIS/SOC2 mapping. This makes the output easier for both engineers and reviewers to act on.</p>
<ul>
<li>RAG improves context by retrieving relevant CIS and SOC2 control information.</li>
<li>AI improves readability by converting raw audit results into clear findings.</li>
<li>The combined approach helps produce evidence-backed, reviewer-friendly notifications.</li>
</ul>
<h2>AI/RAG Request and Response Flow</h2>
<p>The backend does not send only raw Terraform code to the language model. It builds a controlled audit context that includes the resource configuration, the applicable CIS rule, the mapped SOC2 controls, and strict output instructions. This keeps the AI response grounded in known compliance evidence instead of open-ended reasoning.</p>
<h3>Backend request context sent to the AI model</h3>
<ul>
<li>Role: act as a SOC2 and CIS Azure compliance auditor.</li>
<li>Strict rules: use only provided CIS rules, do not invent control IDs, use severity from metadata, and return valid JSON.</li>
<li>Resource: azurerm_storage_account.bad_storage with enable_https_traffic_only set to false.</li>
<li>Applicable CIS rule: cis-3.1 expects enable_https_traffic_only to be true and marks severity as HIGH.</li>
<li>Mapped SOC2 controls: soc2-CC6.6 and soc2-CC6.7 for logical access and security controls.</li>
</ul>
<pre>Compact prompt context

RESOURCE: azurerm_storage_account.bad_storage

CONFIG: enable_https_traffic_only = false

CIS RULE: cis-3.1 | expected_value = true | severity = HIGH

SOC2: soc2-CC6.6, soc2-CC6.7

TASK: Evaluate resource against provided CIS rules only.

OUTPUT: JSON with resource, findings, status, risk, current_value, expected_value, overall_risk.</pre>
<h3>AI-generated audit response</h3>
<p>The AI model returns a structured finding that the backend can parse and pass back to n8n. The result is not free-form text; it is a predictable JSON response that supports aggregation, branching, and notification formatting.</p>
<pre>{

  "resource": "bad_storage",

  "resource_type": "azurerm_storage_account",

  "findings": [

    {

      "cis_id": "cis-3.1",

      "soc2_controls": ["soc2-CC6.6", "soc2-CC6.7"],

      "status": "FAIL",

      "finding": "Storage account does not enforce HTTPS traffic only",

      "risk": "Unencrypted HTTP traffic allows potential interception and unauthorized access to storage account data in transit",

      "attribute": "enable_https_traffic_only",

      "current_value": "false",

      "expected_value": "true"

    }

  ],

  "overall_risk": "HIGH"

}</pre>
<p>This design is important because the AI is used as an audit reasoning layer, while the backend still controls the source of truth. The CIS and SOC2 context is retrieved first, then the model explains the finding using only the provided rules and controls.</p>
<h2>Representative Backend Structure</h2>
<p>The backend is structured as a small audit service. The exact folder names can evolve, but the separation of responsibility keeps the system easier to maintain and extend.</p>
<pre>backend/

├─ app/

│  ├─ api/

│  │  └─ api.py                  # FastAPI routes for health, ingestion, retrieval, and audit endpoints

│  ├─ parsers/

│  │  └─ terraform_parser.py     # Extracts Terraform resources and attributes from .tf content

│  ├─ services/

│  │  └─ audit_service.py        # Orchestrates parsing, retrieval, AI request, and final audit response

│  ├─ rag/

│  │  └─ retriever.py            # Retrieves relevant CIS and SOC2 context from the vector store

│  ├─ llm/

│  │  └─ claude_client.py        # Sends controlled audit prompt to the LLM and receives JSON findings

│  ├─ ingest/

│  │  ├─ cis_loader.py           # Loads CIS rules into the knowledge base

│  │  └─ soc2_loader.py          # Loads SOC2 controls into the knowledge base

│  └─ models/

│     └─ schemas.py              # Defines request/response models for API contracts

├─ data/                         # Sample CIS and SOC2 source files

├─ chroma_db/                    # Local vector store persistence

├─ tests/tf_samples/             # Terraform examples used for validation

└─ requirements.txt              # Python dependencies</pre>
<p>&nbsp;</p>
<p>In this structure, FastAPI exposes the service, the parser understands Terraform, the retriever brings compliance evidence, the LLM client generates structured findings, and the audit service ties everything together into one response.</p>
<h2>Where n8n Fits in the Automation Flow</h2>
<p>n8n is the workflow automation layer in this automation solution. It does not replace Azure DevOps, FastAPI, or the AI layer. Instead, n8n connects these systems and controls the end-to-end sequence from pull request trigger to audit notification.</p>
<p>The main value of n8n is orchestration. It receives the Azure DevOps PR event, extracts metadata, calls Azure DevOps APIs, applies conditions, loops through Terraform files, calls the audit backend, aggregates the results, and sends the final email notification. This makes the process easier to visualize, modify, and extend without hard-coding every integration into one application.</p>
<p>In the workflow, n8n also acts as the decision engine. If no Terraform files are found, n8n sends a SKIPPED notification. If the audit backend returns high-risk findings, n8n sends a FAILED notification. If the audit passes, n8n sends a PASSED notification. This branching logic turns raw automation into a usable audit process.</p>
<ul>
<li>Receives Azure DevOps PR events through a webhook.</li>
<li>Filters changed files and selects only Terraform .tf files.</li>
<li>Loops through one or many Terraform files in a PR.</li>
<li>Calls FastAPI to audit Terraform content.</li>
<li>Aggregates file-level findings into one PR-level result.</li>
<li>Sends a clear email notification to reviewers.</li>
</ul>
<p><img decoding="async" data-attachment-id="392134" data-permalink="https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/terra2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra2.png" data-orig-size="1037,519" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Terra2" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra2-1024x512.png" class="alignnone wp-image-392134 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/terra2-1024x512.png" alt="Terra2" width="1024" height="512" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/terra2-1024x512.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra2-300x150.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra2-768x384.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra2.png 1037w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h2>How the Automation Solution Works</h2>
<p>The automation solution connects several components into one automated flow. Azure DevOps provides the source repository and pulls request event. n8n receives the event and manages the workflow. FastAPI receives Terraform content and performs the audit logic. ChromaDB and RAG provide compliance context from CIS and SOC2 controls. Claude helps generate structured audit findings. The final result is delivered by email.</p>
<p>The workflow audits the actual Terraform content from the pull request commit, not a stale local file. This is important because the audit result should reflect the exact code being reviewed. The workflow also supports multiple Terraform files in one pull request, which makes it useful for realistic infrastructure changes.</p>
<p><img decoding="async" data-attachment-id="392135" data-permalink="https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/terra3/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra3.png" data-orig-size="1037,400" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Terra3" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra3-1024x395.png" class="alignnone wp-image-392135 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/terra3-1024x395.png" alt="Terra3" width="1024" height="395" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/terra3-1024x395.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra3-300x116.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra3-768x296.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra3.png 1037w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h3>Key n8n Workflow Logic</h3>
<p>The key workflow is the Azure DevOps PR Terraform Audit workflow. It receives a pull request event, extracts metadata, gets changed files, filters only .tf files, fetches file content, calls the audit backend, aggregates results, and sends the final notification.</p>
<ul>
<li>No Terraform files changed: send a SKIPPED notification.</li>
<li>One or more compliance findings detected: send a FAILED notification.</li>
<li>Terraform files audited with no high-risk finding: send a PASSED notification.</li>
</ul>
<h2>What the Automation Successfully Demonstrated</h2>
<p>The completed automation solution validated the end-to-end automation path. Azure DevOps PR events successfully triggered the n8n workflow. n8n identified changed files, filtered Terraform files, ignored non-Terraform changes, and handled multiple Terraform files in the same pull request. The FastAPI backend audited Terraform content and returned structured results. The workflow generated professional email notifications for PASS, FAIL, and SKIPPED outcomes.</p>
<p>The strongest scenario was a mixed pull request with one failing Terraform file, one passing Terraform file, and one README change. The workflow ignored the README file, audited both Terraform files, detected the failing resource, and generated one pull-request-level result. This proved the automation solution could support realistic review scenarios rather than only a simple single-file example.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="392136" data-permalink="https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/terra4/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra4.png" data-orig-size="664,308" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Terra4" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/terra4.png" class="alignnone wp-image-392136 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/terra4.png" alt="Terra4" width="664" height="308" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/terra4.png 664w, https://blogs.perficient.com/wp-content/uploads/2026/07/terra4-300x139.png 300w" sizes="auto, (max-width: 664px) 100vw, 664px" /></p>
<h2>Business and Engineering Benefits</h2>
<p>The main benefit of the automation solution is earlier feedback. Reviewers can see compliance issues before code is merged, which reduces the chance of deploying non-compliant infrastructure. It also reduces manual review effort by automating repetitive checks and surfacing only the relevant findings.</p>
<ul>
<li>Reduces late-stage compliance rework by checking Terraform during pull request review.</li>
<li>Improves consistency by applying the same audit logic across pull requests.</li>
<li>Provides evidence-backed findings using CIS and SOC2 context.</li>
<li>Uses AI to make audit results easier to understand and act on.</li>
<li>Supports realistic pull requests with multiple Terraform files and mixed file types.</li>
<li>Creates a reusable automation model for broader SDLC workflows.</li>
</ul>
<h2>Beyond Terraform Compliance</h2>
<p>Although this automation solution focused on Terraform audit, the automation pattern is reusable. The same model can support automated testing, deployment validation, security checks, PR quality gates, release approvals, audit evidence reporting, and team notifications. The real value is the pattern: integrate triggers, validation, execution, decisioning, and notification into a repeatable workflow.</p>
<p>As a next step, this automation solution can be extended by adding a full CIS Azure Benchmark dataset, broader SOC2 control mappings, Azure DevOps PR comments, merge gates, remediation suggestions, and a reporting dashboard. The AI and RAG layer can also be improved over time by adding richer compliance knowledge, historical findings, internal standards, and remediation guidance.</p>
<h2>Conclusion</h2>
<p>This automation solution shows that infrastructure compliance does not need to remain a manual or post-deployment activity. By combining Azure DevOps, n8n, FastAPI, RAG, CIS/SOC2 context, AI reasoning, and email notification, compliance feedback can be delivered earlier and in a format that reviewers can act on quickly.</p>
<p>The result is a practical shift-left audit flow: faster feedback, reduced manual effort, better audit readiness, and a reusable automation foundation for modern DevOps and cloud governance. Most importantly, the use of RAG and AI turns compliance automation from a simple rule-checking process into an intelligent, contextual, and reviewer-friendly experience.</p>
<p>The post <a href="https://blogs.perficient.com/shift-left-infrastructure-compliance-automation/">Shift-Left Infrastructure Compliance Automation</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-2217031205-1024x683.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392120</post-id>	</item>
		<item>
		<title>Why Your LLM Doesn&#8217;t Know Anything About Your Company And How RAG Fixes That</title>
		<link>https://blogs.perficient.com/why-your-llm-doesnt-know-anything-about-your-company-and-how-rag-fixes-that/</link>
		
		<dc:creator><![CDATA[Venkata Sreeram Murthy Gonella]]></dc:creator>
		<pubDate>Wed, 29 Jul 2026 19:05:30 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392101</guid>

					<description><![CDATA[<p>Series: Enterprise GenAI &#38; RAG Architecture — Part 1 of 5 The Problem Nobody Talks About Your organization has rolled out a new AI assistant.&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/why-your-llm-doesnt-know-anything-about-your-company-and-how-rag-fixes-that/">Why Your LLM Doesn&#8217;t Know Anything About Your Company And How RAG Fixes That</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em><strong>Series: </strong>Enterprise GenAI &amp; RAG Architecture — Part 1 of 5</em></p>
<h2><strong>The Problem Nobody Talks About</strong></h2>
<p>Your organization has rolled out a new AI assistant. Your team is excited. Someone asks it, “What is our leave policy?”. It responds quickly and confidently, but the answer misses the mark.</p>
<p>This does not mean the model is broken. It means the model only knows what it has been trained on and what information it can access at the moment of the request.</p>
<blockquote><p><strong>LLMs are trained on broad data sources up to a cutoff date. Unless they are connected to your enterprise content, they do not know your internal systems, policies, documents, or processes. </strong></p></blockquote>
<p>Think about everything an LLM may not know about your company:</p>
<ul>
<li>Your SharePoint intranet and HR policies</li>
<li>Your product documentation and release notes</li>
<li>Your Jira tickets and project history</li>
<li>Your internal PDFs, SOPs, and compliance documents</li>
<li>Any update that happened after the model&#8217;s training cutoff</li>
</ul>
<p>For consumer chatbots, this may not matter as much. For enterprise AI, it creates a clear need for trusted, company-specific context.</p>
<h2><strong>Enter RAG: Retrieval-Augmented Generation</strong></h2>
<p>RAG is the architecture pattern that solves this problem. The name tells you exactly what it does:</p>
<p><strong>Retrieval — </strong>Search your private enterprise knowledge base to find relevant content.</p>
<p><strong>Augmented — </strong>Add that content as context to the LLM&#8217;s prompt.</p>
<p><strong>Generation — </strong>Let the LLM generate an answer grounded in YOUR data.</p>
<p>Instead of relying solely on what the model was trained on, RAG dynamically fetches the right information at query time and hands it to the LLM. The result: accurate, current, enterprise-aware answers.</p>
<blockquote><p><strong>RAG is not a product. It is an architecture pattern. It works with GPT-4, Claude, Llama, and virtually any LLM.</strong></p></blockquote>
<h3><strong>A Simple Analogy</strong></h3>
<p>Imagine hiring a brilliant consultant who has read every book ever published but has never worked at your company. If you ask them about your internal processes, they&#8217;ll guess, improvise, or politely say they don&#8217;t know.</p>
<p>Now give that consultant access to your company&#8217;s document library before every meeting. They can look up the right information, cite the exact source, and give you a confident, accurate answer.</p>
<p>That&#8217;s RAG. The consultant is the LLM. The document library is your vector database.</p>
<h2><strong>How RAG Works — The Architecture</strong></h2>
<p>Every enterprise RAG system — whether built on Azure, AWS, or Oracle Cloud — follows the same five-stage architecture. The diagram below shows the complete flow from raw enterprise data to a grounded, cited answer.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="392114" data-permalink="https://blogs.perficient.com/why-your-llm-doesnt-know-anything-about-your-company-and-how-rag-fixes-that/enterprise_rag_architecture_high_res/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-scaled.png" data-orig-size="2560,1740" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Enterprise Rag Architecture High Res" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-1024x696.png" class="alignnone wp-image-392114 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-1024x696.png" alt="Enterprise Rag Architecture High Res" width="1024" height="696" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-1024x696.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-300x204.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-768x522.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-1536x1044.png 1536w, https://blogs.perficient.com/wp-content/uploads/2026/07/Enterprise_RAG_Architecture_high_res-2048x1392.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<pre><em>Figure 1: Enterprise RAG Architecture — 5-Stage Flow (Data Sources → Ingestion → Vector DB → RAG Layer → LLM Response)</em></pre>
<p><strong>Stage 1 — Data Sources</strong></p>
<p>Enterprise documents from SharePoint, websites, PDFs, Word files, and Jira are the raw knowledge base. These are ingested automatically whenever content changes.</p>
<p><strong>Stage 2 — Ingestion Pipeline</strong></p>
<p>Each document is extracted, cleaned, and split into small chunks (typically 512 tokens). Every chunk is then converted into a vector embedding — a list of numbers that encodes its semantic meaning — using an embedding model such as Azure OpenAI text-embedding-3-small, Amazon Titan, or OCI Embed.</p>
<p><strong>Stage 3 — Vector Database</strong></p>
<p>Each chunk, its embedding vector, and its metadata (source, page, date) are stored in a Vector Database. On Azure this is Azure AI Search; on AWS it is OpenSearch; on Oracle Cloud it is Oracle DB 23ai with native VECTOR support.</p>
<p><strong>Stage 4 — RAG Layer</strong></p>
<p>When a user asks a question, it is embedded using the same model. The vector database returns the Top-5 most semantically similar chunks. These are injected into the LLM prompt as grounding context.</p>
<p><strong>Stage 5 — LLM Response</strong></p>
<p>The LLM (GPT-4o, Claude, or Llama) generates an answer constrained to the retrieved context only. Every claim in the answer can be traced back to a source document — which helps reduce unsupported or inaccurate responses.</p>
<blockquote><p><strong>The LLM is instructed: &#8216;Answer ONLY using the provided context. If the context does not contain the answer, say so.&#8217; This instruction helps ensure responses stay grounded in provided information. </strong></p></blockquote>
<h3><strong>RAG Components at a Glance</strong></h3>
<table width="100%">
<thead>
<tr>
<td><strong>RAG Component</strong></td>
<td><strong>What It Does</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td>1. Data Sources</td>
<td>SharePoint, PDFs, Websites, Jira, Word Docs — your enterprise knowledge</td>
</tr>
<tr>
<td>2. Data Ingestion</td>
<td>Extract → Clean → Chunk (512 tokens) → Embed → Store</td>
</tr>
<tr>
<td>3. Vector Database</td>
<td>Stores all chunk embeddings, enables millisecond similarity search</td>
</tr>
<tr>
<td>4. RAG Layer</td>
<td>Retrieve Top-K context → Build grounded prompt → Call LLM</td>
</tr>
<tr>
<td>5. LLM Response</td>
<td>Generates accurate, cited answer from retrieved context only</td>
</tr>
<tr>
<td>Testing &amp; Evaluation</td>
<td>RAGAS, DeepEval, PromptFoo — validates quality at every stage</td>
</tr>
<tr>
<td>CI/CD Pipeline</td>
<td>Automates ingestion, evaluation, and deployment on every change</td>
</tr>
</tbody>
</table>
<h2><strong>Why This Matters for Enterprises</strong></h2>
<p>RAG is now the standard architecture for enterprise AI. Here is why organizations are adopting it at scale:</p>
<p><strong>Accuracy: </strong>Answers are grounded in real, current company data — not stale training data.</p>
<p><strong>No retraining required: </strong>Add new documents and they&#8217;re immediately searchable. No expensive fine-tuning.</p>
<p><strong>Source attribution: </strong>Every answer can cite which document it came from — enabling full auditability.</p>
<p><strong>Cost efficiency: </strong>Retrieval is cheap. You only send relevant chunks to the LLM, saving tokens.</p>
<p><strong>Data security: </strong>Your private data stays in your infrastructure — never sent to train external models.</p>
<blockquote><p><strong>RAG doesn&#8217;t replace the LLM&#8217;s intelligence. It gives the LLM the right information to be intelligent about YOUR business.</strong></p></blockquote>
<p><strong>What&#8217;s Coming in This Series</strong></p>
<p>This is part 1 of a 5-part series on building, deploying, and testing enterprise RAG systems:</p>
<p><strong><em><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" />  </em>In Part 2, we&#8217;ll walk through exactly how documents get ingested, chunked, and stored in a vector database — the foundation your RAG system&#8217;s quality depends on.</strong></p>
<p>The post <a href="https://blogs.perficient.com/why-your-llm-doesnt-know-anything-about-your-company-and-how-rag-fixes-that/">Why Your LLM Doesn&#8217;t Know Anything About Your Company And How RAG Fixes That</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-2284923048-1024x540.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392101</post-id>	</item>
		<item>
		<title>DeepEval vs Ragas vs LangSmith</title>
		<link>https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/</link>
		
		<dc:creator><![CDATA[Spandana Vanamala]]></dc:creator>
		<pubDate>Wed, 29 Jul 2026 15:53:45 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392054</guid>

					<description><![CDATA[<p>A QA Engineer&#8217;s Guide to Testing GenAI Applications  Testing software is no longer enough. In the age of generative AI, quality engineers must learn to test intelligence itself.  Executive&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/">DeepEval vs Ragas vs LangSmith</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2><span data-contrast="none">A QA Engineer&#8217;s Guide to Testing GenAI Applications</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<p><span data-contrast="auto">Testing software is no longer enough. In the age of generative AI, quality engineers must learn to test intelligence itself.</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p>
<h2><span data-contrast="none">Executive Summary</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<p><span data-contrast="auto">Generative AI is transforming enterprise software at an unprecedented pace.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Organizations are rapidly deploying:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><span data-contrast="auto">AI chatbots</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">AI-powered search systems</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Document assistants</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Coding copilots</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Autonomous AI agents</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Unlike traditional applications, generative AI systems are </span><b><span data-contrast="auto">non-deterministic</span></b><span data-contrast="auto">. The same prompt can produce multiple valid answers.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">This introduces new quality challenges, including:</span></p>
<ul>
<li><span data-contrast="auto">Response accuracy issues </span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Retrieval failures</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Prompt sensitivity</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Agent workflow failures</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Toxicity and bias</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Non-deterministic outputs</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">To address these challenges, organizations are increasingly turning to three widely adopted platforms for AI testing and evaluation:</span><span data-ccp-props="{}"> </span></p>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Tool</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">Primary Focus</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">Best For</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">DeepEval</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">LLM Evaluation</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Automated AI Testing</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Ragas</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">RAG Evaluation</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Retrieval Validation</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">LangSmith</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Observability &amp; Monitoring</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Agent Debugging</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h2><span class="TextRun SCXW101466456 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW101466456 BCX0" data-ccp-parastyle="heading 1">The Evolution of Software Testing</span></span><span class="EOP Selected SCXW101466456 BCX0" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<p><img loading="lazy" decoding="async" data-attachment-id="392063" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase1v2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase1v2.jpg" data-orig-size="715,274" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase1v2" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase1v2.jpg" class="alignnone wp-image-392063 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase1v2.jpg" alt="Phase1v2" width="715" height="274" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase1v2.jpg 715w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase1v2-300x115.jpg 300w" sizes="auto, (max-width: 715px) 100vw, 715px" /></p>
<h2>Phase 1: Manual Testing</h2>
<h3>Focus Areas:</h3>
<ul>
<li>Functional Validation</li>
<li>User Acceptance Testing</li>
<li>Defect Identification</li>
</ul>
<h2>Phase 2: Automation Testing</h2>
<p><strong>Popular Tools:</strong></p>
<ul>
<li>Selenium</li>
<li>JUnit</li>
<li>TestNG</li>
<li>Playwright</li>
</ul>
<h3>Focus Areas:</h3>
<ul>
<li>Regression Testing</li>
<li>CI/CD Integration</li>
<li>Cross-Browser Validation</li>
</ul>
<h2>Phase 3: AI-Assisted Testing</h2>
<p>AI started helping engineers generate:</p>
<ul>
<li>Test Cases</li>
<li>Test Data</li>
<li>Automation Scripts</li>
</ul>
<p>Popular Examples:</p>
<ul>
<li>GitHub Copilot</li>
<li>Cursor</li>
<li>ChatGPT</li>
</ul>
<h2>Phase 4: GenAI Testing</h2>
<p>The challenge is no longer generating tests.</p>
<p>The challenge is:</p>
<blockquote><p>How do we validate AI-generated responses?</p></blockquote>
<p>This is where evaluation frameworks become essential.</p>
<h2>Why Traditional Testing Fails for AI Systems</h2>
<h3>Traditional Software</h3>
<h3>Input</h3>
<p><img loading="lazy" decoding="async" data-attachment-id="392070" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase2.jpg" data-orig-size="709,106" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase2" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase2.jpg" class="alignnone wp-image-392070 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase2.jpg" alt="Phase2" width="709" height="106" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase2.jpg 709w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase2-300x45.jpg 300w" sizes="auto, (max-width: 709px) 100vw, 709px" /></p>
<h3><span class="TextRun SCXW252465953 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW252465953 BCX0" data-ccp-parastyle="heading 3">Expected Output</span></span><span class="EOP Selected SCXW252465953 BCX0" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="392071" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase3/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase3.jpg" data-orig-size="706,76" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase3" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase3.jpg" class="alignnone wp-image-392071 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase3.jpg" alt="Phase3" width="706" height="76" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase3.jpg 706w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase3-300x32.jpg 300w" sizes="auto, (max-width: 706px) 100vw, 706px" /></p>
<p><span class="TextRun SCXW3371495 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW3371495 BCX0">Simple and deterministic.</span></span><span class="EOP Selected SCXW3371495 BCX0" data-ccp-props="{}"> </span></p>
<h2><span data-contrast="none">Generative AI System</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">Question</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<blockquote><p><span data-contrast="auto">What are the benefits of opening a savings account?</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p></blockquote>
<h4><span data-contrast="none">Response A</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto"><strong>|</strong> A savings account helps you earn interest while safely storing your money.</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p>
<h4><span data-contrast="none">Response B</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto"><strong>|</strong> Savings accounts provide liquidity, security and interest earnings.</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p>
<ul>
<li data-leveltext="" data-font="Wingdings" data-listid="18" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Both responses are correct.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">This creates a new testing model:</span><span data-ccp-props="{}"> </span></p>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Traditional Testing</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">GenAI Testing</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Exact Match</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Quality Evaluation</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Pass / Fail</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Scored Metrics</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Assertions</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Relevance &amp; Accuracy</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Deterministic</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Probabilistic</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h2><span class="TextRun SCXW147713189 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW147713189 BCX0" data-ccp-parastyle="heading 1">Understanding the GenAI Quality Engineering Stack</span></span><span class="EOP Selected SCXW147713189 BCX0" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<p><img loading="lazy" decoding="async" data-attachment-id="392072" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase4/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase4.jpg" data-orig-size="712,579" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase4" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase4.jpg" class="alignnone wp-image-392072 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase4.jpg" alt="Phase4" width="712" height="579" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase4.jpg 712w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase4-300x244.jpg 300w" sizes="auto, (max-width: 712px) 100vw, 712px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="392073" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase5/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase5.jpg" data-orig-size="712,132" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase5" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase5.jpg" class="alignnone wp-image-392073 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase5.jpg" alt="Phase5" width="712" height="132" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase5.jpg 712w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase5-300x56.jpg 300w" sizes="auto, (max-width: 712px) 100vw, 712px" /></p>
<p><span class="TextRun SCXW141688683 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW141688683 BCX0">Each platform </span><span class="NormalTextRun SCXW141688683 BCX0">operates</span><span class="NormalTextRun SCXW141688683 BCX0"> at a different layer of the AI ecosystem.</span></span><span class="EOP Selected SCXW141688683 BCX0" data-ccp-props="{}"> </span></p>
<h2><span data-contrast="none">DeepEval: Bringing Unit Testing to LLM Applications</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<h2><span data-contrast="none">What is DeepEval?</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<p><span data-contrast="auto">DeepEval is often called:</span><span data-ccp-props="{}"> </span></p>
<blockquote><p><span data-contrast="auto">&#8220;PyTest for LLM Applications&#8221;</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p></blockquote>
<p><span data-contrast="auto">It allows QA teams to create automated evaluation suites for AI systems.</span><span data-ccp-props="{}"> </span></p>
<h2><span data-contrast="none">Core Evaluation Metrics</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Metric</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">Purpose</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Answer Relevancy</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Does the answer address the question?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Faithfulness</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Is the answer grounded in context?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Hallucination Detection</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Is unsupported information generated?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Toxicity</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Is the output harmful?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto"> Bias Detection</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Is the response fair and neutral?</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h2><span class="TextRun SCXW200558834 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW200558834 BCX0" data-ccp-parastyle="heading 2">Banking Chatbot Example</span></span></h2>
<p><img loading="lazy" decoding="async" data-attachment-id="392075" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase6/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase6.jpg" data-orig-size="706,216" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase6" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase6.jpg" class="alignnone wp-image-392075 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase6.jpg" alt="Phase6" width="706" height="216" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase6.jpg 706w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase6-300x92.jpg 300w" sizes="auto, (max-width: 706px) 100vw, 706px" /></p>
<p><span data-contrast="auto">DeepEval helps catch these issues before production.</span><span data-ccp-props="{}"> </span></p>
<h3><span data-contrast="none">Strengths</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Excellent Regression Testing</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">CI/CD Friendly</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Rich Evaluation Metrics</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Familiar with QA Engineers</span><span data-ccp-props="{}"> </span></li>
</ul>
<h3><span data-contrast="none">Limitations</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Requires Evaluation Datasets</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Limited Production Monitoring</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Basic Observability</span><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">Ragas: The Gold Standard for RAG Evaluation</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">What is RAG?</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">RAG stands for:</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Retrieval-Augmented Generation</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Instead of relying solely on model training data, the system retrieves relevant information before generating an answer.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="392076" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase7/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase7.jpg" data-orig-size="712,274" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase7" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase7.jpg" class="alignnone wp-image-392076 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase7.jpg" alt="Phase7" width="712" height="274" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase7.jpg 712w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase7-300x115.jpg 300w" sizes="auto, (max-width: 712px) 100vw, 712px" /></p>
<h2><span data-contrast="none">Example</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<p><span data-contrast="auto">Question:</span><span data-ccp-props="{}"> </span></p>
<blockquote><p><span data-contrast="auto">What is our refund policy?</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p></blockquote>
<p><span data-contrast="auto">Retrieved Sources:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><span data-contrast="auto">Refund Policy PDF</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Knowledge Base Articles</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Support Documentation</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Critical Question:</span><span data-ccp-props="{}"> </span></p>
<blockquote><p><span data-contrast="auto">Did the system retrieve the right information?</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p></blockquote>
<p><span data-contrast="auto">This is where Ragas shines.</span><span data-ccp-props="{}"> </span></p>
<h2><span data-contrast="none">Core Metrics</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Metric</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">Purpose</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Context Precision</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">How much retrieved content is relevant?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Context Recall</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Was important content retrieved?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Faithfulness</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Is response supported by sources?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Answer Relevancy</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Does the answer solve the question?</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h3><span data-contrast="none">Strengths</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Purpose Built for RAG</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Open Source</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Industry Adoption</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Powerful Retrieval Metrics</span><span data-ccp-props="{}"> </span></li>
</ul>
<h3><span data-contrast="none">Limitations</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Limited Agent Testing</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Minimal Observability</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Mainly RAG-Focused</span><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">LangSmith: Observability for AI Systems</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">Why LangSmith?</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Imagine an AI Agent receives this request:</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto"><strong>|</strong> Create a Jira defect and send a Slack notification.</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p>
<p><span data-contrast="auto">The agent will:</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="392077" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase8/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase8.jpg" data-orig-size="709,355" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase8" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase8.jpg" class="alignnone wp-image-392077 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase8.jpg" alt="Phase8" width="709" height="355" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase8.jpg 709w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase8-300x150.jpg 300w" sizes="auto, (max-width: 709px) 100vw, 709px" /></p>
<p><span data-contrast="auto">If something fails, identifying the root cause becomes difficult.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">LangSmith provides full execution visibility.</span><span data-ccp-props="{}"> </span></p>
<h2><span data-contrast="none">What LangSmith Tracks</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Capability</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">Description</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Prompt Traces</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Every LLM interaction</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Agent Execution</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Decision Flow Tracking</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Tool Calls</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">External API Visibility</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Monitoring</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Production Insights</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Dataset Management</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Evaluation Dataset Storage</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h3><span data-contrast="none">Strengths</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Exceptional Observability</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Agent Debugging</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Root Cause Analysis</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Production Monitoring</span><span data-ccp-props="{}"> </span></li>
</ul>
<h3><span data-contrast="none">Limitations</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Fewer Evaluation Metrics</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Advanced Features May Require Paid Plans</span><span data-ccp-props="{}"> </span></li>
</ul>
<h2 data-ccp-border-top="2px solid #000000" data-ccp-padding-top="0px"><span data-contrast="none">Head-to-Head Comparison</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:0,&quot;335572071&quot;:12,&quot;335572072&quot;:0,&quot;335572073&quot;:4278190080,&quot;469789798&quot;:&quot;single&quot;}"> </span></h2>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Feature</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">DeepEval</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">Ragas</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">LangSmith</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">LLM Evaluation</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">RAG Evaluation</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Hallucination Detection</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Faithfulness</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Agent Testing</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Tracing</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Monitoring</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">QA Friendly</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h2><span data-contrast="none">Which Tool Should QA Teams Choose?</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">If You&#8217;re Testing LLM Applications</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<h3><span data-contrast="none">       &gt; Choose DeepEval</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Best for:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><span data-contrast="auto">Prompt Regression Testing</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Hallucination Detection</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Automated Quality Validation</span><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">If You&#8217;re Testing RAG Systems</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">     &gt; Choose Ragas</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Best for:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><span data-contrast="auto">Retrieval Evaluation</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Knowledge Assistants</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Enterprise Search Solutions</span><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">If You&#8217;re Testing AI Agents</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">    &gt; Choose LangSmith</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Best for:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><span data-contrast="auto">Agent Debugging</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Tool Call Visibility</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Production Monitoring</span><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">Enterprise Recommendation</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<p><span data-contrast="auto">The most mature organizations use all three together.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="392080" data-permalink="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/phase9/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase9.jpg" data-orig-size="709,213" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Phase9" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/phase9.jpg" class="alignnone wp-image-392080 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/phase9.jpg" alt="Phase9" width="709" height="213" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/phase9.jpg 709w, https://blogs.perficient.com/wp-content/uploads/2026/07/phase9-300x90.jpg 300w" sizes="auto, (max-width: 709px) 100vw, 709px" /></p>
<h2><span data-contrast="none">Traditional QA vs GenAI QA</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<table data-tablestyle="MsoTable15Grid4Accent1" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Traditional QA</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><b><span data-contrast="auto">GenAI QA</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Test Cases</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Evaluation Datasets</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Assertions</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Evaluation Metrics</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Regression Suite</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Prompt Regression Suite</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Defects</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Hallucinations</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Application Logs</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Agent Traces</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4369"><b><span data-contrast="auto">Test Automation Framework</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="4369"><span data-contrast="auto">Evaluation Pipeline</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h2 data-ccp-border-top="2px solid #000000" data-ccp-padding-top="0px"><span data-contrast="none">The Future of AI Testing</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:0,&quot;335572071&quot;:12,&quot;335572072&quot;:0,&quot;335572073&quot;:4278190080,&quot;469789798&quot;:&quot;single&quot;}"> </span></h2>
<p><span data-contrast="auto">Over the next 3 years, we are likely to see:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><span data-contrast="auto">Autonomous testing agents</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Continuous LLM evaluation</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Synthetic evaluation dataset generation</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">AI governance platforms</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Agent observability frameworks</span><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Dedicated AI quality engineering teams</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">The future of testing is moving beyond software validation to intelligence validation.</span><span data-ccp-props="{&quot;335559685&quot;:180,&quot;335572083&quot;:18,&quot;335572084&quot;:4,&quot;335572085&quot;:10921638,&quot;469789810&quot;:&quot;single&quot;}"> </span></p>
<h2 data-ccp-border-top="2px solid #000000" data-ccp-padding-top="0px"><span data-contrast="none">Recommended Learning Resources</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:0,&quot;335572071&quot;:12,&quot;335572072&quot;:0,&quot;335572073&quot;:4278190080,&quot;469789798&quot;:&quot;single&quot;}"> </span></h2>
<h2><span data-contrast="none">Official Documentation</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<ul>
<li><span data-contrast="auto">DeepEval Documentation: </span><a href="https://deepeval.com/docs"><span data-contrast="none">https://deepeval.com/docs</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Ragas Documentation: </span><a href="https://docs.ragas.io/en/latest/"><span data-contrast="none">https://docs.ragas.io/en/latest/</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">LangSmith Documentation: </span><a href="https://docs.smith.langchain.com/"><span data-contrast="none">https://docs.smith.langchain.com/</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">YouTube Tutorials (Hands-on Use Cases)</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h2>
<h3><span data-contrast="none">DeepEval</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">RAG Evaluation Using DeepEval &amp; Confident AI (Full Tutorial) – </span><a href="https://www.youtube.com/watch?v=402EyLS59ho"><span data-contrast="none">https://www.youtube.com/watch?v=402EyLS59ho</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">DeepEval Tutorial: Unit Testing LLM AI Applications – </span><a href="https://www.youtube.com/watch?v=ZHiJ12MhfQ8"><span data-contrast="none">https://www.youtube.com/watch?v=ZHiJ12MhfQ8</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">Evaluate LLMs in Python with DeepEval – </span><a href="https://www.youtube.com/watch?v=HAoKJT3af7Y"><span data-contrast="none">https://www.youtube.com/watch?v=HAoKJT3af7Y</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<h3><span data-contrast="none">Ragas</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">RAG Evaluation Metrics Tutorial using RAGAS – </span><a href="https://www.youtube.com/watch?v=f8zMrSysnjY"><span data-contrast="none">https://www.youtube.com/watch?v=f8zMrSysnjY</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">How to Evaluate RAG Models Using RAGAS (Step-by-Step) – </span><a href="https://www.youtube.com/watch?v=ahDqIQb3\_8w"><span data-contrast="none">https://www.youtube.com/watch?v=ahDqIQb3\_8w</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">RAGAS: Evaluate a RAG Application Like a Pro – </span><a href="https://www.youtube.com/watch?v=5fp6e5nhJRk"><span data-contrast="none">https://www.youtube.com/watch?v=5fp6e5nhJRk</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<h3><span data-contrast="none">LangSmith</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<ul>
<li><span data-contrast="auto">Getting Started with LangSmith: Tracing – </span><a href="https://www.youtube.com/watch?v=fA9b4D8IsPQ"><span data-contrast="none">https://www.youtube.com/watch?v=fA9b4D8IsPQ</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">LangSmith Tutorial: Observability and Tracing for AI Agents – </span><a href="https://www.youtube.com/watch?v=EdzAH5\_PppM"><span data-contrast="none">https://www.youtube.com/watch?v=EdzAH5\_PppM</span></a><span data-ccp-props="{}"> </span></li>
<li><span data-contrast="auto">LangSmith + LangChain: Full AI Agent Tracing &amp; Debugging Tutorial – </span><a href="https://www.youtube.com/watch?v=DmEEZ2TiKfY"><span data-contrast="none">https://www.youtube.com/watch?v=DmEEZ2TiKfY</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<h2><span data-contrast="none">Final Thoughts</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h2>
<p><span data-contrast="auto">Generative AI introduces a new set of different quality considerations.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Traditional testing frameworks remain important, but they are no longer sufficient on their own:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li><b><span data-contrast="auto">DeepEval</span></b><span data-contrast="auto"> helps validate LLM quality.</span><span data-ccp-props="{}"> </span></li>
<li><b><span data-contrast="auto">Ragas</span></b><span data-contrast="auto"> ensures retrieval systems work correctly.</span><span data-ccp-props="{}"> </span></li>
<li><b><span data-contrast="auto">LangSmith</span></b><span data-contrast="auto"> provides visibility into complex AI workflows.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">For modern QA engineers, understanding these platforms is rapidly becoming a core skill rather than a nice-to-have capability.</span><span data-ccp-props="{}"> </span></p>
<p>The post <a href="https://blogs.perficient.com/deepeval-vs-ragas-vs-langsmith/">DeepEval vs Ragas vs LangSmith</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-1180547354-1024x561.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392054</post-id>	</item>
		<item>
		<title>Pix: How Brazil’s Instant Payment Revolution Is Reshaping Digital Commerce</title>
		<link>https://blogs.perficient.com/pix-how-brazils-instant-payment-revolution-is-reshaping-digital-commerce/</link>
		
		<dc:creator><![CDATA[Carl Aridas]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 16:17:48 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392090</guid>

					<description><![CDATA[<p>In just a few years, Pix has transformed from a new payment initiative in South America into the dominant digital payment method in Brazil. Created and operated by BCH, Pix enables instant,&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/pix-how-brazils-instant-payment-revolution-is-reshaping-digital-commerce/">Pix: How Brazil’s Instant Payment Revolution Is Reshaping Digital Commerce</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="auto">In just a few years, Pix has transformed from a new payment initiative in South America into the dominant digital payment method in Brazil. Created and operated by BCH, Pix enables instant, 24/7 money transfers and payments, fundamentally changing how consumers, businesses, and financial institutions exchange the Brazilian Real.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pix already processes 42% of the total online purchases made in Brazil and is anticipated to have 50% of the total ecommerce economy in Brazil by 2028.</span><span data-ccp-props="{}"> </span></p>
<h2><b><span data-contrast="none">What Is Pix?</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:200,&quot;335559739&quot;:0}"> </span></h2>
<p><span data-contrast="auto">Pix is a Brazilian instant payment ecosystem designed to allow individuals and businesses to send and receive money in seconds, regardless of the time of day. Users can initiate payments through mobile banking applications using a phone number, email address, taxpayer identification number, random key, or even a QR code. The government supported platform supports person-to-person transfers, retail purchases, bill payments, payroll distributions, insurance settlements, and gig-economy payouts.</span><span data-ccp-props="{}"> </span></p>
<h2><b><span data-contrast="none">Pix vs. Other Payment Platforms</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:200,&quot;335559739&quot;:0}"> </span></h2>
<p><span data-contrast="none">The table below compares Brazil&#8217;s Pix payment system with UPI, Zelle, PayPal, and Visa/Mastercard across key dimensions including speed, cost, accessibility, and adoption.</span><span data-ccp-props="{}"> </span></p>
<table data-tablestyle="MsoTableGrid" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="4097"><b><span data-contrast="auto">Feature</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="1"><b><span data-contrast="auto">Pix </span></b><b style="font-family: inherit;font-size: inherit"><span data-contrast="auto">(Brazil)</span></b><span style="font-family: inherit;font-size: inherit" data-ccp-props="{}"> </span></td>
<td data-celllook="1"><b><span data-contrast="auto">UPI </span></b><b style="font-family: inherit;font-size: inherit"><span data-contrast="auto">(India)</span></b><span style="font-family: inherit;font-size: inherit" data-ccp-props="{}"> </span></td>
<td data-celllook="1"><b><span data-contrast="auto">Zelle </span></b><b style="font-family: inherit;font-size: inherit"><span data-contrast="auto">(US)</span></b><span style="font-family: inherit;font-size: inherit" data-ccp-props="{}"> </span></td>
<td data-celllook="1"><b><span data-contrast="auto">PayPal</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="17"><b><span data-contrast="auto">Visa/</span></b><b><span data-contrast="auto">Mastercard</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4096"><b><span data-contrast="auto">Settlement Speed</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Seconds</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Seconds</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Minutes-hours</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Instant/</span><span data-contrast="auto">varies</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="16"><span data-contrast="auto">1-3 business days</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4096"><b><span data-contrast="auto">Available 24/7</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="16"><span data-contrast="auto">Authorization only</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4096"><b><span data-contrast="auto">QR Payments</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Limited</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Yes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="16"><span data-contrast="auto">Merchant dependent</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4096"><b><span data-contrast="auto">Consumer Cost</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Typically </span><span data-contrast="auto">free</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Free</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Free</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">May include fees</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="16"><span data-contrast="auto">Indirect</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="4352"><b><span data-contrast="auto">Merchant Cost</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="256"><span data-contrast="auto">Low</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="256"><span data-contrast="auto">Low</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="256"><span data-contrast="auto">Limited use</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="256"><span data-contrast="auto">Moderate</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="272"><span data-contrast="auto">Higher interchange</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<h2><b><span data-contrast="none">The Drivers Behind Pix’s Success</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:200,&quot;335559739&quot;:0}"> </span></h2>
<p><span data-contrast="auto">The biggest reason for Pix’s success was that the Brazilian government regulators wanted it to. In a rather pro-consumer and proactive decision, on November 16, 2020 (</span><b><i><span data-contrast="auto">less than 6 years ago</span></i></b><span data-contrast="auto">) the Central Bank of Brazil &#8211; Banco Central do Brasil (BCB) launched the instant payment system. Most significantly, BCB required major financial institutions to participate, ensuring broad availability from day one. </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Because nearly every bank and fintech supported Pix, network effects grew rapidly. From the start, Pix eliminated many of the delays and fees associated with traditional bank transfers. The free, quick settlement encouraged millions of Brazilian citizens to open and use bank accounts, meaning a positive unintended consequence of bringing more Brazilians into the formal financial system as it spread beyond just wealthier urban areas in Brazil. Pix was adopted by over 62% of Brazil&#8217;s population within a year. Its accessibility helped it spread beyond affluent urban users.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">From a merchant perspective, merchants pay less than they would for many card transactions because Pix bypasses much of the traditional card-payment chain. Of more significance, the real time settlement improves the cashflows of the merchants, as they do not have to wait until the following month to receive their net Interchange proceeds from multiple card issuers. This lowers the working capital costs of businesses.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">To avoid stagnation, BCB has continued to improve and enhance Pix’s capabilities through new features such as recurring payments, stronger security mechanisms, QR code innovations, and integrations with Brazil’s Open Finance ecosystem.</span><span data-ccp-props="{}"> </span></p>
<h2><b><span data-contrast="none">The Result</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:200,&quot;335559739&quot;:0}"> </span></h2>
<p><span data-contrast="auto">Pix achieved adoption at a scale rarely seen in payments:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Roughly 170 million users, about 80% of Brazil&#8217;s population, use the system. </span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">It accounts for more than half of all transactions in Brazil by volume. </span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Per Reuters, Pix surpassed the combined number of credit and debit card transactions in Brazil within three calendar years of launch. </span><span data-ccp-props="{}"> </span></li>
</ul>
<h2><b><span data-contrast="none">Conclusion</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:200,&quot;335559739&quot;:0}"> </span></h2>
<p><span data-contrast="auto">Pix has attracted worldwide attention as a model for real-time payments. Policymakers and financial institutions across the globe study its success as they seek to modernize payment infrastructure, promote competition, and accelerate financial inclusion.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pix represents far more than a payment platform. It is a transformative digital infrastructure that has reshaped commerce and financial services in Brazil through speed, accessibility, low cost, and continuous innovation. As countries increasingly move toward real-time payments, Pix offers a compelling regional blueprint for the future of digital transactions.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">If you are interested in speaking with one of Perficient’s payment experts, reach out to us </span><a href="https://www.perficient.com/contact-us">here</a><i><span data-contrast="none">.</span></i><span data-ccp-props="{}"> </span></p>
<p>The post <a href="https://blogs.perficient.com/pix-how-brazils-instant-payment-revolution-is-reshaping-digital-commerce/">Pix: How Brazil’s Instant Payment Revolution Is Reshaping Digital Commerce</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-1306105191-1024x683.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392090</post-id>	</item>
		<item>
		<title>At the Speed of Content: Adobe’s Lightning Fast Product Offerings</title>
		<link>https://blogs.perficient.com/at-the-speed-of-content-adobes-lightning-fast-product-offerings/</link>
		
		<dc:creator><![CDATA[Paul Goodrich]]></dc:creator>
		<pubDate>Thu, 23 Jul 2026 15:27:55 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392038</guid>

					<description><![CDATA[<p>It’s an exciting time to be in the digital marketing space. The rise of agentic AI means that you can deliver targeted, relevant content faster&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/at-the-speed-of-content-adobes-lightning-fast-product-offerings/">At the Speed of Content: Adobe’s Lightning Fast Product Offerings</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>It’s an exciting time to be in the digital marketing space. The rise of agentic AI means that you can deliver targeted, relevant content faster than ever before. However, with this growth also comes pressure to move quickly when selecting a content platform. You can generate all of this content, but where are you going to store it, and how are you going to deliver it?</p>
<p>Adobe Experience Manager continues to lead the enterprise content management space, combining proven enterprise-grade tooling with flexible delivery, powerful extensibility, and dependable performance. But leadership doesn’t stand still. Newer Adobe Experience Manager offerings embrace a highly flexible and scalable serverless architecture, built from the ground up and crafted from Adobe’s 20+ years of content management experience. Adobe has been working diligently on a new delivery architecture that leverages edge-based scaling and recommends serverless edge workers in place of application servers and services. This solution is called Edge Delivery Services (EDS).</p>
<p>“Wait, I thought EDS was document authoring?”</p>
<p>Not necessarily. The important thing to understand about Edge Delivery Services is that, as its name suggests, the solution is primarily a change in the content delivery tier. That in turn, once you adopt it, you’re faced with a new set of decisions to make about where you want to store the content and which UI you want to use to author it.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="392048" data-permalink="https://blogs.perficient.com/at-the-speed-of-content-adobes-lightning-fast-product-offerings/eds-updated-2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1.png" data-orig-size="1428,823" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Eds Updated" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1-1024x590.png" class="alignnone wp-image-392048 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1-1024x590.png" alt="Eds Updated" width="1024" height="590" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1-1024x590.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1-300x173.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1-768x443.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/eds-updated-1.png 1428w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>When you move to EDS, you always have the same Adobe-managed Delivery and Services tiers, but you can bring your own CDN to sit on top of them and the tiers that come before are flexible. When we talk about the Platform tier, there are two primary content store and management options.</p>
<ol>
<li><strong>Document Authoring</strong><br />
This newer approach can use Adobe’s DA.live product, Google Docs, or SharePoint as a content store. (You may recognize DA.live by its previous names &#8212; Dark Alley, Project Franklin, or Project Helix.) Adobe heavily recommends DA.live and Document Authoring via Experience Workspace for new AEM implementations.</li>
<li><strong>AEM as a Cloud Service (XWalk)</strong><br />
When AEMaaCS is used in EDS, it’s called AEM XWalk (crosswalk). It continues to have all of the content storage and management benefits of AEM as a Cloud Service, but the content is delivered quite differently. Instead of the traditional approach where web requests come to the AEM Publish instance via Apache Sling, Adobe’s Edge Delivery Service constructs a traditional HTML hierarchy and serves it at the CDN. There’s no more Sling resource mapping and page compilation at the time of an end user’s request.</li>
</ol>
<p>Now, to further paint this picture, I think it’s helpful to compare pieces of the classic AEM headful stack and their equivalent headful options in the Edge Delivery Services model.</p>
<table>
<tbody>
<tr>
<td width="123"><strong>Stack Capability</strong></td>
<td width="182"><strong>Headful AEM</strong></td>
<td width="150"><strong>EDS &#8211; XWalk</strong></td>
<td width="168"><strong>EDS – Document Authoring</strong></td>
</tr>
<tr>
<td width="123">Content Store</td>
<td width="182">Java Content Repository</td>
<td width="150">Java Content Repository</td>
<td width="168">DA.live, Google Docs, or SharePoint. Hierarchical document structure.</td>
</tr>
<tr>
<td width="123">Data Models</td>
<td width="182">Sling Models</td>
<td width="150">Block model json</td>
<td width="168">Block model json + Javascript + CSS</td>
</tr>
<tr>
<td width="123">Rendering</td>
<td width="182">HTL Scripts + Javascript + CSS</td>
<td width="150">Block model json + Javascript + CSS</td>
<td width="168">Block model json + Javascript + CSS</td>
</tr>
<tr>
<td width="123">Component-level Authoring</td>
<td width="182">AEM Touch UI Dialog XML</td>
<td width="150">Universal Editor authoring panel.  Uses AEM Blocks json definitions.</td>
<td width="168">DA.live document authoring, Google Docs, SharePoint docs, OR Universal Editor.  All use AEM Blocks json definitions.</td>
</tr>
<tr>
<td width="123">Page Editing</td>
<td width="182">AEM Page Editor</td>
<td width="150">Universal Editor</td>
<td width="168">DA.live document authoring, Google Docs, SharePoint docs, OR Universal Editor.</td>
</tr>
<tr>
<td width="123">Page Management</td>
<td width="182">AEM Sites Admin</td>
<td width="150">AEM Sites Admin</td>
<td width="168">DA.live document folders, Google Docs folders, SharePoint folders.</td>
</tr>
<tr>
<td width="123">Delivery Tier</td>
<td width="182">Publish server + Dispatcher + Fastly CDN + BYO CDN (optional)</td>
<td width="150">Fastly CDN + BYO CDN (optional) for content HTML.  Product bus or edge workers for data.</td>
<td width="168">Fastly CDN + BYO CDN (optional) for content HTML. Product bus or edge workers for data.</td>
</tr>
<tr>
<td width="123">Routing</td>
<td width="182">Dispatcher + Apache Sling</td>
<td width="150">Fastly CDN + BYO CDN (optional)</td>
<td width="168">Fastly CDN + BYO CDN (optional)</td>
</tr>
<tr>
<td width="123">Caching</td>
<td width="182">Dispatcher + Fastly CDN + BYO CDN (optional)</td>
<td width="150">Fastly CDN + BYO CDN (optional)</td>
<td width="168">Fastly CDN + BYO CDN (optional)</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>As Adobe has moved to a more decoupled architecture, you may have noticed that the number of options per stack capability has also grown. This is important as selecting a platform type forces you into a set of content stores, which then forces you into a set of compatible authoring UIs.</p>
<p>Before you do anything else, you need to decide if you want a Headful or Headless AEM implementation. If you’re not sure how to decide, I recommend my <a href="https://blogs.perficient.com/headful-or-headless-aem-revisited-for-2026/">previous blog on the topic</a>.</p>
<p>One important amendment based on insights from Adobe Summit is that Adobe is making a large investment in agentic AI and tooling for the experience layer. While choosing headless will decouple the CMS from the presentation layer and have a higher degree of freedom, you’re also <strong>limiting Adobe’s ability to add value at the presentation layer. </strong>New presentation-layer features and agents will only work in a headful experience.</p>
<p>With user-driven web experiences on the horizon, this is an increasingly important consideration. You may ultimately find it more valuable to cater to user interests with adaptable, personalized experience rendering than stick with traditional business-driven experiences.</p>
<p>Once you’ve made the Headful vs Headless call, the next set of capability decisions becomes clearer.</p>
<h2>Headful Decisions</h2>
<p>If you decide on a headful approach, you’re implicitly picking EDS. From there you decide between XWalk or Document Authoring as the content source. While the exact pros and cons of each solution are beyond the scope of this blog post, I will offer a few light comparisons.</p>
<p><strong>1. XWalk</strong> utilizes all of the existing AEM content management tooling, security, workflows, WYSIWYG authoring, and content policy controls.</p>
<p><strong>2. Document Authoring</strong> focuses on author empowerment in the document-style authoring that most users already understand.</p>
<h3>Decision &#8211; Headful with XWalk</h3>
<p>If you decide on XWalk, the AEMaaCS Java Content Repository will be your primary content authoring store, just like in a traditional AEMaaCS implementation. The AEM Sites Admin will continue to manage your page content. What changes are the following:</p>
<ul>
<li>You will need to utilize <strong>AEM blocks</strong> instead of Touch UI components</li>
<li><strong>Universal Editor</strong> will be your primary component and page editor.</li>
</ul>
<h3>Decision &#8211; Headful with Document Authoring</h3>
<p>If you decide on Document Authoring, you have several choices for a primary content authoring store. I highly recommend DA.live as the primary source as it contains CMS tooling, though you may have existing documents in Google Docs and SharePoint you want to integrate. Document Authoring implementations require AEM blocks. Then you have a choice about how your authors edit content:</p>
<ol>
<li>Edit directly in the <strong>Document UI.</strong></li>
<li>Edit in <strong>Universal Editor</strong> for a more WYSIWYG experience.</li>
</ol>
<h2>Headless Decisions</h2>
<p>If you decide on a headless approach, you have a different series of decisions to make. Both the AEMaaCS JCR and Document Authoring can be a headless content store. As I said earlier, the exact pros and cons of each headless solution are beyond the scope of this blog post, so let’s focus on the subsequent decisions.</p>
<h3>Decision &#8211; Headless with AEMaaCS</h3>
<p>If you decide to use AEMaaCS, do you utilize:</p>
<ol>
<li>Content fragments</li>
<li>Page-based resources</li>
<li>Both?</li>
</ol>
<p>I covered these pros and cons in <a href="https://blogs.perficient.com/implementing-headless-page-based-authoring-in-adobes-universal-editor-part-2/">my last blog post.</a> If you use page-based resources, you will always use the Universal Editor as the authoring UI. If you use content fragments, you will use the content fragment editor and optionally the Universal Editor if you want WYSWYG-style authoring.</p>
<p>Now, there’s one caveat with AEMaaCS to be aware of. If you use page-based resources, as of mid-2026, there is no OOTB schema definition available for AEM Blocks (EDS-style components).  If you want small headless payloads, you will have to utilize classic Sling Models as described in my last blog post or develop a custom solution.</p>
<h3>Decision &#8211; Headless with Document Authoring</h3>
<p>If you decide on a headless approach with Document Authoring, I would highly encourage you to use DA.live and not Google or SharePoint. In a headless use case, you need a schema-based JSON export. Of the previously mentioned document stores, only DA.live offers that out of the box. Document Authoring implementations require AEM blocks implementations. Then you have a choice to make about how your authors edit content. You can have them edit directly in the document view or utilize the Universal Editor for a more WYSIWYG experience.</p>
<h2>Wrap-up</h2>
<p>With an increasingly decoupled AEM architecture, there are more options than ever before to meet the needs of your organization. Still need help deciding? Be on the lookout for a future blog post that walks through the paradigm shift that is Document Authoring. Or reach out directly! For more information on how Perficient can implement your dream digital experiences, we’d love to hear from you. We’re certified by Adobe for our proven capabilities, and we hold an <strong>Adobe Experience Manager specialization</strong> (<em>among others</em>).</p>
<p><a href="https://www.perficient.com/contact"><strong>Contact Perficient to start your journey</strong></a><strong>.</strong></p>
<p>The post <a href="https://blogs.perficient.com/at-the-speed-of-content-adobes-lightning-fast-product-offerings/">At the Speed of Content: Adobe’s Lightning Fast Product Offerings</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-1929775959-1024x512.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392038</post-id>	</item>
		<item>
		<title>JMeter Performance Testing</title>
		<link>https://blogs.perficient.com/jmeter-performance-testing/</link>
		
		<dc:creator><![CDATA[Pawan Akre]]></dc:creator>
		<pubDate>Wed, 22 Jul 2026 16:45:09 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=391915</guid>

					<description><![CDATA[<p>#1. What is JMeter? JMeter is a free tool made by Apache that helps you test how well your website, app, or API performs when&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/jmeter-performance-testing/">JMeter Performance Testing</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>#1. What is JMeter?</strong></p>
<p>JMeter is a free tool made by Apache that helps you test how well your website, app, or API performs when lots of people use it at the same time. It acts like many users hitting your system all at once to see how it handles the pressure.</p>
<p>It’s great for testing:</p>
<ul>
<li>Websites and web apps</li>
<li>REST and SOAP APIs</li>
<li>Databases</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391916" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter1/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1.png" data-orig-size="1215,378" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter1" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1-1024x319.png" class="alignnone wp-image-391916 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1-1024x319.png" alt="Jmeter1" width="1024" height="319" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1-1024x319.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1-300x93.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1-768x239.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter1.png 1215w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>&nbsp;</p>
<p>Other services like FTP, JMS, LDAP (though most people use it for web and API testing). JMeter runs on Java, so make sure you have Java installed — version 8 or higher (Java 17+ is even better). The latest version of JMeter is around 5.6.3.</p>
<p><strong>#2. Apache JMeter Working</strong></p>
<p>JMeter is a Java based application or tool that simulates a group of users and sends requests to a target server. And hence, return statistics which show the functionality and performance of the server.</p>
<p>Working of Apache JMeter is explained in the image below:</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391917" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2.png" data-orig-size="1346,747" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter2" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2-1024x568.png" class="alignnone wp-image-391917 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2-1024x568.png" alt="Jmeter2" width="1024" height="568" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2-1024x568.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2-300x166.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2-768x426.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter2.png 1346w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p><strong>#3. JMeter Test Plan Structure</strong></p>
<p>Everything in JMeter lives inside a <strong>Test Plan</strong> — think of it as your test notebook.</p>
<p>Basic tree structure looks like this (from top to bottom):</p>
<ul>
<li><strong>Test Plan</strong> (the root / main folder)
<ul>
<li><strong>Thread Group</strong> (your virtual users — most important!)
<ul>
<li><strong>Samplers</strong> (what action each user does — e.g. HTTP Request to open google.com)</li>
<li><strong>Logic Controllers</strong> (if/loop/while — optional for now)</li>
<li><strong>Pre/Post Processors</strong> (prepare or clean data — optional)</li>
<li><strong>Assertions</strong> (check if response is correct — optional)</li>
<li><strong>Timers</strong> (add think time between clicks — very useful!)</li>
<li><strong>Config Elements</strong> (HTTP Header Manager, Cookies, etc.)</li>
</ul>
</li>
<li><strong>Listeners</strong> (how you see results — tables, graphs, reports)</li>
</ul>
</li>
</ul>
<p>Most beginners start with just: Test Plan → Thread Group → HTTP Request → Listener.</p>
<p><strong>#4. Create Your First Test Plan (Step-by-Step)</strong></p>
<p><strong>Step 1: Download and open JMeter</strong></p>
<ol>
<li>Download JMeter from the official Apache page:<br />
<a href="https://jmeter.apache.org/download_jmeter.cgi">https://jmeter.apache.org/download_jmeter.cgi</a></li>
<li>Download the <strong>binary</strong> file (ZIP or TGZ). For example, <strong>Apache JMeter 5.6.3</strong> has both apache-jmeter-5.6.3.zip and apache-jmeter-5.6.3.tgz.</li>
<li>Unzip / extract it anywhere on your machine.<img loading="lazy" decoding="async" data-attachment-id="391918" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter3/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter3.png" data-orig-size="624,254" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter3" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter3.png" class="alignnone wp-image-391918 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter3.png" alt="Jmeter3" width="624" height="254" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter3.png 624w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter3-300x122.png 300w" sizes="auto, (max-width: 624px) 100vw, 624px" /></li>
<li>Open the <strong>bin</strong> folder:
<ol>
<li>Windows: double‑click jmeter.bat</li>
<li>Mac/Linux: run jmeter.sh<br />
<img loading="lazy" decoding="async" data-attachment-id="391919" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter4/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter4.png" data-orig-size="624,448" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter4" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter4.png" class="alignnone wp-image-391919 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter4.png" alt="Jmeter4" width="624" height="448" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter4.png 624w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter4-300x215.png 300w" sizes="auto, (max-width: 624px) 100vw, 624px" /></li>
</ol>
</li>
<li>JMeter GUI opens and you will see a blank <strong>Test Plan</strong>.</li>
</ol>
<p><img loading="lazy" decoding="async" data-attachment-id="391920" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter5/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter5.png" data-orig-size="717,375" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter5" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter5.png" class="alignnone wp-image-391920 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter5.png" alt="Jmeter5" width="717" height="375" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter5.png 717w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter5-300x157.png 300w" sizes="auto, (max-width: 717px) 100vw, 717px" /></p>
<p><strong>Step 2: Add a Thread Group (users)</strong></p>
<ol>
<li>Right‑click <strong>Test Plan</strong> → <strong>Add</strong> → <strong>Threads (Users)</strong> → <strong>Thread Group</strong></li>
</ol>
<p><img loading="lazy" decoding="async" data-attachment-id="391923" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter6/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter6.png" data-orig-size="550,308" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter6" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter6.png" class="alignnone wp-image-391923 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter6.png" alt="Jmeter6" width="550" height="308" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter6.png 550w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter6-300x168.png 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391924" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter7/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter7.png" data-orig-size="523,171" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter7" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter7.png" class="alignnone wp-image-391924 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter7.png" alt="Jmeter7" width="523" height="171" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter7.png 523w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter7-300x98.png 300w" sizes="auto, (max-width: 523px) 100vw, 523px" /></p>
<p>Thread Group controls how many users run your test and how the load starts.</p>
<p><strong>Step 3: Create a GET API test (List objects)</strong></p>
<p><strong>3.1 Add HTTP Request sampler</strong></p>
<p>Right‑click <strong>Thread Group</strong> → <strong>Add</strong> → <strong>Sampler</strong> → <strong>HTTP Request</strong></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391925" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter8/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter8.png" data-orig-size="369,305" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter8" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter8.png" class="alignnone wp-image-391925 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter8.png" alt="Jmeter8" width="369" height="305" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter8.png 369w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter8-300x248.png 300w" sizes="auto, (max-width: 369px) 100vw, 369px" /></p>
<p><b><span data-contrast="auto">3.2 Fill HTTP Request fields (IMPORTANT)</span></b><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="auto">Use these values:</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="87" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Name</span></b><span data-contrast="auto"> : HTTP Get Request</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="80" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Protocol:</span></b><span data-contrast="auto"> https</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="80" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Server Name or IP:</span></b><span data-contrast="auto"> api.restful-api.dev (only domain, not full URL) </span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="80" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Method:</span></b><span data-contrast="auto"> GET </span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="80" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Path:</span></b><span data-contrast="auto"> /objects </span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><span data-contrast="auto"> The real endpoint is:  </span><a href="https://api.restful-api.dev/objects"><b><span data-contrast="none">https://api.restful-api.dev/objects</span></b></a><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391961" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter9/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter9.png" data-orig-size="566,185" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter9" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter9.png" class="alignnone wp-image-391961 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter9.png" alt="Jmeter9" width="630" height="206" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter9.png 566w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter9-300x98.png 300w" sizes="auto, (max-width: 630px) 100vw, 630px" /></p>
<p><strong>Common mistake:</strong> Don’t put https://api.restful-api.dev/objects inside “Server Name”. If you add path there, JMeter can fail with host errors (UnknownHost). Use domain in Server Name and endpoint in Path.</p>
<p><strong>3.3 Add Listeners </strong></p>
<p>Right-click <strong>Thread Group</strong> → Add → Listener → <strong>View Results Tree</strong> (best for debugging)</p>
<ul>
<li>Add <strong>Summary Report</strong> or <strong>Aggregate Report</strong> (for final numbers)</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391962" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter910/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter910.png" data-orig-size="475,414" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter910" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter910.png" class="alignnone wp-image-391962 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter910.png" alt="Jmeter910" width="475" height="414" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter910.png 475w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter910-300x261.png 300w" sizes="auto, (max-width: 475px) 100vw, 475px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391963" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter11/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter11.png" data-orig-size="448,307" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter11" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter11.png" class="alignnone wp-image-391963 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter11.png" alt="Jmeter11" width="448" height="307" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter11.png 448w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter11-300x206.png 300w" sizes="auto, (max-width: 448px) 100vw, 448px" /></p>
<p><strong>3.4 Save Your Test Plan</strong></p>
<p>Save your file as something like <strong>FirstGetApiTest.jmx</strong></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391964" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter12/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter12.png" data-orig-size="370,294" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter12" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter12.png" class="alignnone wp-image-391964 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter12.png" alt="Jmeter12" width="370" height="294" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter12.png 370w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter12-300x238.png 300w" sizes="auto, (max-width: 370px) 100vw, 370px" /></p>
<p><strong>3.5 Run the Test</strong></p>
<p>Click green <strong>Play</strong> button (or Run → Start)</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391965" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter13/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter13.png" data-orig-size="593,205" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter13" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter13.png" class="alignnone wp-image-391965 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter13.png" alt="Jmeter13" width="593" height="205" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter13.png 593w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter13-300x104.png 300w" sizes="auto, (max-width: 593px) 100vw, 593px" /></p>
<p><strong>3.6 Watch the Results </strong></p>
<p>Watch the results in View Results Tree!</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391966" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter14/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter14.png" data-orig-size="309,289" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter14" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter14.png" class="alignnone wp-image-391966 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter14.png" alt="Jmeter14" width="416" height="389" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter14.png 309w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter14-300x281.png 300w" sizes="auto, (max-width: 416px) 100vw, 416px" /></p>
<p><strong>Step 4: Create a POST API test (Add an object)</strong></p>
<p><strong>4.1 Add another HTTP Request sampler</strong></p>
<p>Right‑click <strong>Thread Group</strong> → <strong>Add</strong> → <strong>Sampler</strong> → <strong>HTTP Request</strong></p>
<p><strong>4.2 Configure POST sampler fields</strong></p>
<ul>
<li><strong>Name: </strong>HTTP Post Request</li>
<li><strong>Protocol:</strong> https</li>
<li><strong>Server Name or IP:</strong> api.restful-api.dev</li>
<li><strong>Method:</strong> POST</li>
<li><strong>Path:</strong> /objects</li>
</ul>
<p><strong>4.3 Add JSON Body (Body Data)</strong></p>
<p>Inside the POST HTTP Request sampler, go to <strong>Body Data</strong> and paste this JSON:</p>
<p>JSON : {</p>
<p>&#8220;name&#8221;: &#8220;Apple MacBook Pro 16&#8221;,</p>
<p>&#8220;data&#8221;: { &#8220;year&#8221;: 2019,</p>
<p>&#8220;price&#8221;: 1849.99,</p>
<p>&#8220;CPU model&#8221;: &#8220;Intel Core i9&#8221;,</p>
<p>&#8220;Hard disk size&#8221;: &#8220;1 TB&#8221;</p>
<p>} }</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391967" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter15/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter15.png" data-orig-size="620,191" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter15" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter15.png" class="alignnone wp-image-391967 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter15.png" alt="Jmeter15" width="792" height="244" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter15.png 620w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter15-300x92.png 300w" sizes="auto, (max-width: 792px) 100vw, 792px" /></p>
<p>This sample object structure matches the API style shown by restful-api.dev (objects contain name and flexible data).</p>
<p><strong>4.4 Add Header (Content-Type)</strong></p>
<p>For POST requests, you should send JSON with correct header.</p>
<ol>
<li>Right‑click the <strong>POST HTTP Request</strong> (or Thread Group) →<br />
<strong>Add</strong> → <strong>Config Element</strong> → <strong>HTTP Header Manager</strong></li>
</ol>
<p><img loading="lazy" decoding="async" data-attachment-id="391969" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter16/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter16.png" data-orig-size="474,478" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter16" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter16.png" class="alignnone wp-image-391969 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter16.png" alt="Jmeter16" width="593" height="598" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter16.png 474w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter16-297x300.png 297w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter16-150x150.png 150w" sizes="auto, (max-width: 593px) 100vw, 593px" /></p>
<p>2. Add header:</p>
<ul>
<li>Content-Type = application/json</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391970" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter17/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter17.png" data-orig-size="727,212" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter17" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter17.png" class="alignnone wp-image-391970 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter17.png" alt="Jmeter17" width="953" height="278" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter17.png 727w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter17-300x87.png 300w" sizes="auto, (max-width: 953px) 100vw, 953px" /></p>
<p>This tells the server your request body is JSON.</p>
<p><strong>Step 5: Add Listeners (to see results)</strong></p>
<p><strong>For debugging (best for beginners)</strong></p>
<ul>
<li>Right‑click <strong>Thread Group</strong> → <strong>Add</strong> → <strong>Listener</strong> → <strong>View Results Tree</strong></li>
</ul>
<p><strong>For final numbers (report-style)</strong></p>
<p>Add one of these:</p>
<ul>
<li><strong>Summary Report</strong> or <strong>Aggregate Report</strong></li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391971" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter18/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter18.png" data-orig-size="241,313" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter18" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter18.png" class="alignnone wp-image-391971 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter18.png" alt="Jmeter18" width="241" height="313" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter18.png 241w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter18-231x300.png 231w" sizes="auto, (max-width: 241px) 100vw, 241px" /></p>
<p>Listeners show your execution results in table/tree/graph formats and can save results too.</p>
<p><strong>Step 6: Save your test plan</strong></p>
<p>Save file: JMeter recommends saving your test plan before running.</p>
<p><strong>Step 7: Run the test</strong></p>
<p>Click the <strong>green Play</strong> button (or <strong>Run → Start</strong>).</p>
<p>Now open <strong>View Results Tree</strong> to see:</p>
<ul>
<li>Request details</li>
<li>Response body</li>
<li>Status code (200/201)</li>
<li>Any error message</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391972" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter19/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter19.png" data-orig-size="454,225" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter19" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter19.png" class="alignnone wp-image-391972 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter19.png" alt="Jmeter19" width="454" height="225" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter19.png 454w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter19-300x149.png 300w" sizes="auto, (max-width: 454px) 100vw, 454px" /></p>
<p>You now understand how to create <strong>GET and POST API</strong> tests in JMeter.<br />
Next, let’s take your learning one step further with two practical real‑world challenges.<br />
The first covers <strong>JWT Authentication Testing in JMeter</strong>, and the second focuses on Data‑Driven <strong>Testing at Scale with JMeter (CSV + Groovy).</strong></p>
<h2><strong>Challenge A: JWT Authentication Testing in JMeter Using DummyJSON API</strong></h2>
<p>This section provides a simple, production-friendly approach to testing JWT authentication in Apache JMeter using the DummyJSON Auth API. It demonstrates how to build a minimal test plan that performs a complete authentication flow with only the essential JMeter components. The guide walks through sending a login request to generate a JWT accessToken, extracting the token using a JSON Extractor, and finally invoking a protected endpoint (/auth/me) using the required Authorization: Bearer &lt;token&gt; header. With a focus on clarity and minimalism—no timers, assertions, or extra plugins. This blog serves as an ideal starting point for understanding token-based authentication testing in JMeter.</p>
<p><strong>Step 1: Create a New Test Plan</strong></p>
<ol>
<li>Open <strong>Apache JMeter 5.6.3+</strong></li>
<li>Go to <strong>File → New</strong></li>
<li>Rename it to: DummyJsonAuthTest</li>
</ol>
<p><img loading="lazy" decoding="async" data-attachment-id="391973" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter20/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter20.png" data-orig-size="571,228" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter20" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter20.png" class="alignnone wp-image-391973 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter20.png" alt="Jmeter20" width="709" height="283" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter20.png 571w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter20-300x120.png 300w" sizes="auto, (max-width: 709px) 100vw, 709px" /></p>
<p><strong>Step 2: Add HTTP Request Defaults</strong></p>
<ol>
<li>Right‑click <strong>Test Plan</strong> →<br />
<strong>Add → Config Element → HTTP Request Defaults</strong></li>
<li>Enter the following values:</li>
</ol>
<ul>
<li><strong>Server Name or IP:</strong> dummyjson.com</li>
<li><strong>Protocol:</strong> https</li>
</ul>
<p>This sets the base URL so you don’t repeat it everywhere.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391974" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter21/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter21.png" data-orig-size="586,235" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter21" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter21.png" class="alignnone wp-image-391974 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter21.png" alt="Jmeter21" width="721" height="289" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter21.png 586w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter21-300x120.png 300w" sizes="auto, (max-width: 721px) 100vw, 721px" /></p>
<p><strong>Step 3: Add Global HTTP Header (Content-Type)</strong></p>
<ol>
<li>Right‑click <strong>Test Plan</strong> →<br />
<strong><strong>Add → Config Element → HTTP Header Manager</strong></strong>&nbsp;</li>
<li>Add only one header:</li>
</ol>
<ul>
<li><strong>Name:</strong> Content-Type</li>
<li><strong>Value:</strong> application/json</li>
</ul>
<p>This ensures your JSON login body is posted correctly.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391975" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter22/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter22.png" data-orig-size="578,229" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter22" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter22.png" class="alignnone wp-image-391975 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter22.png" alt="Jmeter22" width="762" height="302" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter22.png 578w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter22-300x119.png 300w" sizes="auto, (max-width: 762px) 100vw, 762px" /></p>
<p><strong>Step 4: Add a Thread Group</strong></p>
<ol>
<li>Right‑click <strong>Test Plan</strong> →<br />
<strong><strong><strong>Add → Threads (Users) → Thread Group</strong></strong></strong>&nbsp;</li>
<li>Configure the following settings:</li>
</ol>
<ul>
<li><strong>Number of Threads:</strong> 1</li>
<li><strong>Ramp-Up Period:</strong> 1</li>
<li><strong>Loop Count:</strong> 1</li>
</ul>
<p>This keeps the test extremely lightweight.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391976" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter23/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter23.png" data-orig-size="591,232" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter23" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter23.png" class="alignnone wp-image-391976 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter23.png" alt="Jmeter23" width="797" height="313" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter23.png 591w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter23-300x118.png 300w" sizes="auto, (max-width: 797px) 100vw, 797px" /></p>
<p><strong>Step 5: Add Login API (POST /auth/login)</strong></p>
<ol>
<li>Right‑click <strong>Thread Group</strong> →<br />
<strong>Add → Sampler → HTTP Request</strong></li>
<li>Set the following:</li>
</ol>
<ul>
<li><strong>Name:</strong> Login &#8211; POST /auth/login</li>
<li><strong>Method:</strong> POST</li>
<li><strong>Path:</strong> /auth/login</li>
</ul>
<p>3,  Go to <strong>Body Data</strong> tab → paste:</p>
<p>{</p>
<p>&#8220;username&#8221;: &#8220;emilys&#8221;,</p>
<p>&#8220;password&#8221;: &#8220;emilyspass&#8221;,</p>
<p>&#8220;expiresInMins&#8221;: 30</p>
<p>}</p>
<p>This request matches DummyJSON’s official documented example.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391977" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter24/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter24.png" data-orig-size="575,227" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter24" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter24.png" class="alignnone wp-image-391977 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter24.png" alt="Jmeter24" width="765" height="302" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter24.png 575w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter24-300x118.png 300w" sizes="auto, (max-width: 765px) 100vw, 765px" /></p>
<p><strong>Step 6: Extract JWT accessToken</strong></p>
<p>This is the most important step.</p>
<ol>
<li>Right‑click <strong>Login sampler</strong> →<br />
<strong>Add → Post Processor → JSON Extractor</strong></li>
<li>Configure the following:</li>
</ol>
<ul>
<li><strong>Variable Name:</strong> accessToken</li>
<li><strong>JSONPath Expression:</strong> $.accessToken</li>
<li><strong>Default Value:</strong> NOT_FOUND</li>
</ul>
<p>Why $.accessToken?<br />
Because DummyJSON returns this exact field name in the login response.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391978" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter25/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter25.png" data-orig-size="572,227" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter25" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter25.png" class="alignnone wp-image-391978 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter25.png" alt="Jmeter25" width="791" height="314" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter25.png 572w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter25-300x119.png 300w" sizes="auto, (max-width: 791px) 100vw, 791px" /></p>
<p><strong> Step 7: Add Protected API (GET /auth/me)</strong></p>
<ol>
<li>Right‑click <strong>Thread Group</strong> →<br />
<strong>Add → Sampler → HTTP Request</strong></li>
<li>Configure the following:</li>
</ol>
<ul>
<li><strong>Name:</strong> Protected &#8211; GET /auth/me</li>
<li><strong>Method:</strong> GET</li>
<li><strong>Path:</strong> /auth/me</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391979" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter26/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter26.png" data-orig-size="556,221" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter26" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter26.png" class="alignnone wp-image-391979 " src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter26.png" alt="Jmeter26" width="815" height="324" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter26.png 556w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter26-300x119.png 300w" sizes="auto, (max-width: 815px) 100vw, 815px" /></p>
<p><strong>Step 8: Add Authorization Header (Bearer Token)</strong></p>
<ol>
<li>Right‑click <strong>Protected sampler</strong> →<br />
<strong>Add → Config Element → HTTP Header Manager</strong></li>
<li>Add:</li>
</ol>
<ul>
<li><strong>Name:</strong> Authorization</li>
<li><strong>Value:</strong> Bearer ${accessToken}</li>
</ul>
<p>DummyJSON explicitly states that /auth/me must receive the <strong>accessToken</strong> via the Bearer header.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391980" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter27/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter27.png" data-orig-size="593,237" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter27" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter27.png" class="alignnone wp-image-391980 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter27.png" alt="Jmeter27" width="593" height="237" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter27.png 593w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter27-300x120.png 300w" sizes="auto, (max-width: 593px) 100vw, 593px" /></p>
<p><strong>Step 9: Add View Results Tree (Optional but Useful)</strong></p>
<ol>
<li>Right‑click <strong>Thread Group</strong> →<br />
<strong>Add → Listener → View Results Tree</strong></li>
</ol>
<p>This will allow you to see the response body and confirm that the token extraction works correctly.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391981" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter28/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter28.png" data-orig-size="624,125" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter28" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter28.png" class="alignnone wp-image-391981 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter28.png" alt="Jmeter28" width="624" height="125" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter28.png 624w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter28-300x60.png 300w" sizes="auto, (max-width: 624px) 100vw, 624px" /></p>
<p><strong>Step 10: Run the Test</strong></p>
<p>Click the <strong>green Start button</strong> (<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" />).</p>
<p><strong>Expected Behavior</strong></p>
<ul>
<li><strong>Login API</strong> returns 200 with a JSON containing accessToken.</li>
<li>The <strong>JSON Extractor</strong> captures the token.</li>
<li><strong>Protected API</strong> returns 200 with authenticated user details.</li>
</ul>
<p>If you see:</p>
<p>401 Unauthorized</p>
<p>Check the View Results Tree → Request headers → Authorization must look like:</p>
<p>Authorization: Bearer eyJhbGciOiJIUzI1NiIs&#8230;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391982" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter29/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter29.png" data-orig-size="594,168" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter29" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter29.png" class="alignnone wp-image-391982 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter29.png" alt="Jmeter29" width="594" height="168" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter29.png 594w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter29-300x85.png 300w" sizes="auto, (max-width: 594px) 100vw, 594px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391984" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter30-2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter30-1.png" data-orig-size="594,166" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter30" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter30-1.png" class="alignnone wp-image-391984 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter30-1.png" alt="Jmeter30" width="594" height="166" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter30-1.png 594w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter30-1-300x84.png 300w" sizes="auto, (max-width: 594px) 100vw, 594px" /></p>
<h2><strong>Challenge B: Data‑Driven Testing at Scale with JMeter (CSV + Groovy)</strong></h2>
<p>This section explains an easy and practical way to run large‑scale API load tests in JMeter without errors or data conflicts. When many virtual users use the same username or repeated IDs, tests often fail because of server caching or duplicating data issues. To avoid this, the blog shows how to give each virtual user its <strong>own unique data</strong> using a CSV file, small random values, and Groovy scripts.</p>
<p>You’ll learn how to create a clean and simple JMeter test plan that reads login details from a CSV file, skips the header row, adds random values, and generates unique fields through a Groovy PreProcessor. The test then logs in, extracts an access token, and uses that token to call a protected endpoint. This guide helps you build reliable, scalable, and realistic API tests in JMeter.</p>
<p><strong>1) Prepare Your CSV Data</strong></p>
<p>Create a file named users.csv. <strong>Include a header</strong> and <strong>tab</strong> or <strong>comma</strong> as your delimiter. Two examples:</p>
<p><strong>Option A — Tab‑separated</strong></p>
<p>username        password</p>
<p>emilys emilyspass</p>
<p>michaelw         michaelwpass</p>
<p>sophiab            sophiabpass</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391985" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter31/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter31.png" data-orig-size="254,129" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter31" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter31.png" class="alignnone wp-image-391985 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter31.png" alt="Jmeter31" width="254" height="129" /></p>
<p><strong>Option B — Comma‑separated</strong></p>
<p>username,password</p>
<p>emilys,emilyspass</p>
<p>michaelw,michaelwpass</p>
<p>sophiab,sophiabpass</p>
<p>We’ll configure JMeter to <strong>ignore the first line</strong> so the header is <strong>not</strong> treated as credentials.</p>
<p><strong>2) Create a New JMeter Test Plan</strong></p>
<ol>
<li>Open <strong>JMeter</strong> → <strong>File → New</strong>.</li>
<li>Rename Test Plan to: DummyJsonAuthTest_data_driven</li>
</ol>
<p><img loading="lazy" decoding="async" data-attachment-id="391986" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter32/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter32.png" data-orig-size="565,250" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter32" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter32.png" class="alignnone wp-image-391986 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter32.png" alt="Jmeter32" width="565" height="250" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter32.png 565w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter32-300x133.png 300w" sizes="auto, (max-width: 565px) 100vw, 565px" /></p>
<p><strong>3) Add HTTP Request Defaults</strong></p>
<ul>
<li><strong>Test Plan</strong> → <strong>Add → Config Element → HTTP Request Defaults</strong><br />
Set:</p>
<ul>
<li><strong>Protocol</strong>: https</li>
<li><strong>Server Name or IP</strong>: dummyjson.com</li>
</ul>
</li>
</ul>
<p>(Prevents repeating the base URL for every request.)</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391987" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter33/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter33.png" data-orig-size="579,203" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter33" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter33.png" class="alignnone wp-image-391987 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter33.png" alt="Jmeter33" width="579" height="203" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter33.png 579w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter33-300x105.png 300w" sizes="auto, (max-width: 579px) 100vw, 579px" /></p>
<p><strong>4) Add Global HTTP Header Manager</strong></p>
<ul>
<li><strong>Test Plan</strong> → <strong>Add → Config Element → HTTP Header Manager</strong><br />
Add: Content-Type : application/json</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391988" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter34/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter34.png" data-orig-size="576,242" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter34" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter34.png" class="alignnone wp-image-391988 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter34.png" alt="Jmeter34" width="576" height="242" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter34.png 576w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter34-300x126.png 300w" sizes="auto, (max-width: 576px) 100vw, 576px" /></p>
<p><strong>5) Add CSV Data Set Config (Critical)</strong></p>
<ul>
<li><strong>Test Plan</strong> → <strong>Add → Config Element → CSV Data Set Config</strong></li>
</ul>
<p>Configure:</p>
<ul>
<li><strong>Filename</strong>: users.csv</li>
<li><strong>Variable Names</strong>: username,password</li>
<li><strong>Delimiter</strong>:
<ul>
<li>\t if your file uses <strong>tabs</strong></li>
<li>, if your file uses <strong>commas</strong></li>
</ul>
</li>
<li><strong>Ignore first line</strong>: <strong>True</strong>  <em>(ensures the header row is not treated as data)</em></li>
<li><strong>Recycle on EOF</strong>: False</li>
<li><strong>Stop thread on EOF</strong>: True</li>
<li><strong>Sharing mode</strong>: All threads</li>
</ul>
<p>With <strong>Ignore first line = True</strong>, JMeter reads username,password strictly as <strong>variable names</strong>, and your data rows become proper user credentials.</p>
<p>Setting <strong>Recycle=False / Stop on EOF=True</strong> ensures each row is used <strong>once per thread</strong> and unused threads stop when data runs out.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391989" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter35/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter35.png" data-orig-size="576,239" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter35" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter35.png" class="alignnone wp-image-391989 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter35.png" alt="Jmeter35" width="576" height="239" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter35.png 576w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter35-300x124.png 300w" sizes="auto, (max-width: 576px) 100vw, 576px" /></p>
<p><strong>6) Add a Thread Group</strong></p>
<ul>
<li><strong>Test Plan</strong> → <strong>Add → Threads (Users) → Thread Group</strong><br />
Example settings (tune to your needs):</p>
<ul>
<li><strong>Number of Threads (users)</strong>: 5</li>
<li><strong>Ramp‑Up (sec)</strong>: 5</li>
<li><strong>Loop Count</strong>: 1</li>
</ul>
</li>
</ul>
<p>Each thread will pick the next row from users.csv.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391991" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter36/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter36.png" data-orig-size="564,325" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter36" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter36.png" class="alignnone wp-image-391991 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter36.png" alt="Jmeter36" width="564" height="325" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter36.png 564w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter36-300x173.png 300w" sizes="auto, (max-width: 564px) 100vw, 564px" /></p>
<p><strong>7) Add the Login Request (POST /auth/login)</strong></p>
<ul>
<li><strong>Thread Group</strong> → <strong>Add → Sampler → HTTP Request</strong>
<ul>
<li><strong>Name</strong>: Login – POST /auth/login</li>
<li><strong>Method</strong>: POST</li>
<li><strong>Path</strong>: /auth/login</li>
</ul>
</li>
</ul>
<p><strong>Body Data</strong>:</p>
<p>{</p>
<p>&#8220;username&#8221;: &#8220;${username}&#8221;,</p>
<p>&#8220;password&#8221;: &#8220;${password}&#8221;,</p>
<p>&#8220;expiresInMins&#8221;: 30,</p>
<p>&#8220;note&#8221;: &#8220;rnd_${__Random(1000,9999,)}&#8221;</p>
<p>}</p>
<p><strong>Why this helps</strong></p>
<ul>
<li>${username} / ${password} come from the CSV row for that thread.</li>
<li>${__Random(1000,9999,)} appends a small random number per request (handy when you want trivial uniqueness).</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391992" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter37/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter37.png" data-orig-size="577,297" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter37" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter37.png" class="alignnone wp-image-391992 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter37.png" alt="Jmeter37" width="577" height="297" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter37.png 577w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter37-300x154.png 300w" sizes="auto, (max-width: 577px) 100vw, 577px" /></p>
<p><strong>8) Generate Unique Variables (JSR223 PreProcessor, Groovy)</strong></p>
<p>We’ll create values that are <strong>globally unique</strong> per sampler execution, perfect for payload fields like emails or order names.</p>
<ul>
<li><strong>Right‑click Login – POST /auth/login</strong> → <strong>Add → Pre Processors → JSR223 PreProcessor</strong></li>
<li><strong>Language</strong>: groovy</li>
<li><strong>Script</strong>:</li>
</ul>
<p>// Unique email and order name per sample</p>
<p>import org.apache.commons.lang3.RandomStringUtils</p>
<p>String random = RandomStringUtils.randomAlphanumeric(8)</p>
<p>vars.put(&#8216;uniqueEmail&#8217;, &#8216;test&#8217; + random + &#8216;@example.com&#8217;)</p>
<p>vars.put(&#8216;uniqueOrderName&#8217;, &#8216;Order_&#8217; + System.currentTimeMillis())</p>
<p>&#8220;</p>
<p>You can now use ${uniqueEmail} and ${uniqueOrderName} in any downstream JSON body or header to avoid caching/collisions.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" /> If you see a class not found error for RandomStringUtils, add Apache Commons Lang to JMeter’s /lib folder and restart JMeter. Most distributions already include it, but environments vary.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391993" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter38/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter38.png" data-orig-size="531,250" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter38" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter38.png" class="alignnone wp-image-391993 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter38.png" alt="Jmeter38" width="531" height="250" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter38.png 531w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter38-300x141.png 300w" sizes="auto, (max-width: 531px) 100vw, 531px" /></p>
<p><strong>9) Extract the Token (JSON Extractor)</strong></p>
<ul>
<li><strong>Right‑click Login – POST /auth/login</strong> → <strong>Add → Post Processors → JSON Extractor</strong><br />
Configure:</p>
<ul>
<li><strong>Names of created variables</strong>: accessToken</li>
<li><strong>JSONPath expressions</strong>: $.accessToken</li>
<li><strong>Default Values</strong>: NOT_FOUND</li>
</ul>
</li>
</ul>
<p>The login response should return accessToken. This extractor exposes it as ${accessToken} for the next step.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="391994" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter39/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter39.png" data-orig-size="589,226" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter39" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter39.png" class="alignnone wp-image-391994 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter39.png" alt="Jmeter39" width="589" height="226" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter39.png 589w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter39-300x115.png 300w" sizes="auto, (max-width: 589px) 100vw, 589px" /></p>
<p><strong>10) Add a Protected Request (GET /auth/me)</strong></p>
<ul>
<li><strong>Thread Group</strong> → <strong>Add → Sampler → HTTP Request</strong>
<ul>
<li><strong>Name</strong>: Protected – GET /auth/me</li>
<li><strong>Method</strong>: GET</li>
<li><strong>Path</strong>: /auth/me</li>
</ul>
</li>
</ul>
<p><strong>Add a Header Manager (child of this sampler)</strong>:</p>
<ul>
<li>Authorization : Bearer ${accessToken}</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391995" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter40/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter40.png" data-orig-size="570,276" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter40" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter40.png" class="alignnone wp-image-391995 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter40.png" alt="Jmeter40" width="570" height="276" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter40.png 570w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter40-300x145.png 300w" sizes="auto, (max-width: 570px) 100vw, 570px" /></p>
<p><strong>11) Add One View Results Tree (for quick verification)</strong></p>
<ul>
<li><strong>Thread Group</strong> → <strong>Add → Listener → View Results Tree</strong></li>
</ul>
<p>Run a small test (1–5 threads) and verify:</p>
<ul>
<li><strong>Login</strong> → 200 OK, response contains accessToken.</li>
<li><strong>Debug Sampler</strong> (optional) shows username, password, uniqueEmail, uniqueOrderName, and accessToken.</li>
<li><strong>/auth/me</strong> → 200 OK with user details.</li>
<li>No more <strong>Invalid credentials</strong> due to the header row being treated as a login attempt.</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="391996" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter41/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter41.png" data-orig-size="575,229" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter41" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter41.png" class="alignnone wp-image-391996 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter41.png" alt="Jmeter41" width="575" height="229" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter41.png 575w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter41-300x119.png 300w" sizes="auto, (max-width: 575px) 100vw, 575px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391997" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter42/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter42.png" data-orig-size="575,213" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter42" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter42.png" class="alignnone wp-image-391997 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter42.png" alt="Jmeter42" width="575" height="213" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter42.png 575w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter42-300x111.png 300w" sizes="auto, (max-width: 575px) 100vw, 575px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="391998" data-permalink="https://blogs.perficient.com/jmeter-performance-testing/jmeter43/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter43.png" data-orig-size="575,183" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Jmeter43" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter43.png" class="alignnone wp-image-391998 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter43.png" alt="Jmeter43" width="575" height="183" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter43.png 575w, https://blogs.perficient.com/wp-content/uploads/2026/07/jmeter43-300x95.png 300w" sizes="auto, (max-width: 575px) 100vw, 575px" /></p>
<p>The post <a href="https://blogs.perficient.com/jmeter-performance-testing/">JMeter Performance Testing</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-1429274633-1024x572.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">391915</post-id>	</item>
		<item>
		<title>DeepEval Explained Simply: Why Testing AI Outputs Matters</title>
		<link>https://blogs.perficient.com/deepeval-explained-simply-why-testing-ai-outputs-matters/</link>
		
		<dc:creator><![CDATA[Venkata Sreeram Murthy Gonella]]></dc:creator>
		<pubDate>Tue, 21 Jul 2026 18:35:04 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392024</guid>

					<description><![CDATA[<p>Large Language Models (LLMs) are increasingly being used to power AI applications across industries. As adoption grows, organizations need ways to evaluate output quality, consistency, and&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/deepeval-explained-simply-why-testing-ai-outputs-matters/">DeepEval Explained Simply: Why Testing AI Outputs Matters</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="TextRun SCXW110113582 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW110113582 BCX0">Large Language Models (LLMs</span><span class="NormalTextRun SCXW110113582 BCX0">)</span><span class="NormalTextRun SCXW110113582 BCX0"> </span><span class="NormalTextRun SCXW110113582 BCX0">are increasingly being used to power AI applications acros</span><span class="NormalTextRun SCXW110113582 BCX0">s industries. As adoption grows, organizations need ways to evaluate output quality, consistency, and relevance. </span></span><span class="LineBreakBlob BlobObject DragDrop SCXW110113582 BCX0"><span class="SCXW110113582 BCX0"> </span><br class="SCXW110113582 BCX0" /></span><span class="LineBreakBlob BlobObject DragDrop SCXW110113582 BCX0"><span class="SCXW110113582 BCX0"> </span><br class="SCXW110113582 BCX0" /></span><span class="TextRun SCXW110113582 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW110113582 BCX0">DeepEval</span><span class="NormalTextRun SCXW110113582 BCX0"> </span><span class="NormalTextRun SCXW110113582 BCX0">is an evaluation fr</span><span class="NormalTextRun SCXW110113582 BCX0">amework that tests AI outputs the way software engineers test code. </span></span><span class="EOP SCXW110113582 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:300}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="392033" data-permalink="https://blogs.perficient.com/deepeval-explained-simply-why-testing-ai-outputs-matters/designer-1/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1.png" data-orig-size="1536,1024" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Designer (1)" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-1024x683.png" class="alignnone wp-image-392033 size-large" src="https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-1024x683.png" alt="Designer (1)" width="1024" height="683" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-1024x683.png 1024w, https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-300x200.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-768x512.png 768w, https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-600x400.png 600w, https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1-1200x800.png 1200w, https://blogs.perficient.com/wp-content/uploads/2026/07/Designer-1.png 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>1. Why Testing Is Required</h2>
<p>Traditional software is predictable; LLMs are probabilistic. Responses may vary depending on prompts, context, and available information. DeepEval addresses this through automated test cases, evaluation metrics, benchmarking, and continuous reporting.</p>
<h2>2. Types of Test Cases</h2>
<p>Single-Turn, Multi-Turn, and Arena Test Cases provide increasing levels of evaluation coverage.</p>
<h2>3. End-to-End LLM Evaluations</h2>
<p>Treat the application as a black box and evaluate final user outcomes.</p>
<h2>4. Confident AI Platform Features</h2>
<p>Confident AI extends DeepEval with Test Runs, Datasets, Arena comparisons, Experiments, Prompt Studio, Reporting, Observability, Governance, and collaborative evaluation workflows.</p>
<h2>5. Why This Matters for Business</h2>
<p>Objective quality measurement reduces risk and increases trust in AI systems.</p>
<h3>Conclusion</h3>
<p>DeepEval converts subjective AI evaluation into measurable engineering metrics.</p>
<h2>6. Evaluation Report Screenshot</h2>
<p><img loading="lazy" decoding="async" data-attachment-id="392026" data-permalink="https://blogs.perficient.com/deepeval-explained-simply-why-testing-ai-outputs-matters/deepeval2/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval2.png" data-orig-size="864,391" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Deepeval2" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval2.png" class="alignnone wp-image-392026 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval2.png" alt="Deepeval2" width="864" height="391" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval2.png 864w, https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval2-300x136.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval2-768x348.png 768w" sizes="auto, (max-width: 864px) 100vw, 864px" /></p>
<p>Figure 1. DeepEval / Confident AI Test Runs dashboard.</p>
<h2><strong>7. Python Installation</strong></h2>
<p>pip install deepeval</p>
<p>pip install &#8211;upgrade deepeval</p>
<p>deepeval &#8211;help</p>
<p>pip show deepeval – Get the version of deepeval</p>
<h2><strong>8. Running DeepEval Locally </strong></h2>
<p>One important observation from my testing:</p>
<p>I successfully performed local DeepEval testing without using an OpenAI API key by executing custom Python-based evaluation logic and creating evaluation reports locally.</p>
<p>This demonstrates that evaluation concepts and reporting can be validated locally using Python implementations. However, DeepEval also supports advanced LLM-as-a-Judge metrics.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="392027" data-permalink="https://blogs.perficient.com/deepeval-explained-simply-why-testing-ai-outputs-matters/deepeval3/" data-orig-file="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval3.png" data-orig-size="864,588" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="Deepeval3" data-image-description="" data-image-caption="" data-large-file="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval3.png" class="alignnone wp-image-392027 size-full" src="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval3.png" alt="Deepeval3" width="864" height="588" srcset="https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval3.png 864w, https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval3-300x204.png 300w, https://blogs.perficient.com/wp-content/uploads/2026/07/deepeval3-768x523.png 768w" sizes="auto, (max-width: 864px) 100vw, 864px" /></p>
<h2>Arena Test Case Diagram</h2>
<p>Model A Answer &#8212;-&gt; Compare &#8212;-&gt; Winner<br />
Model B Answer &#8212;-^</p>
<h2>End-to-End Evaluation Flow</h2>
<p>User Query -&gt; AI App -&gt; Response -&gt; DeepEval Metrics -&gt; Report -&gt; Improvement</p>
<h2>LLM Evaluation Lifecycle</h2>
<p>Datasets -&gt; Test Cases -&gt; Evaluation -&gt; Metrics -&gt; Test Runs -&gt; Optimization</p>
<ul>
<li>Test Runs: Benchmark and track evaluation results over time.</li>
<li>Datasets: Manage golden datasets and evaluation samples.</li>
<li>Arena: Compare prompts, models, and responses side-by-side.</li>
<li>Experiments: Measure quality impact before release.</li>
<li>Prompt Studio: Iterate and validate prompts systematically.</li>
<li>Reports &amp; Dashboards: Centralized visibility into AI quality.</li>
<li>Observability: Monitor production traces and quality signals.</li>
<li>Governance: Standardize evaluation across teams.</li>
</ul>
<h2>References</h2>
<p><a href="https://deepeval.com/docs/evaluation-test-cases">https://deepeval.com/docs/evaluation-test-cases</a></p>
<p><a href="https://deepeval.com/docs/evaluation-end-to-end-llm-evals">https://deepeval.com/docs/evaluation-end-to-end-llm-evals</a></p>
<p><a href="https://app.confident-ai.com/project">https://app.confident-ai.com/project</a></p>
<p>The post <a href="https://blogs.perficient.com/deepeval-explained-simply-why-testing-ai-outputs-matters/">DeepEval Explained Simply: Why Testing AI Outputs Matters</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-2166701874-1024x671.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392024</post-id>	</item>
		<item>
		<title>Faster Decisions Start With AI-Driven Clinical Review</title>
		<link>https://blogs.perficient.com/faster-decisions-start-with-ai-driven-clinical-review/</link>
		
		<dc:creator><![CDATA[Editorial Team]]></dc:creator>
		<pubDate>Mon, 20 Jul 2026 15:57:08 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<category><![CDATA[AIinLifeSciences]]></category>
		<category><![CDATA[clinical data management]]></category>
		<category><![CDATA[homepage-featured]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=392005</guid>

					<description><![CDATA[<p>Clinical trials generate more data than ever before. From EDC systems, laboratory data, clinical trial management systems (CTMS), and safety data to operational and real-world&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/faster-decisions-start-with-ai-driven-clinical-review/">Faster Decisions Start With AI-Driven Clinical Review</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Clinical trials generate more data than ever before.</p>
<p>From EDC systems, laboratory data, clinical trial management systems (CTMS), and safety data to operational and real-world sources, the volume of information flowing through clinical programs continues to grow.</p>
<p>At the same time, AI is creating new opportunities to analyze that information at a scale that wasn&#8217;t previously possible. Organizations can no longer afford to treat quality as something that gets evaluated at the end of a study. Increasingly, they need to identify risks, signals, and data issues while there is still time to act.</p>
<p>That&#8217;s creating a new challenge for clinical teams. The industry&#8217;s problem is no longer access to data. It&#8217;s deciding where experts should focus their attention.</p>
<h2>More Data Hasn&#8217;t Made Review Easier</h2>
<p>For years, life sciences organizations have invested heavily in data platforms, automation, and analytics. Yet clinical trial delays remain stubbornly persistent.</p>
<p>According to the Tufts Center for the Study of Drug Development, approximately <a href="https://visionlifesciences.com/insights/clinical-trial-patient-enrollment-strategies" target="_blank" rel="noopener"><strong>80% of clinical trials still miss their planned enrollment timelines</strong></a>. If the industry has more data, more technology, and more AI than ever before, why do delays remain so persistent?</p>
<p>A core reason is that visibility alone doesn&#8217;t create action. Data may be available, but it&#8217;s not always organized, prioritized, or presented in a way that helps teams determine what requires attention first. Clinical data managers, medical reviewers, and biostatisticians still spend significant time reconciling information across multiple systems, reviewing discrepancies, and tracking down answers before meaningful analysis can even begin.</p>
<p><strong>Clinical teams are being asked to do all of this at once:</strong></p>
<ul>
<li>Review growing volumes of study data</li>
<li>Identify potential data issues and safety or efficacy signals earlier</li>
<li>Resolve discrepancies faster</li>
<li>Support increasingly complex protocols</li>
<li>Deliver cleaner, submission-ready datasets</li>
</ul>
<p>The result is a familiar pattern. Teams accumulate more information than ever before, while the people responsible for reviewing it face increasing pressure to move faster without sacrificing quality, safety, or compliance.</p>
<h2>The Shift Toward Risk-Based Clinical Data Review</h2>
<p>One of the most important changes happening in clinical development today is the move toward more proactive and risk-based approaches.</p>
<p>The goal isn&#8217;t simply reviewing data faster. It&#8217;s bringing quality, oversight, and risk identification earlier into the trial lifecycle. Instead of treating every data point equally, organizations are asking a different question: <strong>Where should we focus first?</strong></p>
<p>As data volumes continue to grow, that question becomes increasingly difficult to answer. Clinical teams can&#8217;t scale review activities in direct proportion to the amount of information flowing through a study. They need better ways to prioritize attention, identify meaningful risk, collaborate, and focus effort where it can have the greatest impact.</p>
<div>
<p>The shift requires a more deliberate approach to review—one that combines human expertise with AI-driven prioritization to identify meaningful signals sooner, rather than treating every data point with the same level of urgency.</p>
</div>
<h2>Why AI-Driven Clinical Review Is Becoming a Competitive Advantage</h2>
<p>When people think about clinical trial performance, they often focus on enrollment, protocol design, or study execution. But clinical data review plays an equally important role.</p>
<p>The faster teams can identify anomalies, review discrepancies, detect potential safety or efficacy signals, and align around a common view of study performance, the faster they can make informed decisions. Instead of spending time searching for information, teams need critical signals surfaced in the moments they matter most. That shift is already underway across the industry.</p>
<blockquote>
<p style="text-align: left">Quality is becoming part of the process from the beginning rather than something that gets evaluated after the fact.&#8221;<br />
<strong>— Prabha Ranganathan</strong>, Associate Vice President, Life Sciences</p>
</blockquote>
<p>Organizations are increasingly moving quality and oversight earlier in the trial lifecycle rather than relying on downstream review and remediation. As a result, clinical data review is becoming less about finding issues after they occur and more about <strong>identifying risks while there is still time to act</strong>.</p>
<h2>Better Decisions Require More Than Visibility</h2>
<p>Which discrepancies represent meaningful risk? What signals may indicate a developing safety concern? Which issues can wait, and which require action right now?</p>
<p>These are the questions that can&#8217;t be answered by another dashboard alone. They require a trusted view of data, clear prioritization, and the ability to connect signals to action while there is still time to influence the outcome.</p>
<p>That&#8217;s why clinical data review is evolving from a process focused on finding issues to one focused on identifying risk sooner.</p>
<p style="text-align: left">Perficient&#8217;s <strong>Clinical Data Repository and Review</strong> solution was designed to support that shift. By combining a unified clinical data foundation with agentic AI capabilities, it helps organizations move beyond data aggregation and turn growing volumes of clinical information into faster, more informed decisions.</p>
<p>As data volumes continue to grow, competitive advantage increasingly comes from finding critical signals sooner—not reviewing more data.</p>
<h2>The Next Challenge Isn&#8217;t More Data</h2>
<p>The life sciences industry has spent years solving the problem of data collection. The next challenge is helping clinical teams keep up with what that data is trying to tell them.</p>
<p>Organizations that gain an advantage won&#8217;t necessarily be the ones generating more information. They&#8217;ll be the ones that help their experts find the right signals faster, make better decisions sooner, and act before risks impact study outcomes.</p>
<p><em>Interested in seeing what that could look like in practice? Reach out to <a href="https://www.perficient.com/contact-us">schedule a demo</a> with <a href="https://www.perficient.com/industries/healthcare-life-sciences">Perficient&#8217;s Healthcare &amp; Life Sciences team</a> to explore how AI-driven clinical review can help your teams focus less on administrative work and more on the decisions that move studies forward.</em></p>
<p>The post <a href="https://blogs.perficient.com/faster-decisions-start-with-ai-driven-clinical-review/">Faster Decisions Start With AI-Driven Clinical Review</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/AI-in-Clinical-Data-Review.png" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">392005</post-id>	</item>
		<item>
		<title>Why More Data Won&#8217;t Fix Your Star Ratings</title>
		<link>https://blogs.perficient.com/why-more-data-wont-fix-your-star-ratings/</link>
		
		<dc:creator><![CDATA[Perficient Expert]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 22:20:59 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<category><![CDATA[#AIinHealthcare]]></category>
		<category><![CDATA[#StarRatings]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=391944</guid>

					<description><![CDATA[<p>By Priyal Patel, Asssociate Vice President, Healthcare Strategy &#38; Solutions Health plans are losing Star ratings because insights arrive too late to change outcomes. AI&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/why-more-data-wont-fix-your-star-ratings/">Why More Data Won&#8217;t Fix Your Star Ratings</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>By Priyal Patel, Asssociate Vice President, Healthcare Strategy &amp; Solutions</em></p>
<p>Health plans are losing Star ratings because insights arrive too late to change outcomes. AI closes that gap by getting the right insight to the right person while there is still time to act.</p>
<p>At this year&#8217;s Databricks Data + AI Summit (DAIS), health plan leaders consistently pointed to the <a href="https://blogs.perficient.com/why-ai-stalls-for-health-plans-turning-data-into-action/">same challenge</a>: improving outcomes in an increasingly complex data environment. I spoke with Matthew Giglia, Healthcare and Life Sciences Forward Deployed Engineer at Databricks, about how AI is helping healthcare organizations get more value from their data.</p>
<h2><strong>More Data Isn’t the Missing Piece</strong></h2>
<p>Health plans no longer have a data problem. Most already have access to claims and clinical data, social determinants, member engagement history, quality measures, and risk scores.</p>
<p>But more data has not automatically translated into better Star ratings, faster interventions, or clearer insight into what is working.</p>
<p>That signals an important shift: <strong>the bottleneck is no longer data</strong>.</p>
<h2><strong>The Gap Between Insight and Action </strong></h2>
<p>Data was never the real constraint. Decision latency is. An insight sitting in a dashboard doesn’t close a care gap. A risk score doesn’t improve a measure on its own. A report doesn’t change a member outcome unless it reaches the workflow where decisions are made — while there is still time to act.</p>
<p>In many plans, the distance between knowing and doing is still measured in weeks. By then, the opportunity to intervene has often passed.</p>
<p>The problem is not the model or the report. It&#8217;s how long it takes to respond once an opportunity is identified. That&#8217;s why a health plan can have sophisticated analytics and still struggle to move its Star ratings.</p>
<h2><strong>AI Should Not Mean More Noise </strong></h2>
<p>The organizations getting real value from AI aren&#8217;t using it to gather more information. They&#8217;re using it to shorten the distance between insight and intervention.</p>
<p>In practice, AI helps health plans:</p>
<ul>
<li>Prioritize what matters instead of surfacing every signal with the same urgency</li>
<li>Surface risk earlier so care managers and quality teams can intervene before an outcome is locked in</li>
<li>Reduce the noise that buries care managers in alerts they can&#8217;t work through</li>
</ul>
<p>While the challenge shows up differently for health plans and providers, Giglia sees the same shift from the technology side:</p>
<blockquote><p><strong><em>Health systems used to treat yesterday&#8217;s data as good enough. Now, with AI in the mix, they need that data connected across every domain it touches: governed, tagged, and traceable back to its source, but usable the moment it&#8217;s needed.” </em></strong><em>— </em><strong><em>Matthew Giglia, Databricks</em></strong></p></blockquote>
<p>The technology to do this exists. The harder work is making it practical inside the workflows care managers already use every day.</p>
<h2><strong>Stars Performance Is a Decision Problem</strong></h2>
<p>Stars ratings are often treated like a measurement problem — they aren’t. The measures matter, of course. So do dashboards, scorecards, and reporting cycles. But performance changes when teams make better decisions sooner.</p>
<p>That means helping teams answer the questions that shape daily work:</p>
<ul>
<li>Which members should we prioritize this week?</li>
<li>Which interventions are most likely to improve a specific measure?</li>
<li>Where is staff effort going without measurable impact?</li>
<li>What actions were taken, and what changed as a result?</li>
</ul>
<p>Whether the measure involves medication adherence, preventive screenings, or member experience, the challenge is often the same: identifying the right intervention early enough to influence the outcome.</p>
<p>These decisions cannot be answered by visibility alone. They require trusted data, clear prioritization logic, workflow integration, and feedback loops that show whether an action worked.</p>
<p>This is where Stars intelligence needs to show up: in outreach planning, care management queues, quality interventions, and resource allocation. Not after the fact and not buried in another report. It needs to be available in the flow of work while the decision still matters.</p>
<h2><strong>How We Partner with Databricks to Close the Gap</strong></h2>
<p>Perficient and Databricks partner together to help health plans close the distance between data and action.</p>
<p>Databricks provides a governed foundation that brings claims, clinical, and social determinants of health data into a trusted environment for analytics and AI. Perficient helps health plans put that foundation to work. We define the governance, prioritization logic, and adoption strategy needed to move AI from concept to operational impact.</p>
<p>The goal is not another proof of concept. It is to help care managers, quality leaders, and operations teams make faster, better-informed decisions in the workflows that drive Star performance.</p>
<p>Our <a href="https://www.perficient.com/partners/databricks"><strong>Databricks Brickbuilder Specialization for Healthcare &amp; Life Sciences</strong></a> reflects that combination. It brings together technical depth on a governed platform with healthcare expertise that translates AI into measurable outcomes.</p>
<blockquote><p><strong><em>That&#8217;s exactly the kind of work we want partners to lead. We can provide the platform and accelerators, but healthcare expertise is critical to making the solutions real.” </em></strong><em>—</em> <strong><em>Matthew Giglia, Databricks</em></strong></p></blockquote>
<h2><strong>The Plans That Win Won&#8217;t Be the Ones with the Most Data</strong></h2>
<p>Health plans need to prioritize getting trusted information to the people who know what to do with it — while there is still time to change the outcome. That is the practical promise of AI in Stars performance.</p>
<p>Data, models, and platforms all matter. But they are infrastructure. The real advantage is the ability to decide and act faster than the plan next to you.</p>
<p>That&#8217;s what will move a Star rating next cycle: not another layer of data, but whether the member who needed the call got it in time.</p>
<p>Curious what else came up in health plan conversations at DAIS this year? See <a href="https://blogs.perficient.com/why-ai-stalls-for-health-plans-turning-data-into-action/"><strong>Why AI Stalls for Health Plans: Turning Data Into Action</strong></a> to see how this same issue is playing out across the industry.</p>
<p><a href="https://www.perficient.com/industries/healthcare-life-sciences"><strong><em>Connect with our Healthcare &amp; Life Sciences team</em></strong></a><em> to see what closing the distance between data and action could look like for your plan.</em></p>
<p>The post <a href="https://blogs.perficient.com/why-more-data-wont-fix-your-star-ratings/">Why More Data Won&#8217;t Fix Your Star Ratings</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-2257040260-1024x569.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">391944</post-id>	</item>
		<item>
		<title>AI Can Generate Your Designs Faster—But It Can&#8217;t Tell You Which Questions to Skip</title>
		<link>https://blogs.perficient.com/ai-can-generate-your-designs-faster-but-it-cant-tell-you-which-questions-to-skip/</link>
		
		<dc:creator><![CDATA[Sean Romer]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 20:44:25 +0000</pubDate>
				<category><![CDATA[Technical Expertise]]></category>
		<guid isPermaLink="false">https://blogs.perficient.com/?p=391938</guid>

					<description><![CDATA[<p>Artificial intelligence has changed the economics of UX design.  With tools like Figma Make, Copilot, and increasingly capable design assistants, teams can generate layouts, components,&#8230;</p>
<p>The post <a href="https://blogs.perficient.com/ai-can-generate-your-designs-faster-but-it-cant-tell-you-which-questions-to-skip/">AI Can Generate Your Designs Faster—But It Can&#8217;t Tell You Which Questions to Skip</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="auto">Artificial intelligence has changed the economics of UX design.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">With tools like Figma Make, Copilot, and increasingly capable design assistants, teams can generate layouts, components, flows, and interactive prototypes in a fraction of the time it once took. Work that previously required days can now be accomplished in hours—or even minutes.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">As a result, a question is becoming increasingly common:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><i><span data-contrast="auto">If AI can generate high-fidelity designs almost instantly, why bother with low-fidelity wireframes at all?</span></i><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">It&#8217;s a reasonable question. It&#8217;s also the wrong one.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">The assumption behind that question is that UX activities are simply increasingly polished versions of the same thing—that discovery becomes wireframes, wireframes become mockups, mockups become prototypes, and prototypes become products.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">If that were true, skipping straight to polished designs would be an obvious efficiency. But that isn&#8217;t how UX works.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><span data-contrast="none">UX Is Not a Screen Production Process</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">One of the most persistent misconceptions about UX is that its primary purpose is producing screens.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">It isn&#8217;t. The purpose of UX is reducing uncertainty.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Every activity in the UX process exists because there is a specific question the team needs answered before investing additional time, money, and effort. As those questions are answered, uncertainty decreases and confidence increases.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Viewed through that lens, the purpose of each activity becomes much clearer.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<table data-tablestyle="MsoTableGrid" data-tablelook="1184">
<tbody>
<tr>
<td data-celllook="65536"><b><span data-contrast="none">Activity</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="65536"><b><span data-contrast="none">Primary Question</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="0"><span data-contrast="auto">Discovery research</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Are we solving the right problem?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="65536"><span data-contrast="auto">Competitive analysis</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="65536"><span data-contrast="auto">What expectations already exist?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="0"><span data-contrast="auto">Heuristic evaluation</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">What usability issues already exist?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="65536"><span data-contrast="auto">Sketching</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="65536"><span data-contrast="auto">What possible approaches should we consider?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="0"><span data-contrast="auto">Low-fidelity wireframes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Is the information architecture and workflow correct?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="65536"><span data-contrast="auto">High-fidelity designs</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="65536"><span data-contrast="auto">Is the visual communication and interaction clear?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="0"><span data-contrast="auto">Interactive prototypes</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Does the experience behave as intended?</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr>
<td data-celllook="65536"><span data-contrast="auto">Usability testing</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="65536"><span data-contrast="auto">Can real users successfully accomplish their goals?</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<p><span data-contrast="auto">These are not interchangeable deliverables. They reduce different types of risk. A team that skips an activity is not simply skipping work. It&#8217;s choosing not to answer a particular question.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Sometimes that&#8217;s fine. Sometimes it&#8217;s expensive.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><span class="TextRun SCXW39763647 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW39763647 BCX0" data-ccp-parastyle="heading 2">Why Low-Fidelity Wireframes Still Matter</span></span><span class="EOP Selected SCXW39763647 BCX0" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">Consider the debate around skipping low-fidelity wireframes.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">There are certainly situations where moving directly to high-fidelity designs makes sense. If a product already has a mature design system, well-defined requirements, established user workflows, and a library of proven components, much of the structural uncertainty has already been resolved. In those situations, jumping directly into polished designs can be entirely appropriate.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Those situations exist. They&#8217;re just not the norm.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Most projects begin with incomplete requirements, evolving stakeholder expectations, competing priorities, and unanswered questions about user behavior. In those environments, low-fidelity wireframes provide value for a reason that has nothing to do with artistic skill or speed.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">They make change inexpensive.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Moving a box on a wireframe takes seconds. Changing a workflow takes minutes. Reworking a polished interface with dozens of components, interaction states, accessibility requirements, and responsive behaviors can take days.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">More importantly, low-fidelity artifacts change the conversation. When stakeholders see sketches and wireframes, they tend to discuss structure, content, priorities, and workflow. When stakeholders see polished interfaces, they often discuss colors, typography, spacing, and visual details. The more finished something looks, the less willing people become to question whether the underlying solution is correct.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span class="TextRun SCXW211102545 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW211102545 BCX0">Wireframes help teams evaluate the foundation before decorating the house.</span></span><span class="EOP Selected SCXW211102545 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><span data-contrast="none">AI Changes the Speed—Not the Purpose</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">This distinction is at the heart of AI&#8217;s impact on UX.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">AI can generate ten dashboard concepts in minutes. It can create navigation models, interface variations, onboarding flows, prototypes, and even production-ready code with remarkable speed.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">What it cannot determine is whether users need a dashboard in the first place.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Before any design should be evaluated, teams still need answers to questions such as:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li><span data-contrast="auto">Are we solving the right problem?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">What is creating friction today?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">What do users actually need?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Which assumptions have been validated?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">What outcome are we optimizing for?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Those aren&#8217;t design questions. They&#8217;re uncertainty questions. And uncertainty is what UX exists to reduce.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">AI is transforming how quickly teams create artifacts. It can generate concepts, suggest layouts, summarize research, automate documentation, produce code, and eliminate countless hours of repetitive work. What it has not changed is the purpose of the UX process.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">The goal was never simply to create screens. The goal was to learn enough about users, problems, and business needs to make informed decisions. AI accelerates execution. It does not eliminate uncertainty.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><span data-contrast="none">The Two Jobs of UX</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">One mental model helps explain where AI creates value—and where it doesn&#8217;t. Every UX project contains two fundamentally different jobs.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">Job #1: Creating Artifacts</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li><span data-contrast="auto">Sketches</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Wireframes</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Mockups</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Prototypes</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Specifications</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Job #2: Reducing Uncertainty</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li><span data-contrast="auto">Understanding users</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Identifying problems</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Aligning stakeholders</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Evaluating tradeoffs</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Validating assumptions</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li><span data-contrast="auto">Testing solutions</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">AI dramatically accelerates the first job. The second job remains where UX creates most of its strategic value. In fact, the faster artifact creation becomes, the more important the second job becomes. Producing the wrong thing quickly is still producing the wrong thing.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><span data-contrast="none">A More Useful Question</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">The most valuable question organizations can ask is not:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><i><span data-contrast="auto">Can we skip wireframes now that we have AI?</span></i><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Instead, ask:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">What uncertainty was this activity intended to reduce, and has that uncertainty already been resolved?</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">That question applies to wireframes, discovery research, usability testing, competitive analysis, stakeholder workshops, and every other UX activity. If the answer is </span><b><span data-contrast="auto">yes</span></b><span data-contrast="auto">, eliminating or compressing a step may be entirely reasonable. If the answer is </span><b><span data-contrast="auto">no</span></b><span data-contrast="auto">, the uncertainty hasn&#8217;t disappeared. It has simply been deferred to a later—and usually more expensive—point in the project.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><span data-contrast="none">The Real Impact of AI on UX</span><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">AI is reshaping UX processes. Some activities are becoming faster. Some are being combined. Some traditional deliverables are becoming less important than they once were.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">A designer who once sketched on paper may now generate concepts directly in a design tool. A team that previously created dedicated wireframes may move directly into editable prototypes.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">The artifacts may change. The questions do not. And those questions are the reason UX exists. Because the real value of UX has never been creating screens. It has always been reducing uncertainty before uncertainty becomes expensive.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">AI helps us produce answers faster. UX helps us make sure we&#8217;re answering the right questions.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p>The post <a href="https://blogs.perficient.com/ai-can-generate-your-designs-faster-but-it-cant-tell-you-which-questions-to-skip/">AI Can Generate Your Designs Faster—But It Can&#8217;t Tell You Which Questions to Skip</a> appeared first on <a href="https://blogs.perficient.com">Perficient Blogs</a>.</p>
]]></content:encoded>
					
		
		
			<media:content url="https://blogs.perficient.com/wp-content/uploads/2026/07/iStock-2208156879-1024x531.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">391938</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin


Served from: blogs.perficient.com @ 2026-07-31 08:41:27 by W3 Total Cache
-->