프롬프트 고급 팁: 의사 코드를 사용한 LLM 출력의 정밀한 제어 및 실행 로직 정의

AI 기술 자료10개월 전 업데이트 Sharenet.ai
1.3K 0
吐司AI

아시다시피 대규모 언어 모델이 작업을 수행하도록 해야 할 때는 자연어를 사용하여 설명하는 프롬프트를 입력해 실행을 안내해야 합니다. 간단한 작업의 경우 "다음을 중국어 간체로 번역해 주세요:", "다음의 요약을 생성해 주세요:" 등과 같이 자연어로 명확하게 설명할 수 있습니다.

그러나 모델에서 특정 JSON 형식을 생성해야 하거나 작업에 여러 가지 분기가 있고 각 분기가 여러 하위 작업을 실행해야 하며 하위 작업이 서로 상호 연관되어 있는 등 복잡한 작업이 발생하면 자연어 설명만으로는 충분하지 않습니다.

토론 주제

다음은 계속 읽기 전에 생각해 볼 만한 두 가지 질문입니다:

  1. 여러 개의 긴 문장이 있는데, 각 문장을 80자 이하의 짧은 문장으로 분할한 다음 긴 문장과 짧은 문장 사이의 대응을 명확하게 설명하는 JSON 형식으로 출력해야 합니다.

예를 들어

[
{
"long": "This is a long sentence that needs to be split into shorter sentences.",
"short": [
"This is a long sentence",
"that needs to be split",
"into shorter sentences."
]
},
{
"long": "Another long sentence that should be split into shorter sentences.",
"short": [
"Another long sentence",
"that should be split",
"into shorter sentences."
]
}
]
  1. 대화 정보만 있는 원본 자막 텍스트에서 챕터, 화자를 추출한 다음 챕터 및 단락별로 대화를 나열해야 합니다. 화자가 여러 명인 경우 각 대화 앞에 화자를 붙여야 하며, 같은 화자가 연속적으로 말하는 경우에는 그렇지 않습니다. (이것은 실제로 제가 동영상 스크립트를 정리할 때 사용하는 GPT입니다. 비디오 스크립트 데이터 정렬 GPT)

입력 예시:

所以我要引用一下埃隆·马斯克的话,希望你不要介意。
我向你道歉。
但他并不认同这是一个保障隐私和安全的模型。
他将这种集成称为"令人毛骨悚然的间谍软件"。你对此有什么回应?
不在意?
那是他的观点。
显然,我不这么认为。
我们也不这么认为。
Mira,感谢你能和我们在一起。
我知道你可能稍微有点忙。
我有许多问题想向 Mira 提问,但我们只有 20 分钟。
所以我想先设定一下大家的期望。
我们会专注于一些主题, 包括一些近期的新闻和 Mira 作为首席技术官所负责的一些领域。
希望我们能深入探讨其中的一些话题。
我想我第一个问题是, 考虑到你现在极其忙碌, 以及新闻的攻击, 有些好有些坏, 你大约六年前加入了这个公司。
那时,它是一个截然不同的组织。
你相对低调,不太为人知晓。
你是否怀念那些能够全神贯注工作的日子?
我想说,我们依旧全神贯注在工作中。
只不过工作的内容已经发展变化了,它不仅仅关乎研究。
也是因为,你知道,研究已经得到了很大的进展。
这也是关于我们如何以一种有益且安全的方式将这种技术引入到世界中所以,使命依然如一, 我们在研究上也已经取得了很多进展,工作领域也在不断扩大。
公众对此的关注度也很高, 这对于我们这些正在研究技术和开发产品的人来说可能会感到有些不同寻常。
但你要知道, 鉴于我们所做的事情的重要性,这种关注是非常必要的, 而且这是积极的。

샘플 출력:

### 引言

**主持人**:
所以我要引用一下埃隆·马斯克的话,希望你不要介意。我向你道歉,但他并不认同这是一个保障隐私和安全的模型。他将这种集成称为"令人毛骨悚然的间谍软件"。你对此有什么回应?

**Mira**:
那是他的观点。显然,我不这么认为。我们也不这么认为。

