<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: corridor project</title>
    <description>The latest articles on DEV Community by corridor project (@pj-corridor).</description>
    <link>https://dev.to/pj-corridor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4136824%2F823de776-b646-4464-813f-1e6b5ebaea4b.png</url>
      <title>DEV Community: corridor project</title>
      <link>https://dev.to/pj-corridor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pj-corridor"/>
    <language>en</language>
    <item>
      <title>What to do in such situations: Developing an app integrated with generative AI</title>
      <dc:creator>corridor project</dc:creator>
      <pubDate>Tue, 22 Sep 2026 05:04:43 +0000</pubDate>
      <link>https://dev.to/pj-corridor/what-to-do-in-such-situations-developing-an-app-integrated-with-generative-ai-21f4</link>
      <guid>https://dev.to/pj-corridor/what-to-do-in-such-situations-developing-an-app-integrated-with-generative-ai-21f4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnakayama-kazuki%2F202x%2Fmain%2Fpj-corridor.net%2Fpersonalitytest%2Fblog%2Ftitle.png" class="article-body-image-wrapper"&gt;&lt;img width="800" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnakayama-kazuki%2F202x%2Fmain%2Fpj-corridor.net%2Fpersonalitytest%2Fblog%2Ftitle.png" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello, I’m pj-corridor, an engineer. In this article, I will introduce the challenges I faced while developing an application integrated with generative AI, such as dealing with abuse and navigating trial-and-error and trade-offs in prompt tuning. I previously had the opportunity to work with Synergy Marketing, and I am grateful that they kindly agreed to publish this article on the TECHSCORE BLOG 😊 Thank you very much.&lt;/p&gt;

&lt;p&gt;First, please try the personality assessment app I initially developed. The annoying ads 😆 can be hidden by adjusting the window width.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pj-corridor.net/personalitytest/OpenCAPS.html" rel="noopener noreferrer"&gt;CAPS (= Controller, Analyzer, Promoter, Supporter) assessment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pj-corridor.net/personalitytest/OpenDiSC.html" rel="noopener noreferrer"&gt;DiSC (= Drive, Influence, Steadiness, Compliance) assessment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like the popular MBTI, CAPS and DiSC are so-called pseudoscientific personality assessments. They should not be used as a basis for decision-making, but for example, having workshop participants share their results can help energize self-introduction sessions and warm up the atmosphere. Please consider using this assessment app on such occasions.&lt;/p&gt;

&lt;p&gt;For reference, here is my CAPS assessment result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnakayama-kazuki%2F202x%2Fmain%2Fpj-corridor.net%2Fpersonalitytest%2Fblog%2Fsample.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnakayama-kazuki%2F202x%2Fmain%2Fpj-corridor.net%2Fpersonalitytest%2Fblog%2Fsample.png" width="610" height="1424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The advice and user manual are generated by AI, but the sudden appearance of “Respondent” in Japanese sentences feels a bit unnatural. In this way, while generative AI provides rich expressive capabilities, it also introduces quality risks. That said, I wanted to keep the cost of ensuring quality within the scope of a hobby project. Therefore, I kept the rule-based scoring logic deterministic and limited the generative AI output to supplementary text, thereby controlling the impact of hallucinations.&lt;/p&gt;

&lt;p&gt;From here, I will introduce concrete examples of trial and error and how I approached trade-offs, divided into three chapters.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Abuse prevention
&lt;/h2&gt;

&lt;p&gt;The assessment app can be accessed anonymously, but the backend uses a paid generative AI service (Amazon Bedrock). Therefore, being overwhelmed by bot abuse is a plausible scenario. However, rather than aiming to eliminate all threats, I adopted a basic policy of considering the attacker’s incentives: “accept threats with low manifestation risk, and mitigate the rest.”&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1. Blocking common attack traffic with WAF
&lt;/h3&gt;

