paint-brush
이 새로운 프롬프팅 기술은 AI 출력을 실제로 사용 가능하게 만듭니다.~에 의해@abhic137
2,041 판독값
2,041 판독값

이 새로운 프롬프팅 기술은 AI 출력을 실제로 사용 가능하게 만듭니다.

~에 의해 Abhishek Chadha15m2024/12/04
Read on Terminal Reader

너무 오래; 읽다

구조화된 메타 프롬프팅은 작업을 수행하기 전에 솔루션에 대한 JSON 스키마를 동적으로 생성하는 기술입니다. 이를 통해 재사용 가능하고 신뢰할 수 있으며 예측 가능한 프롬프트를 만드는 데 도움이 됩니다.
featured image - 이 새로운 프롬프팅 기술은 AI 출력을 실제로 사용 가능하게 만듭니다.
Abhishek Chadha HackerNoon profile picture
0-item
1-item
2-item

대규모 언어 모델(LLM)의 지속적인 과제는 예측할 수 없는 출력을 생성하는 경향이 있다는 것입니다. 신중하게 만들어진 프롬프트에도 불구하고 LLM은 종종 기대치에서 벗어나 출력을 재사용하거나 워크플로에 통합하기 어렵게 만듭니다. 더 나쁜 것은 결과가 종종 반복 가능하지 않아 다운스트림 처리가 복잡해진다는 것입니다.


이 블로그 게시물에서는 작업을 수행하기 전에 솔루션에 대한 JSON 스키마를 동적으로 생성하는 기술인 구조화된 메타 프롬프팅을 살펴봅니다. 이를 통해 재사용 가능하고 신뢰할 수 있으며 예측 가능한 프롬프트를 만드는 데 도움이 됩니다.

배경

대부분의 최신 LLM은 이제 JSON 출력 모드를 제공하지만, 결과가 항상 예상 스키마에 부합하지는 않습니다. 개발자는 종종 시간이 많이 걸리고 비용이 많이 들며 사용자 경험을 망칠 가능성이 있는 확인 및 재시도 메커니즘을 사용합니다.


gpt4o 를 통해 OpenAI는 출력이 사용자가 제공한 JSON 스키마에 부합하도록 보장하는 구조화된 출력을 도입했습니다. 정확한 세부 사항은 공개되지 않았지만, 이는 제약된 디코딩과 사전 샘플 로짓 바이어싱의 조합으로 달성될 가능성이 높습니다. 유사한 기능은 안내, 개요, 역산, CommandR, SGLang과 같은 다른 도구에서도 제공됩니다. 이러한 접근 방식은 개발자가 출력을 JSON 스키마로 안내할 수 있도록 하며, 각각 고유한 상충 관계가 있습니다.

구조화된 메타 프롬핑이란 무엇인가요?

구조화된 메타 프롬프팅은 LLM을 사용하여 솔루션을 생성하기 전에 문제에 대한 구조화된 설명을 동적으로 생성하는 모든 기술입니다. 이 방법은 직접 프롬프팅에 비해 여러 가지 장점을 제공합니다.

  1. 동적 : 출력 구조는 모델에 하드코딩되거나 미세 조정되는 것이 아니라 작업 설명을 기반으로 런타임에 생성됩니다.
  2. 적응성 : 생성된 스키마는 사람이 읽을 수 있으며 사람이나 다른 LLM이 검사, 확인 또는 수정할 수 있습니다.
  3. 재사용 가능 : 스키마는 여러 작업, 실행 및 머신에 걸쳐 저장되고 재사용될 수 있습니다.
  4. 예측 가능 : 솔루션은 잘 정의된 구조에 따라 생성되므로 다운스트림 계산에 적합합니다.



암호

구조적 메타 프롬핑을 사용하여 새로운 베스트셀러 스파이 스릴러 소설의 개요를 만드는 예를 살펴보겠습니다.

이 블로그 게시물의 모든 코드는 이 Colab Notebook 에서 사용할 수 있습니다.

Colab Secrets에 OPENAI_API_KEY 설정했는지 확인하세요.

1. 구조 생성

