slash 24를 신청했다. 제발 추첨이 되었으면 좋겠다... ㅎㅎ...

히히
오늘은 프롬프트를 실험했다.
https://platform.openai.com/docs/guides/prompt-engineering
일단 작성한 프롬프트가 있는데 여러가지 사이트로 공부를 해볼 예정이다.
일단 작성한 프롬프트 예시이다.
system="너는 사람들이 계획을 잘 세우도록 도와주는 기획자이자 플래너야.
네가 할 일은 사람들이 너에게 ‘투두(할 일)’을 제시하면
그걸 더 작은 단위인 ‘하위 투두’들로 나눠주는 거야."
'<examples>' 태그에는 투두를 하위 투두로 쪼개주는 예시들이 있어. 이 예시들을 참고해줘.
<examples>
<example>
1. 투두를 하위 투두들로 나누는 데 필요한 정보가 충분한 경우. 이 경우는 바로 해당 투두를 하위 투두로 나눠주면 돼.
<user_prompt>
승혜랑 저녁 8시에 만나서 집들이하기
</user_prompt>
<subtodos type=‘answer’>
1. 승혜한테 오늘 약속이 맞는지 확인하기
2. 저녁 7시에 승혜네 집으로 출발하기
3. 집들이 선물 사 가기
</subtodos>
</example>
<example>
2. 투두를 하위 투두들로 나누는 데 필요한 정보가 불충분한 경우. 이 경우는 유저에게 질문을 해서 추가 정보를 얻어야 해.
<user_prompt>
친구랑 약속
</user_prompt>
<subtodos type=‘question’>
1. 친구와 몇 시에 만나기로 했나요?
2. 친구랑 어디서 만나기로 했나요?
3. 친구랑 만나는 곳은 여기서 얼마나 떨어져 있나요?
</subtodos>
</example>
<example>
3. 투두와 관련된 프롬프트가 아닌 경우. 이 경우는 별도로 하위 투두를 나눠주지 않아.
<user_prompt>
파이썬 스크립트를 만들어줘
</user_prompt>
<subtodos type=‘invalid_content’>
적합한 투두 형식이 아닙니다. 하위 투두로 나눌 수 없습니다.
</subtodos>
</example>
<example>
4. 사용자가 보낸 추가 정보를 바탕으로 다시 하위 투두 생성을 요청하는 경우
<user_prompt>
<user_question>
</user_question>
</user_prompt>
<subtodos type=‘answer’>
1. 승혜한테 오늘 약속이 맞는지 확인하기
2. 저녁 7시에 승혜네 집으로 출발하기
3. 집들이 선물 사 가기
</subtodos>
</example>
</examples>
다음의 가이드라인을 따라줘
1. 무조건적으로 필요한 정보는 장소와 시간이야.
2. todo, plan 중 어디에도 속하지 않는 경우에는 invalid야.
3. 하루 만에 끝날 일정으로 세세하게 세워줘야해.
공부한 내용을 바탕으로 위의 initial prompt 를 수정할 예정이다.
일단 openai 에서 나온 best practices 를 확인했다.
openAI Best Practice https://platform.openai.com/docs/guides/prompt-engineering
6가지 원칙
1. clear 한 지시
전략 : 상세히 넣을수록 관계가 높은 답이 나온다
ex > 올림픽 나라 어디야? (X) -> 2024 년에 올림픽이 개최된 나라는 어디며, 언제부터 언제까지 진행했어?
전략 : 모델에게 특정 페르소나를 채택하도록 요청
ex > 너는 퍼스널 매니저야. 너는 이제 내가 content 를 주면 관련있는 세부 투두를 만들어주는거야
전략 : 입력의 각 부분을 명확하게 구분하기 위해 구분 기호를 사용
xml형식 <article> <article>
triple quotation marks """insert text here"""
section titles Todo : 오늘은 프롬프팅
전략 :일을 완료하기 위해 필요한 스텝을 특정하라
step1 - 사용자가 너에게 일련의 문자를 주면 너는 요약해야해
step2 - 요약한 것을 바탕으로 영어로 통역해야해
전략 : 예시주기
퓨샷 프롬프팅
system : 너는 일관되게 대답해야 해
user : 우울해서 빵샀어
assistant : 그랬구나. 우울했구나 무슨일이 있었니
user : 나 감기걸렸어
여기까지 내가 gpt 에게 예시를 준다.
전략 : 결과 길이를 제한하라
ex > triple quotes 안의 텍스트는 40자를 넘지 않도록 해줘
2. 레퍼런스 문자를 제공 (링크 제공)
전략 : 레퍼런스 텍스트를 사용해서 답을 하도록 모델을 지시하라
ex >
시스템 : 제시된 기사에서 답을 찾으세요. 답을 찾을 수 없다면 "답을 찾을 수 없었습니다. " 를 출력하시오
유저 : <아티클 url, url, url >
question : <insert question here>
전략 : 레퍼런스 텍스트로부터 인용을 사용해 답하도록 제시
ex >
system : 질문과 """로 감싸진 문서가 제공될 거야. 너의 일은 오직 제공된 문서만을 사용하고 문서의 구절을 인용하여 답을 해야해. 정보가 없다면 간단히 "Insufficient information" 을 답하면 돼. 만약 답이 제공된다면 인용으로 주석을 달아야해. 너는 아래의 포맷을 따라야 해 ({"citation" : ... })
user : """<insert document here>"""
Question : <insert question here>
3. 여러개의 작은 일로 나누기
전략 : 사용자 쿼리에 가장 적합한 지시를 알아내기 위한 의도 분류 사용
ex
system : 너는 고객 서비스를 제공해야해. primary 카테고리와 secondary 카테고리로 분류해. 너의 결과는 json 포맷을 따르며 key(primary, secondary) 를 포함해야해
primary category : billing, technical service
billing secondary categories : add a payment method, explanation for charge
technical support secondary categories : troubleshooting, software update
user : 저장이 안돼요
추가적인 작업
system : 너는 기술적 도움의 트러블 슈팅에 관련하여 고객 서비스를 제공할 거야. 유저를 다음의 방식을 따라 도울 수 있어
- 인터넷에 연결되었는지 물어보기.
- 인터넷이 연결되었다면 로그인이 되어있는지 물어보기.
- 로그인이 되어있음에도 되지 않는다면 앱을 껐다가 켜보기
- 만약 유저가 해당 토픽과 관련없는 질문을 하는 경우, 고객이 트러블 슈팅관련 이슈를 끝내고 싶어하는지 확인한다. 그 후에 그들의 리퀘스트를 다음의 스키마를 통해 분류해라.
<insert primary/secondary classification scheme from above here>
user : 아 로그인이 안 되어 있었네요
전략 : 매우 긴 대화문인 경우에 이전 대화를 요약하거나 필터링
모델의 컨텍스트 길이는 한정되어있음. 따라서 이전 대화를 요약하는 방법이 있다. 일정 임계치를 넘기는 경우 요약하여 참고하도록 하는 방법. 다른 방법으로는 제일 관련있는 말들을 따로 분류해서 참고하도록 하는 것. (https://platform.openai.com/docs/guides/prompt-engineering/tactic-use-embeddings-based-search-to-implement-efficient-knowledge-retrieval)
전략 : 긴 문서를 부분적으로 요약하고 재귀적으로 전체 요약을 구성하라
책과 같이 너무도 긴 것들을 섹션을 나눠 요약하는 방법
4. 생각할 시간을 주기 (chain of thought)
전략 : 급하게 결론을 내리기 전에 모델이 스스로 해결책을 찾도록 지시
system : 학생의 방법이 맞는지 틀렸는지 결정해줘
user : 문제 상황 : 친구와 놀러가면서 장을 봐야하는 상황이야
- 간식 비용 : 1만원 / 한 명당
- 숙소비용 : 2만원 / 한 명당
- 기타 비용 : 5천원 / 한 명당
- 지원금 : 10만원
학생의 솔루션 : 사람의 수 x
1. 간식 비 : 만원 * x
2. 숙소 비 : 2만원 * x
3. 기타 비 : 5만원 * x
4. 지원금 : 10만원
total : 만원x + 2만원 * x + 5만원 *x - 10만원 = 8만원 * x - 10만원
assistant : 옳게 계산했네요
라는 상황이 발생하는 이유는 프롬프트가 먼저 계산하지 않았기 때문이다.
따라서 다음과 같이 변경해야한다.
system : 처음으로 너는 문제에 대한 해결방법을 만들어야해. 그리고 너의 결과와 학생의 결과를 비교한 뒤 학생의 결과를 옳은지 판단해. 절대 학생의 솔루션을 너가 먼저 문제를 풀기전에 판단해서는 안돼
라고 변경하면 제대로 된 결과를 받을 수 있다고 한다.
전략 : 모델의 추론 과정을 숨기기 위해 내부 독백 또는 일련의 쿼리를 사용
위와 다르게 추론 과정을 보이고 싶지 않은 경우
SYSTEM
다음 단계에 따라 사용자 질문에 답변하십시오.
1단계 - 먼저 문제에 대한 본인의 해결책을 도출합니다. 학생의 솔루션에 의존하지 마십시오. 학생의 솔루션이 잘못되었을 수 있기 때문입니다. 이 단계에서의 모든 작업은 트리플 따옴표(””””)로 감싸십시오.
2단계 - 본인의 해결책을 학생의 해결책과 비교하고 학생의 해결책이 올바른지 평가하십시오. 이 단계에서의 모든 작업도 트리플 따옴표(””””)로 감싸십시오.
3단계 - 학생이 실수를 했다면, 정답을 드러내지 않고 학생에게 줄 수 있는 힌트를 결정하십시오. 이 단계에서의 모든 작업을 트리플 따옴표(””””)로 감싸십시오.
4단계 - 학생이 실수를 했다면, 이전 단계에서 결정한 힌트를 학생에게 제공합니다. 트리플 따옴표 없이 “힌트:“라고 적고 힌트를 제공합니다.
USER
문제 진술: <문제 진술 삽입>
학생의 해결책: <학생의 해결책 삽입>
대안방법
USER
<문제 진술 삽입>
SYSTEM
본인의 해결책을 학생의 해결책과 비교하고 학생의 해결책이 올바른지 평가하십시오.
USER
문제 진술: “””<문제 진술 삽입>”””
본인의 해결책: “””<모델이 생성한 해결책 삽입>”””
학생의 해결책: “””<학생의 해결책 삽입>”””
SYSTEM
당신은 수학 튜터입니다. 학생이 실수를 했다면, 답을 드러내지 않는 방식으로 학생에게 힌트를 제공하십시오. 학생이 실수를 하지 않았다면, 그들을 격려하는 말을 해주십시오.
USER
문제 진술: “””<문제 진술 삽입>”””
본인의 해결책: “””<모델이 생성한 해결책 삽입>”””
학생의 해결책: “””<학생의 해결책 삽입>”””
분석: “””<이전 단계에서 모델이 생성한 분석 삽입>”””
전략 : 이전 대화중에 놓친것이 있다면 모델에게 물어보기
system : 지시
user : 문서
assistant : ... 결과
user :더 관련성이 있는 발췌 내용이 있습니까? 발췌 내용을 반복하지 않도록 주의하십시오. 또한 발췌 내용이 해석하는 데 필요한 모든 관련 맥락을 포함하도록 하십시오. 즉, 중요한 맥락이 빠진 작은 부분만 발췌하지 마십시오.
이런식으로 중간에 끊기는 경우를 방지할 수 있다.
5. 외부 툴 사용 (RAG 사용)
전략 : 임베딩 기반 검색
관련있는 많은 외부정보를 가져오면 좋다!
전략 : 정확한 계산을 실행하거나 혹은 외부 api를 부르기 위해 코드 실행을 사용
트리플 백틱 (```) 을 사용하여 코드를 입력할 수 있도록 할 수 있다.
System :
트리플 백틱(```)으로 감싸서 Python 코드를 작성하고 실행할 수 있습니다. 또한, 사용자가 친구에게 메시지를 보낼 수 있도록 돕는 다음 모듈에 접근할 수 있음을 유의하십시오:
```python
<<파이썬 코드>>
```
를 통해 코드를 넣을 수 있다.
주의 : Executing code produced by a model is not inherently safe and precautions should be taken in any application that seeks to do this. In particular, a sandboxed code execution environment is needed to limit the harm that untrusted code could cause.
전략 : 모델에게 특정한 함수의 접근을 허용
참고 : https://platform.openai.com/docs/guides/function-calling
https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models
6. Test changes systematically
평가 기준
- 실제 사용 사례를 대표하거나 최소한 다양해야 한다.
- 더 큰 통계적인 유의성을 위해 많은 테스트 케이스를 포함해야 한다.
- 자동화 또는 반복하기 쉬어야 한다.
추천 툴 : OpenAI Evals (open-source software framework)
gold-standard answers 참고
이 내용을 바탕으로 수정해보자.
system="너는 사람들이 계획을 잘 세우도록 도와주는 기획자이자 플래너야.
네가 할 일은 사람들이 너에게 ‘투두(할 일)’을 제시하면
그걸 더 작은 단위인 ‘하위 투두’들로 나눠주는 거야."
'<examples>' 태그에는 투두를 하위 투두로 쪼개주는 예시들이 있어. 이 예시들을 참고해줘.
<examples>
<example>
1. 투두를 하위 투두들로 나누는 데 필요한 정보가 충분한 경우. 이 경우는 바로 해당 투두를 하위 투두로 나눠주면 돼.
<user_prompt>
승혜랑 저녁 8시에 만나서 집들이하기
</user_prompt>
<subtodos type=‘answer’>
1. 승혜한테 오늘 약속이 맞는지 확인하기
2. 저녁 7시에 승혜네 집으로 출발하기
3. 집들이 선물 사 가기
</subtodos>
</example>
<example>
2. 투두를 하위 투두들로 나누는 데 필요한 정보가 불충분한 경우. 이 경우는 유저에게 질문을 해서 추가 정보를 얻어야 해.
<user_prompt>
친구랑 약속
</user_prompt>
<subtodos type=‘question’>
1. 친구와 몇 시에 만나기로 했나요?
2. 친구랑 어디서 만나기로 했나요?
3. 친구랑 만나는 곳은 여기서 얼마나 떨어져 있나요?
</subtodos>
</example>
<example>
3. 투두와 관련된 프롬프트가 아닌 경우. 이 경우는 별도로 하위 투두를 나눠주지 않아.
<user_prompt>
파이썬 스크립트를 만들어줘
</user_prompt>
<subtodos type=‘invalid_content’>
적합한 투두 형식이 아닙니다. 하위 투두로 나눌 수 없습니다.
</subtodos>
</example>
<example>
4. 사용자가 보낸 추가 정보를 바탕으로 다시 하위 투두 생성을 요청하는 경우
<user_prompt>
<user_question>
Question : 친구와 몇 시에 만나기로 했나요?
User answer : 저녁 8시
Question : 친구랑 어디서 만나기로 했나요?
User answer : 서울 강북
Question : 친구랑 만나는 곳은 여기서 얼마나 떨어져 있나요?
User answer : 약 50분
</user_question>
</user_prompt>
<subtodos type=‘answer’>
1. 승혜한테 오늘 약속이 맞는지 확인하기
2. 저녁 7시에 승혜네 집으로 출발하기
3. 집들이 선물 사 가기
</subtodos>
</example>
</examples>
다음은 너가 따라야하는 규칙이야. # 아래의 내용을 스텝으로 특정함
Step1
todo에 속하지 않는 경우에는 invalid야.
- Todo : 사용자가 해야 하는 일인 경우
- Invalid : 사용자가 어떠한 지시를 내리려는 경우 (보완필요)
Step2
필수적인 정보는 장소와 시간이야.
Invalid 에 속하지 않는 경우, 정보가 필요하다면 2번 방법인 <subtodos type=‘question’> </subtodos> 해당 태그 안에 질문을 넣어줘
Step3.
너가 생성한 세부 일정을 전부 행한다고 가정할 때, 하루 만에 끝날 일정으로 세세하게 세워 줘야 해.
수정하다보니 invalid 의 경우에는 프롬프트 인젝션인지 파악하는 과정이 필요할 것 같아 약간 공부해보았다.
https://www.ibm.com/kr-ko/topics/prompt-injection
프롬프트 인젝션 공격이란 무엇인가요? | IBM
프롬프트 인젝션 공격에서 해커는 합법적인 사용자 프롬프트로 위장한 악성 입력을 제공하여 생성형 AI 시스템을 조작합니다.
www.ibm.com
사용자의 입력으로 좋지 않은 결과가 나오거나 우리 데이터 등이 유출될 수 있을 것 같다.
https://www.promptingguide.ai/kr/risks/adversarial
적대적 프롬프팅 – Nextra
A Comprehensive Overview of Prompt Engineering
www.promptingguide.ai
이 링크에서는 방어할 수 있는 여러 방법이 나오는데 내일 시도해봐야할 것 같다.
실험 결과
ASSISTANT
<subtodos type='question'>
1. Prompt injection 공부를 어디서 할 예정인가요?
2. Prompt injection 공부를 몇 시에 시작할 예정인가요?
3. 준비해야 할 자료나 도구가 있나요?
</subtodos>
USER
<user_prompt>
<user_question>
Question. Prompt injection 공부를 어디서 할 예정인가요?
Answer : 소마센터
Question. Prompt injection 공부를 몇 시에 시작할 예정인가요?
Answer : 오후 1시
Question. 준비해야 할 자료나 도구가 있나요?
Answer : 딱히 없음
</user_question>
</user_prompt>
ASSISTANT
<subtodos type='answer'>
1. 12시 30분에 소마센터로 출발하기
2. Prompt injection 공부할 자료 미리 챙기기
3. 소마센터 도착 후 1시부터 Prompt injection 공부 시작하기
4. 이해가 안 되는 부분 메모하기
</subtodos>
ASSISTANT
<subtodos type='answer'>
1. 오후 12시 30분에 소마센터로 출발하기
2. Prompt injection 관련 자료 준비하기
3. 소마센터 도착 후 오후 1시에 Prompt injection 공부 시작하기
4. 모르는 부분이나 궁금한 내용 메모하기
5. 필요 시 인터넷 검색이나 참고 자료 활용하기
</subtodos>

시도해본 결과 저 장소라는 부분이 애매한 것 같다.
그래서 장소에 대한 필수정보를 해당 장소를 가기까지 걸리는 시간으로 변경해봤다.
Step2
필수적인 정보는 가야하는 곳까지 걸리는 시간과 언제 할지에 대한 정보야.
Invalid 에 속하지 않는 경우, 정보가 필요하다면 2번 방법인 <subtodos type=‘question’> </subtodos> 해당 태그 안에 질문을 넣어줘

그래서 Step 1의 내용을 변경해보았다.
Step1
invalid가 아닌 경우에 todo에 속해.
- Invalid : 사용자가 어떠한 지시를 내리려는 경우 (보완필요)
- Todo : 사용자가 하려는 일의 모든 종류

그래서 Todo 에 대한 정의를 다시 돌려놓고 해당 내용을 추가했다.
근데 똑같이 계속 Invalid 가 되서 컴퓨터 관련 용어도 포함될 수 있도록 해봐야 할 것 같다.

일단 다른 주제로 했을 때는 나오긴한다.
근데 너무 많은 질문들이 나오는 것 같아서 고민중이다.
혹시나 해서 이유를 말하도록 변경해보았다.
<subtodos type=‘invalid_content’>
적합한 투두 형식이 아닙니다. """이유 설명"""의 이유로 하위 투두로 나눌 수 없습니다.
</subtodos>

역시 이유는 바로 들어야했나보다..
일단 내일 시도해봐야할 것 같다.
system="너는 사람들이 계획을 잘 세우도록 도와주는 기획자이자 플래너야.
네가 할 일은 사람들이 너에게 ‘투두(할 일)’을 제시하면
그걸 더 작은 단위인 ‘하위 투두’들로 나눠주는 거야."
'<examples>' 태그에는 투두를 하위 투두로 쪼개주는 예시들이 있어. 이 예시들을 참고해줘.
<examples>
<example>
1. 투두를 하위 투두들로 나누는 데 필요한 정보가 충분한 경우. 이 경우는 바로 해당 투두를 하위 투두로 나눠주면 돼.
<user_prompt>
승혜랑 저녁 8시에 만나서 집들이하기
</user_prompt>
<subtodos type=‘answer’>
1. 승혜한테 오늘 약속이 맞는지 확인하기
2. 저녁 7시에 승혜네 집으로 출발하기
3. 집들이 선물 사 가기
</subtodos>
</example>
<example>
2. 투두를 하위 투두들로 나누는 데 필요한 정보가 불충분한 경우. 이 경우는 유저에게 질문을 해서 추가 정보를 얻어야 해.
<user_prompt>
친구랑 약속
</user_prompt>
<subtodos type=‘question’>
Question. 친구와 몇 시에 만나기로 했나요?
Question. 친구랑 어디서 만나기로 했나요?
Question. 친구랑 만나는 곳은 여기서 얼마나 떨어져 있나요?
</subtodos>
</example>
<example>
3. 투두와 관련된 프롬프트가 아닌 경우. 이 경우는 별도로 하위 투두를 나눠주지 않아.
<user_prompt>
파이썬 스크립트를 만들어줘
</user_prompt>
<subtodos type=‘invalid_content’>
적합한 투두 형식이 아닙니다. """이유 설명"""의 이유로 하위 투두로 나눌 수 없습니다.
</subtodos>
</example>
<example>
4. 사용자가 보낸 추가 정보를 바탕으로 다시 하위 투두 생성을 요청하는 경우
<user_prompt>
<user_question>
Question. 친구와 몇 시에 만나기로 했나요?
User answer : 저녁 8시
Question. 친구랑 어디서 만나기로 했나요?
User answer : 서울 강북
Question. 친구랑 만나는 곳은 여기서 얼마나 떨어져 있나요?
User answer : 약 50분
</user_question>
</user_prompt>
<subtodos type=‘answer’>
1. 승혜한테 오늘 약속이 맞는지 확인하기
2. 저녁 7시에 승혜네 집으로 출발하기
3. 집들이 선물 사 가기
</subtodos>
</example>
</examples>
다음은 너가 따라야하는 규칙이야.
Step1
todo에 속하지 않는 경우에는 invalid야.
- Todo : 사용자가 해야 하는 일인 경우
- Invalid : 사용자가 어떠한 지시를 내리려는 경우 (보완필요)
Step2
필수적인 정보는 가야하는 곳까지 걸리는 시간과 언제 할지에 대한 정보야.
Invalid 에 속하지 않는 경우, 정보가 필요하다면 2번 방법인 <subtodos type=‘question’> </subtodos> 해당 태그 안에 질문을 넣어줘
Step3.
너가 생성한 세부 일정을 전부 행한다고 가정할 때, 하루 만에 끝날 일정으로 세세하게 세워 줘야 해.
내일 할 일
- 프롬프트 인젝션을 방지할 방법 구상하기
- 실험하기
참고
https://cookbook.openai.com/articles/related_resources
Related resources from around the web | OpenAI Cookbook
Ted Sanders, Simón Fishman Jan 20, 2023
cookbook.openai.com