&lt;p&gt;For WAF, referring to AWS’s standard protection pack, I adopted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GeoRule&lt;/code&gt; (blocking IPs from regions with frequent attacks)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS-AWSManagedRulesAmazonIpReputationList&lt;/code&gt; (blocking known malicious IPs)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS-AWSManagedRulesAnonymousIpList&lt;/code&gt; (blocking anonymized/tunneled IPs)&lt;/li&gt;
&lt;li&gt;A tuned &lt;code&gt;GlobalRateBasedRule&lt;/code&gt; for the assessment app (request rate limiting)&lt;/li&gt;
&lt;li&gt;A tuned &lt;code&gt;RateBasedRulePOST&lt;/code&gt; (limiting POST/PUT/DELETE requests)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and removed unnecessary rules such as &lt;code&gt;AWS-AWSManagedRulesSQLiRuleSet&lt;/code&gt;. However, when using a Lambda Function URL as a public endpoint, there is concern that requests not routed through CloudFront could bypass the WAF. While it is possible to enforce CloudFront (and thus WAF) routing, doing so would require AWS-specific implementations, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Changing the Lambda Function URL &lt;code&gt;AuthType&lt;/code&gt; to &lt;code&gt;AWS_IAM&lt;/code&gt; and using CloudFront OAC
👉 This requires support for &lt;code&gt;x-amz-content-sha256&lt;/code&gt; in POST requests&lt;/li&gt;
&lt;li&gt;Adding a secret header in CloudFront and verifying it in Lambda
👉 This requires managing multiple environment variables and verification logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In any case, AWS-dependent implementation would be necessary. Considering the risk that a malicious actor could discover the Lambda Function URL and bypass the WAF, I decided not to implement this measure for now.&lt;/p&gt;

&lt;p&gt;As a side note, settings configured in the AWS console are easy to forget. Forgetting to revert temporary settings can cause issues. To avoid this, I recommend managing managed service configurations in a repository (something close to IaC).&lt;/p&gt;

&lt;p&gt;For example, for a WAF protection pack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manage the &lt;a href="https://github.com/nakayama-kazuki/202x/blob/main/.github/workflows/WAFPolicyApiCorridor.json" rel="noopener noreferrer"&gt;JSON&lt;/a&gt; as the Source of Truth in the repository
&lt;/li&gt;
&lt;li&gt;Always apply changes via Source of Truth → AWS console
&lt;/li&gt;
&lt;li&gt;Check consistency between Source of Truth and the applied WAF policy via &lt;a href="https://github.com/nakayama-kazuki/202x/blob/main/.github/workflows/deploy-corridor.yml#L49" rel="noopener noreferrer"&gt;CI&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, as a follow-up: with the traffic scale of this app, the fixed cost of WAF ended up exceeding the usage-based cost of Bedrock. A good lesson in estimating costs 😅. Going forward, I am considering suspending WAF until traffic increases and instead implementing POST request limits using DynamoDB.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2. Controlling access from simple bots and browsers bypassing the flow
&lt;/h3&gt;

&lt;p&gt;For access control, I implemented:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When accessing the app, generate a token from “secret information + timestamp” and send it via &lt;code&gt;Set-Cookie&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The browser includes the token in requests using &lt;code&gt;credentials: 'include'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The server validates that the token could have been generated within a human response time window&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additionally, I applied:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SameSite=Strict&lt;/code&gt; to block cookies in cross-domain POST requests (see &lt;a href="https://blog.techscore.com/entry/2023/10/06/110100" rel="noopener noreferrer"&gt;SameSite explanation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Restricting &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; to a whitelist to limit browser-based access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measures can be bypassed by more sophisticated bots, but I decided to start within the scope of the basic policy and consider additional measures while monitoring access patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Technology selection
&lt;/h2&gt;

&lt;p&gt;Here I describe trial and error related to Lambda and API Gateway.&lt;/p&gt;

&lt;p&gt;Lambda was a reasonable choice for the runtime environment, but I initially preferred:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lambda container image (using PHP)&lt;/li&gt;
&lt;li&gt;Lambda zip deployment (using Python/Node)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I leaned toward (1) because I already had a local PHP testing environment, which seemed suitable for agile development and testing. However, considering compatibility with Lambda and concerns about CI complexity, I ultimately chose (2). In hindsight, I spent more time dealing with AWS environment nuances and black-box behavior, so it turned out to be the right choice.&lt;/p&gt;

&lt;p&gt;Speaking of trial and error, repeatedly creating Lambda functions via the AWS console automatically generates new IAM roles each time. Not just these remnants, but leaving unused resources can become technical debt, so they should be cleaned up promptly.&lt;/p&gt;

&lt;p&gt;I resisted the urge to jump into development and prepared a mechanism to handle Lambda and test environments transparently.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/nakayama-kazuki/202x/blob/main/testenv/scripts/template.py" rel="noopener noreferrer"&gt;Shared Python template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nakayama-kazuki/202x/blob/main/testenv/scripts/restart-python.bat" rel="noopener noreferrer"&gt;Test environment launcher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This later became the foundation for prompt tuning.&lt;/p&gt;

&lt;p&gt;As for whether to use API Gateway:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Custom access control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routing&lt;/td&gt;
&lt;td&gt;Handled within Lambda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throttling&lt;/td&gt;
&lt;td&gt;Handled by WAF (planned to change)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Given this, I decided not to use API Gateway at this stage, as the cost outweighed the benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Application development
&lt;/h2&gt;

&lt;p&gt;With abuse prevention and technology selection in place, it was time for development. Once completed, I wanted to share it globally via Reddit. That led to the motivation to support multiple languages, so I implemented a simple i18n class to support 9 languages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GREETING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;en&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ja&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;こんにちは&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bonjour&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;de&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hallo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;es&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hola&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pt&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Olá&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;hi&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;नमस्ते&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ko&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;안녕하세요&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;zh&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;你好&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To stabilize AI output quality, I used the user’s native language for UI but fixed the AI input language to English.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnakayama-kazuki%2F202x%2Fmain%2Fpj-corridor.net%2Fpersonalitytest%2Fblog%2Farch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnakayama-kazuki%2F202x%2Fmain%2Fpj-corridor.net%2Fpersonalitytest%2Fblog%2Farch.png" width="799" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also unified state management, UI components, and interfaces with Lambda/test environments between DiSC and CAPS, enabling reuse for future assessments like MBTI.&lt;/p&gt;

&lt;p&gt;Finally, I focused on improving and stabilizing AI output quality through prompt tuning. Instead of rushing, I first built a foundation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prepare shortcut features for prompt generation

&lt;ul&gt;
&lt;li&gt;For example, “random answers + query execution” automation
&lt;/li&gt;
&lt;li&gt;Abuse prevention via hash-based validation
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tune in a test environment (without AI connection)

&lt;ol&gt;
&lt;li&gt;Execute shortcut
&lt;/li&gt;
&lt;li&gt;Output prompts to console
&lt;/li&gt;
&lt;li&gt;Simulate production using Gemini/ChatGPT and evaluate
&lt;/li&gt;
&lt;li&gt;Iterate prompt/template improvements
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Tune in production (with AI connection)

&lt;ol&gt;
&lt;li&gt;Partial tuning via shortcut
&lt;/li&gt;
&lt;li&gt;Full app testing and final checks&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During this process, I discovered missing outputs in &lt;code&gt;hi&lt;/code&gt;, &lt;code&gt;ko&lt;/code&gt;, and &lt;code&gt;zh&lt;/code&gt;, likely due to token differences across languages.&lt;/p&gt;

&lt;p&gt;Also, AI suggestions tend to bloat prompts with redundant instructions, so consolidating and refactoring prompt structure is recommended.&lt;/p&gt;

&lt;p&gt;Finally, about “Respondent”: the requirement was to fix the subject as colleagues/friends while referring to the user consistently. Attempts like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...use the {{lang}} term for "Respondent".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;resulted in “you,” while banning pronouns led to “Respondent.” To stabilize output, I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;always use the fixed keyword "_RESPONDENT_"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and replaced it client-side 😅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RESPONDENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;en&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Respondent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ja&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;回答者&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Répondant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;de&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Befragter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;es&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Encuestado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pt&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Respondente&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;hi&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;उत्तरदाता&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ko&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;응답자&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;zh&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;受访者&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thank you for reading. In this project, I focused on structuring prompt tuning while controlling hallucination impact. Future improvements may include automated output quality checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule-based validation of format and keywords
&lt;/li&gt;
&lt;li&gt;Using one AI to evaluate another AI’s output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope my trial-and-error and trade-off decisions are helpful to you.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>lambda</category>
      <category>promptengineering</category>
    </item>
  </channel>
</rss>