d첫 번째 단계는 원하는 출력을 설명하는 JSON 스키마를 정의하는 것입니다. 이를 위해 JSON 스키마에 대한 JSON 스키마를 만듭니다. 사실상 메타 스키마입니다 ! 이는 사양의 일부로 제공되지만 몇 가지 변경이 필요합니다.

1.1 메타스키마 조정

OpenAI와 Cohere의 구조화된 출력 API는 표준 JSON 스키마에 여러 가지 제한을 가합니다. 이는 매우 안타까운 일이지만 지금은 해결할 수 있는 문제입니다. 호환성을 보장하기 위해 메타 스키마를 조정하겠습니다.

 from jsonschema import Draft202012Validator def openai_compatible_metaschema(schema: Dict[str, object]): schema["type"] = "object" del schema["allOf"] return schema openai_json_metaschema = openai_compatible_metaschema( copy.deepcopy(Draft202012Validator.META_SCHEMA) )


참고 *: 분명히* inversion에는 그런 제한이 없고 임의의 JSON 스키마를 지원합니다... 하지만 아직 공개 액세스는 없습니다!

1.2 메타 프롬프트에 제한 추가

다음으로, 프롬프트에 가이드라인을 통합하여 결과 JSON 스키마가 OpenAI의 제약 조건을 준수하도록 합니다. 예를 들어:

  • 모든 항목은 필수입니다.
  • 객체에는 중첩 깊이와 크기에 제한이 있습니다.
  • 추가 속성은 허용하지 않아야 합니다( "additionalProperties": false ).
 system_guidelines = "\n".join( [ "All fields must be required - To use Structured Outputs, all fields or function parameters must be specified as required. NOTE: Although all fields must be required (and the model will return a value for each parameter), it is possible to emulate an optional parameter by using a union type with null." "Objects have limitations on nesting depth and size - A schema may have up to 100 object properties total, with up to 5 levels of nesting.", "Limitations on total string size - In a schema, total string length of all property names, definition names, enum values, and const values cannot exceed 15,000 characters.", "Limitations on enum size - A schema may have up to 500 enum values across all enum properties. For a single enum property with string values, the total string length of all enum values cannot exceed 7,500 characters when there are more than 250 enum values.", "additionalProperties: false must always be set in objects - additionalProperties controls whether it is allowable for an object to contain additional keys / values that were not defined in the JSON Schema. Structured Outputs only supports generating specified keys / values, so we require developers to set additionalProperties: false to opt into Structured Outputs.", "Some type-specific keywords are not yet supported - Notable keywords not supported include: For strings: minLength, maxLength, pattern, format; For numbers: minimum, maximum, multipleOf; For objects: patternProperties, unevaluatedProperties, propertyNames, minProperties, maxProperties; For arrays: unevaluatedItems, contains, minContains, maxContains, minItems, maxItems, uniqueItems", "For anyOf, the nested schemas must each be a valid JSON Schema per this subset", "Definitions are supported - You can use definitions to define subschemas which are referenced throughout your schema. The following is a simple example.", "Recursive schemas are supported - Sample recursive schema using # to indicate root recursion.", ] )

1.3 메타 프롬프트 설정

이제 스파이 스릴러 개요에 대한 JSON 스키마를 생성하기 위해 메타 프롬프트를 정의합니다.

 from langchain.prompts import ChatPromptTemplate task_description = "Write an outline for a bestselling spy thriller novel" task_guidelines = """ - You must follow one of the six basic story arcs: Rags to riches, Riches to rags, Icarus, Oedipus, Cinderella, Man in a hole - Outputs must include characters, plot points (including exposition, rising action, climax, falling action, and resolution), central conflict, setting, major turning points or "beats," character arcs, and a synopsis of the story; essentially, a detailed breakdown of the key elements that will drive the narrative throughout the novel. """ prompt_messages = ChatPromptTemplate.from_messages( [ ( "system", "You are an expert in creating JSON schemas. You have been asked to generate a detailed JSON schema for the output of a given task based based on a task desciption and some guidelines.", ), ( "system", "Your JSON schema must always adhere to the following system system guidelines for JSON schemas:\n<system_guidelines>\n{system_guidelines}\n</system_guidelines>", ), ( "user", "Use the task description and guidelines below to generate an output JSON schema for the following task based on the guidelines provided.\n\n<task_description>\n{task_description}\n</task_description>\n\n<guidelines>\n{task_guidelines}\n</guidelines>", ), ] )

1.4 구조 생성

LLM을 호출하여 스키마를 생성합니다.

 messages = prompt_messages.format_messages( system_guidelines=system_guidelines, task_description=task_description, task_guidelines=task_guidelines ) ## Make sure to set up OPENAI_API_KEY in your Colab Secrets ## https://x.com/GoogleColab/status/1719798406195867814 client = OpenAI(api_key=userdata.get('OPENAI_API_KEY')) model = "gpt-4o" metaprompt_completion = client.beta.chat.completions.parse( model=model, messages=convert_to_penai_messages(messages), response_format={ "type": "json_schema", "json_schema": JSONSchema( name="JsonMetaschema", description="JSON Metaschema for the 2020-12 Draft of the JSON Schema specification that can be used to validate JSON data", schema=openai_json_metaschema, strict=False, ) } ) task_output_schema = json.loads(metaprompt_completion.choices[0].message.content) print(json.dumps(task_output_schema, indent=2))


 { "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Outline for a Bestselling Spy Thriller Novel", "type": "object", "properties": { "storyArc": { "type": "string", "enum": [ "Rags to riches", "Riches to rags", "Icarus", "Oedipus", "Cinderella", "Man in a hole" ] }, "characters": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "role": { "type": "string" }, "description": { "type": "string" }, "arc": { "type": "string" } }, "required": ["name", "role", "description", "arc"], "additionalProperties": false }, "minItems": 1 }, "plotPoints": { "type": "object", "properties": { "exposition": { "type": "string" }, "risingAction": { "type": "string" }, "climax": { "type": "string" }, "fallingAction": { "type": "string" }, "resolution": { "type": "string" } }, "required": [ "exposition", "risingAction", "climax", "fallingAction", "resolution" ], "additionalProperties": false }, "centralConflict": { "type": "string" }, "setting": { "type": "string" }, "majorTurningPoints": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "characterArcs": { "type": "object", "properties": { "protagonistArc": { "type": "string" }, "antagonistArc": { "type": "string" }, "supportingCharactersArcs": { "type": "array", "items": { "type": "string" }, "minItems": 0 } }, "required": [ "protagonistArc", "antagonistArc", "supportingCharactersArcs" ], "additionalProperties": false }, "synopsis": { "type": "string" } }, "required": [ "storyArc", "characters", "plotPoints", "centralConflict", "setting", "majorTurningPoints", "characterArcs", "synopsis" ], "additionalProperties": false }


이제 우리는 스파이 스릴러 소설의 개요를 설명하는 스키마를 가지고 있습니다. 이것은 파일이나 데이터베이스에 보관할 수 있습니다.

2. 솔루션 생성

2.1 프롬프트 설정

스키마를 사용하여 소설 개요에 대한 프롬프트를 정의합니다. 몇 가지 기본 롤플레잉 프롬프트와 지침을 사용합니다.

 user_requirements = "Tell a story about counter-intelligence operative working against the clock. The novel should be extremely realistic, slow burn." task_prompt = ChatPromptTemplate.from_messages( [ ( "system", "You are a world-renowned author that has written dozens of bestselling thriller novels. Your task is to create an outline for a new novel based on the user's requirements.", ), ( "user", "Please write a novel outline based strictly on the following requirements <requirements>{requirements}</requirements>", ), ] ) task_completion = client.beta.chat.completions.parse( model=model, messages=convert_to_openai_messages(task_prompt.format_messages(requirements=user_requirements)), response_format={ "type": "json_schema", "json_schema": JSONSchema( ## TODO: You can change this depending your task name="ThrillerNovelOutlineSchema", description="A schema for outlining a new novel", schema=task_output_schema, strict=False, ) } ) task_result = json.loads(task_completion.choices[0].message.content)


다음 스파이 스릴러의 개요는 다음과 같습니다.

 { "storyArc": "Cinderella", "synopsis": "In 'The Clockwork Veil', Ethan Cross, a savvy counter-intelligence operative, is thrust into a high-pressure scenario where leaked documents threaten national integrity. As he races against time to unmask a mole within the agency, Ethan confronts his personal fears and the boundaries of the meticulous strategies he's known for. This slow-burn thriller follows Ethan's transformation in a world where every second could spell disaster, culminating in a showdown with Lena Grey\u2014a former ally who has turned the clockwork of espionage into her personal vendetta. Through grit and cunning, Ethan must adapt his methods, realizing that in the world of espionage, the most powerful weapon is a well-timed intuition.", "characters": [ { "name": "Ethan Cross", "role": "Protagonist", "description": "A meticulous and resourceful counter-intelligence operative known for his analytical mind and calm demeanor under pressure.", "arc": "Ethan transforms from a methodical planner to a decisive action-taker as he confronts his personal fears and realizes the importance of instinct." }, { "name": "Lena Grey", "role": "Antagonist", "description": "A brilliant but disillusioned former operative now turned mole, seeking vengeance against the agency she believes wronged her.", "arc": "Lena starts with a single-minded focus on revenge but gradually becomes conflicted as old loyalties resurface." }, { "name": "Dr. Julia Ward", "role": "Supporting Character", "description": "An astute psychologist who helps Ethan manage the stress of his demanding role and assists in profiling Lena's psychological state.", "arc": "Julia grows from a secondary advisory role to a key player in helping Ethan unearth Lena's motivations." }, { "name": "Michael Garner", "role": "Supporting Character", "description": "Ethan's trusted field partner and an expert in electronic surveillance, providing vital technical support.", "arc": "Michael's experience is tested as he learns to adapt to unpredictable situations, becoming more versatile in his approach." } ], "plotPoints": { "exposition": "Ethan Cross is tasked with investigating a series of leaked documents that could compromise national security. The leaks point to an insider within the agency.", "risingAction": "As Ethan dives deeper, he uncovers a trail leading to Lena Grey, a former colleague presumed dead. Evidence mounts as Ethan closes in, forcing him to question his long-standing methodologies.", "climax": "Ethan finally confronts Lena, who has rigged a trap to destroy critical evidence. In a tense standoff, Ethan must choose between following protocol or taking a risk to stop her.", "fallingAction": "With quick thinking and a new reliance on intuition, Ethan manages to disarm the trap. Lena, deflated, questions her own motives as old memories of camaraderie surface.", "resolution": "Lena is apprehended, the mole hunt ends, and Ethan reflects on his journey, acknowledging the balance between calculated strategy and spontaneity." }, "centralConflict": "Ethan Cross must identify and capture a mole within the agency who is leaking classified information, while dealing with his own rigid attachment to protocol in a dynamically evolving threat landscape.", "setting": "The story unfolds across various global locations including the bustling intelligence hub of Langley, a remote cabin in the Swiss Alps, and the teeming streets of Berlin, lending an authentic and international scope to the narrative.", "majorTurningPoints": [ "Ethan discovers the identity of the mole as his former colleague Lena Grey.", "Lena executes a series of diversions leading to a crisis within the agency.", "Ethan's adherence to protocol nearly costs him a critical breakthrough.", "Ethan's confrontation with Lena culminates in an uncharacteristic display of intuition that saves the mission." ], "characterArcs": { "protagonistArc": "Ethan evolves from strictly adhering to procedures to embracing a balance between strategy and instinctive decision-making, essential in high-stakes situations.", "antagonistArc": "Lena's journey from spite-fueled revenge to questioning her own motivations reflects a shift from isolation to an internal struggle with her past loyalties.", "supportingCharactersArcs": [ "Julia grows from providing psychological insights to playing an active role in strategizing the final approach to Lena.", "Michael transitions from a technical support role to becoming a crucial element in executing Ethan\u2019s plans, emphasizing adaptability." ] } } d


이제 이 스키마를 재사용하여 출력에 포함된 필드에 대한 강력한 보장을 통해 파이프라인에서 여러 솔루션을 생성할 수 있습니다.

결론

구조화된 메타 프롬프팅을 사용하면 즉석에서 구조를 정의하여 다운스트림 프로세스에 대한 LLM 출력을 더욱 신뢰할 수 있습니다. 다음 게시물을 기대하세요. 여기서는 구조화된 메타 프롬프팅을 다른 기술과 결합하는 방법을 살펴보겠습니다.