### 欢迎与介绍

**主持人**:
Mira,感谢你能和我们在一起。我知道你可能稍微有点忙。我有许多问题想向你提问,但我们只有 20 分钟。所以我想先设定一下大家的期望。我们会专注于一些主题,包括一些近期的新闻和你作为首席技术官所负责的一些领域。希望我们能深入探讨其中的一些话题。

### 职业生涯回顾

**主持人**:
我想我第一个问题是,考虑到你现在极其忙碌,以及新闻的攻击,有些好有些坏,你大约六年前加入了这个公司。那时,它是一个截然不同的组织。你相对低调,不太为人知晓。你是否怀念那些能够全神贯注工作的日子?

**Mira**:
我想说,我们依旧全神贯注在工作中。只不过工作的内容已经发展变化了,它不仅仅关乎研究。也是因为,研究已经得到了很大的进展。这也是关于我们如何以一种有益且安全的方式将这种技术引入到世界中。所以,使命依然如一,我们在研究上也已经取得了很多进展,工作领域也在不断扩大。公众对此的关注度也很高,这对于我们这些正在研究技术和开发产品的人来说可能会感到有些不同寻常。但你要知道,鉴于我们所做的事情的重要性,这种关注是非常必要的,而且这是积极的。

프롬프트의 본질

온라인에서 프롬프트 작성 방법에 관한 글을 많이 읽고 프롬프트 템플릿을 많이 외우셨겠지만 프롬프트의 본질은 무엇일까요? 프롬프트가 필요한 이유는 무엇인가요?

프롬프트는 기본적으로 자연어로 설명되는 LLM에 대한 제어 명령으로, LLM이 요구 사항을 이해하고 필요에 따라 입력을 원하는 출력으로 전환할 수 있도록 해줍니다.

예를 들어, 일반적으로 사용되는 소수 샷 기법은 예제를 통해 LLM이 우리의 요구 사항을 이해하도록 한 다음 샘플을 참조하여 원하는 결과를 출력하는 것입니다. 예를 들어, CoT(Chain of Thought)는 작업을 인위적으로 분해하고 실행 프로세스를 제한하여 LLM이 너무 분산되거나 핵심 단계를 건너뛰지 않고 우리가 지정한 프로세스와 단계를 따라 더 나은 결과를 얻을 수 있도록 하는 것입니다.

마치 우리가 학창 시절에 선생님이 수학 정리를 이야기할 때 예를 들어 설명해줘야 정리의 의미를 이해할 수 있고, 실험을 할 때 실험의 단계를 알려줘야 실험의 원리를 이해하지 못해도 단계에 따라 실험을 수행하면 어느 정도 같은 결과를 얻을 수 있었던 것처럼 말입니다.

프롬프트의 결과가 가끔 최적이 아닌 경우가 있는 이유는 무엇인가요?

이는 LLM이 당사의 요구 사항을 정확하게 이해할 수 없기 때문인데, 이는 한편으로는 LLM의 이해 및 지침 준수 능력과 다른 한편으로는 프롬프트 설명의 명확성과 정확성에 의해 제한됩니다.

의사 코드를 사용하여 LLM의 출력을 정밀하게 제어하고 실행 로직을 정의하는 방법

프롬프트는 본질적으로 LLM의 제어 명령어이므로 기존의 자연어 설명에 국한되지 않고 의사 코드를 사용하여 LLM의 출력을 정확하게 제어하고 실행 로직을 정의하는 데 프롬프트를 작성할 수 있습니다.

의사 코드란 무엇인가요?

사실 의사 코드는 오랜 역사를 가지고 있습니다. 의사 코드는 알고리즘을 설명하는 형식적인 설명 방법으로, 알고리즘의 단계와 과정을 설명하기 위한 자연어와 프로그래밍 언어 사이의 일종의 설명 방식입니다. 다양한 알고리즘 서적이나 논문에서 의사 코드에 대한 설명을 자주 볼 수 있는데, 굳이 언어를 알지 못하더라도 의사 코드를 통해 알고리즘의 실행 과정을 이해할 수 있습니다.

그렇다면 LLM은 의사 코드를 얼마나 잘 이해하나요? 사실 LLM의 의사 코드 이해도는 상당히 높으며, LLM은 많은 양질의 코드로 훈련되어 의사 코드의 의미를 쉽게 이해할 수 있습니다.

의사 코드 프롬프트를 작성하는 방법은 무엇인가요?

의사 코드는 프로그래머에게 매우 친숙하며, 프로그래머가 아닌 분들도 몇 가지 기본 규칙만 기억하면 간단한 의사 코드를 작성할 수 있습니다. 몇 가지 예를 들어보겠습니다:

  • 변수 - 특정 기호로 입력 또는 중간 결과를 나타내는 등 데이터를 저장하는 데 사용됩니다.
  • 유형 - 문자열, 숫자, 배열 등의 데이터 유형을 정의하는 데 사용됩니다.
  • 함수는 특정 하위 작업의 실행 로직을 정의하는 함수입니다.
  • 루프, 조건부 판단 등 프로그램의 실행 프로세스를 제어하는 데 사용되는 제어 흐름입니다.
    • if-else 문을 사용하여 조건 A가 만족되면 작업 A를 실행하고, 그렇지 않으면 작업 B를 실행합니다.
    • 배열의 각 요소에 대해 작업을 수행하는 for 루프입니다.
    • 동안 루프에서 조건 A가 충족되면 작업 B가 연속적으로 실행됩니다.

이제 앞의 두 가지 반영 질문을 예로 들어 의사 코드 프롬프트를 작성해 보겠습니다.

특정 JSON 형식을 출력하는 의사 코드

원하는 JSON 형식은 TypeScript 유형 정의와 유사한 의사 코드의 도움으로 명확하게 설명할 수 있습니다:

Please split the sentences into short segments, no more than 1 line (less than 80 characters, ~10 English words) each.
Please keep each segment meaningful, e.g. split from punctuations, "and", "that", "where", "what", "when", "who", "which" or "or" etc if possible, but keep those punctuations or words for splitting.
Do not add or remove any words or punctuation marks.

Input is an array of strings.

Output should be a valid json array of objects, each object contains a sentence and its segments.

Array<{
sentence: string;
segments: string[]
}>

의사 코드로 자막 스크립트 구성하기

자막 텍스트를 대조하는 작업은 비교적 복잡합니다. 이 작업을 수행하기 위해 프로그램을 작성한다고 상상해보면 챕터를 추출한 다음 화자를 추출하고 마지막으로 챕터와 화자에 따라 대화를 대조하는 등 많은 단계가 있을 수 있습니다. 의사 코드의 도움으로 이 작업을 여러 하위 작업으로 분해할 수 있으며, 특정 코드를 작성할 필요도 없이 하위 작업의 실행 로직만 명확하게 설명하면 됩니다. 그런 다음 이러한 하위 작업을 단계별로 실행하고 최종적으로 결과 출력을 통합합니다.

다음과 같은 몇 가지 변수를 사용하여 저장할 수 있습니다. subjectspeakerschaptersparagraphs 등

출력할 때 For 루프를 사용하여 챕터와 단락을 반복하고, If-else 문을 사용하여 화자의 이름을 출력해야 하는지 여부를 결정할 수도 있습니다.


여러분의 임무는 가독성을 위해 비디오 스크립트를 재구성하고 여러 사람이 대화할 때 화자를 인식하는 것입니다. 다음은 이를 수행하는 방법에 대한 의사 코드입니다. 다음은 이를 수행하는 방법에 대한 의사 코드입니다.

def extract_subject(transcript):
# Find the subject in the transcript and return it as a string.

def extract_chapters(transcript):
# Find the chapters in the transcript and return them as a list of strings.

def extract_speakers(transcript):
# Find the speakers in the transcript and return them as a list of strings.


def find_paragraphs_and_speakers_in_chapter(chapter):
# Find the paragraphs and speakers in a chapter and return them as a list of tuples.
# Each tuple contains the speaker and their paragraphs.

def format_transcript(transcript):
# extract the subject, speakers, chapters and print them
subject = extract_subject(transcript)
print("Subject:", subject)
speakers = extract_speakers(transcript)
print("Speakers:", speakers)
chapters = extract_chapters(transcript)
print("Chapters:", chapters)

# format the transcript
formatted_transcript = f"# {subject}\n\n"
for chapter in chapters:
formatted_transcript += f"## {chapter}\n\n"
paragraphs_and_speakers = find_paragraphs_and_speakers_in_chapter(chapter)
for speaker, paragraphs in paragraphs_and_speakers:
# if there are multiple speakers, print the speaker's name before each paragraph
if speakers.size() > 1:
formatted_transcript += f"{speaker}:"
formatted_transcript += f"{speaker}:"
for paragraph in paragraphs:
formatted_transcript += f" {paragraph}\n\n"
formatted_transcript += "\n\n"

return formatted_transcript

print(format_transcript($user_input))

어떻게 작동하는지 살펴봅시다:

Prompt 高级技巧:借助伪代码精准的控制 LLM 的输出结果和定义其执行逻辑

WWDC 액세스 기록 수집

Prompt 高级技巧:借助伪代码精准的控制 LLM 的输出结果和定义其执行逻辑

다중 스피커, 쇼 스피커

Prompt 高级技巧:借助伪代码精准的控制 LLM 的输出结果和定义其执行逻辑

스피커 1개, 스피커 표시 없음

이 프롬프트에서 생성한 GPT를 그냥 사용할 수도 있습니다:성적증명서 조직 GPT

의사 코드를 사용하여 한 번에 여러 이미지를 그리는 ChatGPT 만들기

또한 최근 대만 네티즌인 윤상치 선생님으로부터 매우 흥미로운 용례를 배웠습니다.의사 코드를 사용하여 한 번에 여러 이미지를 그리는 ChatGPT 만들기.

이제 ChatGPT 그림 그리기는 일반적으로 한 번에 하나의 그림만 생성하며, 한 번에 두 개 이상의 그림을 생성하려면 의사 코드를 사용하여 여러 그림을 생성하는 작업을 여러 하위 작업으로 나눈 다음 여러 하위 작업을 한 번에 실행하고 최종적으로 결과 출력을 통합할 수 있습니다.

下面是一段画图的伪代码,请按照伪代码的逻辑,用DALL-E画图:

images_prompts = [
{
style: "Kawaii",
prompt: "Draw a cute dog",
aspectRatio: "Wide"
},
{
style: "Realistic",
prompt: "Draw a realistic dog",
aspectRatio: "Square"
}
]

images_prompts.forEach((image_prompt) =>{
print("Generating image with style: " + image_prompt.style + " and prompt: " + image_prompt.prompt + " and aspect ratio: " + image_prompt.aspectRatio)
image_generation(image_prompt.style, image_prompt.prompt, image_prompt.aspectRatio);
})

Prompt 高级技巧:借助伪代码精准的控制 LLM 的输出结果和定义其执行逻辑

요약

위의 예시를 통해 의사 코드를 사용하면 자연어 설명에 국한되지 않고 LLM의 출력 결과를 더 정확하게 제어하고 실행 로직을 정의 할 수 있음을 알 수 있습니다. 복잡한 작업이나 여러 분기가 있는 작업에서 각 분기가 여러 하위 작업을 실행해야 하고 하위 작업이 서로 관련되어 있다면 의사 코드를 사용하여 프롬프트를 설명하는 것이 더 명확하고 정확할 것입니다.

프롬프트를 작성할 때 프롬프트는 기본적으로 자연어로 설명된 LLM에 대한 제어 명령어로, LLM이 우리가 원하는 것을 이해하고 필요에 따라 입력을 원하는 출력으로 전환할 수 있게 해줍니다. 프롬프트를 설명하는 형식은 숏샷, CoT, 의사 코드 등 여러 가지 형태로 유연하게 만들 수 있습니다.

더 많은 예제:

출력 서식을 정밀하게 제어할 수 있는 '의사 코드' 메타 프롬프트 생성

© 저작권 정책
AiPPT

관련 문서

댓글 없음

없음
댓글 없음...