Skip to content

Instantly share code, notes, and snippets.

@rkttu
Last active April 5, 2024 22:34
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rkttu/bca3abf3040253a505588e58b2027cb9 to your computer and use it in GitHub Desktop.
Save rkttu/bca3abf3040253a505588e58b2027cb9 to your computer and use it in GitHub Desktop.
GPT Prompt Builder

프롬프트 엔지니어링 도우미 C# 클래스

이 코드 샘플에서는 특정 조건과 요구 사항을 가진 GPT 모델을 위한 프롬프트를 구성하는 클래스와 메소드를 제공합니다.

코드는 사용자의 직업, 언어 선호도, 과거 경험, 현재 상황, 수행해야 할 작업과 같은 특정 조건을 포함한 프롬프트 구축 방법을 보여줍니다. 또한, 사용자의 이해를 요청하는 방법도 제시합니다. 구현은 가독성이 좋고 사용하기 쉬운 플루언트 인터페이스 패턴을 활용합니다.

예시 1

테크니컬 라이터로서 모바일 앱에 대한 설치 가이드를 작성해야 하는 상황을 표현하기 위해 다음과 같이 코드를 작성할 수 있습니다.

var prompt = string.Empty;

prompt = Prompt
  .Begin()
  .YouAre("전문적인 테크니컬 라이터")
  .YourLanguage(
    new CultureInfo("ko-KR")
  )
  .YouWereBefore(
    "테크니컬 라이터로 일한지 10년 이상 되었음"
  )
  .YouAreNow(
    "IT 기술 지식을 갖추고 있음",
    "새로운 모바일 날씨 앱을 출시하는 팀에서 일하고 있음"
  )
  .YouShouldDo(
    "QA 팀을 위한 앱 테스트 빌드 단말 설치 가이드 작성을 해야 합니다.",
    "단계별로 가이드를 작성하며, 각 단계별로 스크린샷을 삽입해야 합니다."
  )
  .IfYouUnderstoodSay("알겠습니다.")
  .ToString();

만들어지는 프롬프트 문자열은 다음과 같습니다.

You are:
- 전문적인 테크니컬 라이터

Your language is 한국어(대한민국).

You were before:
- 테크니컬 라이터로 일한지 10년 이상 되었음

You are now:
- IT 기술 지식을 갖추고 있음
- 새로운 모바일 날씨 앱을 출시하는 팀에서 일하고 있음

You should do:
- QA 팀을 위한 앱 테스트 빌드 단말 설치 가이드 작성을 해야 합니다.
- 단계별로 가이드를 작성하며, 각 단계별로 스크린샷을 삽입해야 합니다.

Say '알겠습니다.' if you understood those request.

예시 2

특정 기능을 수행하는 웹 API를 흉내내는 상황을 표현하기 위하여 다음과 같이 코드를 작성할 수 있습니다.

prompt = Prompt
  .Begin()
  .YouAre("피보나치 수열을 반환하는 웹 API")
  .YouShouldDo(
    "[length]개의 정수로 이루어진 배열을 반환함",
    "데이터는 JSON 배열로 반환해야 함",
    "다른 내용은 말하지 말고 JSON 배열만 반환해야 함"
  )
  .ToString();

만들어지는 프롬프트 문자열은 다음과 같습니다.

You are:
- 피보나치 수열을 반환하는 웹 API

Your language is 영어(미국).

You should do:
- [length]개의 정수로 이루어진 배열을 반환함
- 데이터는 JSON 배열로 반환해야 함
- 다른 내용은 말하지 말고 JSON 배열만 반환해야 함

위의 프롬프트를 주입한 후 다음과 같이 프롬프트를 작성하면, 가변 길이의 JSON 정수 배열을 만들 수 있습니다.

[length]: 3
[length]: 5
[length]: 10

라이선스

이 코드 샘플은 MIT 라이선스를 따릅니다.

using System;
using System.Globalization;
public static class Program
{
private static void Main()
{
var prompt = string.Empty;
prompt = Prompt
.Begin()
.YouAre("전문적인 테크니컬 라이터")
.YourLanguage(
new CultureInfo("ko-KR")
)
.YouWereBefore(
"테크니컬 라이터로 일한지 10년 이상 되었음"
)
.YouAreNow(
"IT 기술 지식을 갖추고 있음",
"새로운 모바일 날씨 앱을 출시하는 팀에서 일하고 있음"
)
.YouShouldDo(
"QA 팀을 위한 앱 테스트 빌드 단말 설치 가이드 작성을 해야 합니다.",
"단계별로 가이드를 작성하며, 각 단계별로 스크린샷을 삽입해야 합니다."
)
.IfYouUnderstoodSay("알겠습니다.")
.ToString();
Console.Out.WriteLine(prompt);
Console.Out.WriteLine(new string('-', 40));
prompt = Prompt
.Begin()
.YouAre("피보나치 수열을 반환하는 웹 API")
.YouShouldDo(
"[length]개의 정수로 이루어진 배열을 반환함",
"데이터는 JSON 배열로 반환해야 함",
"다른 내용은 말하지 말고 JSON 배열만 반환해야 함"
)
.ToString();
Console.Out.WriteLine(prompt);
}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
public class Prompt
{
public static Prompt Begin() => new Prompt();
private List<string> _youAre = new List<string>();
private CultureInfo _yourLangauge = CultureInfo.GetCultureInfo("en-US");
private List<string> _youWereBefore = new List<string>();
private List<string> _youAreNow = new List<string>();
private List<string> _youShouldDo = new List<string>();
private string _understoodSegment = string.Empty;
public virtual Prompt YouAre(params string[] segments)
{
_youAre.AddRange(segments);
return this;
}
public virtual Prompt YourLanguage(CultureInfo culture)
{
_yourLangauge = culture ?? CultureInfo.GetCultureInfo("en-US");
return this;
}
public virtual Prompt YouWereBefore(params string[] segments)
{
_youWereBefore.AddRange(segments);
return this;
}
public virtual Prompt YouAreNow(params string[] segments)
{
_youAreNow.AddRange(segments);
return this;
}
public virtual Prompt YouShouldDo(params string[] segments)
{
_youShouldDo.AddRange(segments);
return this;
}
public virtual Prompt IfYouUnderstoodSay(string understoodSegment)
{
_understoodSegment = understoodSegment;
return this;
}
public override string ToString()
{
var sb = new StringBuilder();
if (_youAre != null && _youAre.Any())
{
sb.AppendLine("You are:");
sb.AppendLine(string.Join(Environment.NewLine, _youAre.Select(x => $"- {x}")));
sb.AppendLine();
}
if (_yourLangauge != null)
{
sb.AppendLine($"Your language is {_yourLangauge.DisplayName}.");
sb.AppendLine();
}
if (_youWereBefore != null && _youWereBefore.Any())
{
sb.AppendLine("You were before:");
sb.AppendLine(string.Join(Environment.NewLine, _youWereBefore.Select(x => $"- {x}")));
sb.AppendLine();
}
if (_youAreNow != null && _youAreNow.Any())
{
sb.AppendLine("You are now:");
sb.AppendLine(string.Join(Environment.NewLine, _youAreNow.Select(x => $"- {x}")));
sb.AppendLine();
}
if (_youShouldDo != null && _youShouldDo.Any())
{
sb.AppendLine("You should do:");
sb.AppendLine(string.Join(Environment.NewLine, _youShouldDo.Select(x => $"- {x}")));
sb.AppendLine();
}
if (!string.IsNullOrWhiteSpace(_understoodSegment))
sb.AppendLine($"Say '{_understoodSegment}' if you understood those request.");
return sb.ToString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment