반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

https://www.pinecone.io/learn/series/langchain/langchain-prompt-templates/

 

Prompt Engineering and LLMs with Langchain | Pinecone

We have always relied on different models for different tasks in machine learning. With the introduction of multi-modality and Large Language Models (LLMs), this has changed. Gone are the days when we needed separate models for classification, named entity

www.pinecone.io

 

 

Prompt Engineering and LLMs with Langchain

 

We have always relied on different models for different tasks in machine learning. With the introduction of multi-modality and Large Language Models (LLMs), this has changed.

 

우리는 기계 학습의 다양한 작업을 위해 항상 다양한 모델을 사용해 왔습니다. 다중 양식 및 LLM(대형 언어 모델)이 도입되면서 상황이 바뀌었습니다.

 

Gone are the days when we needed separate models for classification, named entity recognition (NER), question-answering (QA), and many other tasks.

 

분류, 개체명 인식(NER), 질문 답변(QA) 및 기타 여러 작업을 위해 별도의 모델이 필요했던 시대는 지나갔습니다.

 

Before transfer learning, different tasks and use cases required training different models.

 

With the introduction of transformers and transfer learning, all that was needed to adapt a language model for different tasks was a few small layers at the end of the network (the head) and a little fine-tuning.

 

transformers  와 전이 학습 transfer learning 이 도입되면서 다양한 작업에 맞게 언어 모델을 조정하는 데 필요한 것은 네트워크 끝(헤드)에 있는 몇 개의 작은 레이어와 약간의 미세 조정뿐이었습니다.

 

Transformers and the idea of transfer learning allowed us to reuse the same core components of pretrained transformer models for different tasks by switching model “heads” and performing fine-tuning. Transformers와 전이 학습 아이디어를 통해 우리는 모델 "헤드"를 전환하고 미세 조정을 수행함으로써 사전 훈련된 변환기 모델의 동일한 핵심 구성 요소를 다양한 작업에 재사용할 수 있었습니다.

 

Today, even that approach is outdated. Why change these last few model layers and go through an entire fine-tuning process when you can prompt the model to do classification or QA.

 

오늘날에는 그러한 접근 방식조차 구식입니다. 모델에 분류 또는 QA를 수행하라는 메시지를 표시할 수 있는데 마지막 몇 개의 모델 레이어를 변경하고 전체 미세 조정 프로세스를 거쳐야 하는 이유는 무엇입니까?

 

Many tasks can be performed using the same Large Language Models (LLMs) by simply changing the instructions in the prompts. 프롬프트의 지침을 변경하기만 하면 동일한 LLM(대형 언어 모델)을 사용하여 많은 작업을 수행할 수 있습니다.

 

Large Language Models (LLMs) can perform all these tasks and more. These models have been trained with a simple concept, you input a sequence of text, and the model outputs a sequence of text. The one variable here is the input text — the prompt.

 

LLM(대형 언어 모델)은 이러한 모든 작업과 그 이상을 수행할 수 있습니다. 이러한 모델은 간단한 개념으로 훈련되었습니다. 사용자가 일련의 텍스트를 입력하면 모델이 일련의 텍스트를 출력합니다. 여기서 변수 중 하나는 입력 텍스트, 즉 프롬프트입니다.

 

In this new age of LLMs, prompts are king. Bad prompts produce bad outputs, and good prompts are unreasonably powerful. Constructing good prompts is a crucial skill for those building with LLMs.

 

LLM의 새로운 시대에는 프롬프트가 가장 중요합니다. 나쁜 프롬프트는 나쁜 결과를 낳고, 좋은 프롬프트는 비합리적으로 강력합니다. 좋은 프롬프트를 구성하는 것은 LLM을 구축하는 사람들에게 중요한 기술입니다.

 

The LangChain library recognizes the power of prompts and has built an entire set of objects for them. In this article, we will learn all there is to know about PromptTemplates and implementing them effectively.

 

LangChain 라이브러리는 프롬프트의 힘을 인식하고 이를 위한 전체 개체 세트를 구축했습니다. 이 문서에서는 PromptTemplate에 대해 알아야 할 모든 내용과 이를 효과적으로 구현하는 방법을 알아봅니다.

 

 

https://youtu.be/RflBcK0oDH0?si=5DWGTgF8bbz1M6iq

Prompt Templates for GPT 3.5 and other LLMs - LangChain #2

 

Prompt Engineering

 

Before diving into Langchain’s PromptTemplate, we need to better understand prompts and the discipline of prompt engineering.

 

Langchain의 PromptTemplate을 살펴보기 전에 프롬프트와 프롬프트 엔지니어링 규율을 더 잘 이해해야 합니다.


A prompt is typically composed of multiple parts:

 

프롬프트는 일반적으로 여러 부분으로 구성됩니다.

 

 

Not all prompts use these components, but a good prompt often uses two or more. Let’s define them more precisely.

 

모든 프롬프트가 이러한 구성 요소를 사용하는 것은 아니지만 좋은 프롬프트는 두 개 이상을 사용하는 경우가 많습니다. 좀 더 정확하게 정의해 보겠습니다.

 

Instructions tell the model what to do, how to use external information if provided, what to do with the query, and how to construct the output.

 

지침 Instructions  은 수행할 작업, 제공된 외부 정보를 사용하는 방법, 쿼리로 수행할 작업 및 출력 구성 방법을 모델에 알려줍니다.

 

External information or context(s) act as an additional source of knowledge for the model. These can be manually inserted into the prompt, retrieved via a vector database (retrieval augmentation), or pulled in via other means (APIs, calculations, etc.).

 

외부 정보 또는 컨텍스트는 모델에 대한 추가 지식 소스 역할을 합니다. 이는 프롬프트에 수동으로 삽입하거나, 벡터 데이터베이스를 통해 검색하거나(검색 확대), 다른 수단(API, 계산 등)을 통해 가져올 수 있습니다.

 

User input or query is typically (but not always) a query input into the system by a human user (the prompter).

 

사용자 입력 또는 쿼리는 일반적으로(항상은 아니지만) 인간 사용자(프롬프터)가 시스템에 입력한 쿼리입니다.

 

Output indicator marks the beginning of the to-be-generated text. If generating Python code, we may use import to indicate to the model that it must begin writing Python code (as most Python scripts begin with import).

 

출력 표시기는 생성될 텍스트의 시작을 표시합니다. Python 코드를 생성하는 경우 import를 사용하여 Python 코드 작성을 시작해야 함을 모델에 나타낼 수 있습니다(대부분의 Python 스크립트는 import로 시작함).

 

Each component is usually placed in the prompt in this order. Starting with instructions, external information (where applicable), prompter input, and finally, the output indicator.

 

각 구성요소는 일반적으로 이 순서대로 프롬프트에 배치됩니다. 지침부터 시작하여 외부 정보(해당하는 경우), 프롬프터 입력, 마지막으로 출력 표시기입니다.

 

Let’s see how we’d feed this into an OpenAI model using Langchain:

 

Langchain을 사용하여 OpenAI 모델에 이를 어떻게 적용하는지 살펴보겠습니다.

 

 

prompt = """Answer the question based on the context below. If the
question cannot be answered using the information provided answer
with "I don't know".

Context: Large Language Models (LLMs) are the latest models used in NLP.
Their superior performance over smaller models has made them incredibly
useful for developers building NLP enabled applications. These models
can be accessed via Hugging Face's `transformers` library, via OpenAI
using the `openai` library, and via Cohere using the `cohere` library.

Question: Which libraries and model providers offer LLMs?

Answer: """

 

from langchain.llms import OpenAI

# initialize the models
openai = OpenAI(
    model_name="text-davinci-003",
    openai_api_key="YOUR_API_KEY"
)

 

print(openai(prompt))

 

 

Hugging Face's `transformers` library, OpenAI using the `openai` library, and Cohere using the `cohere` library.

 

 

이 코드는 주어진 문맥에 기반하여 특정 질문에 답하는 예제입니다. 아래는 코드의 각 부분에 대한 설명입니다:

  1. prompt = """Answer the question based on the context below... via Cohere using the coherelibrary."": 특정 문맥을 기반으로 하는 템플릿 문자열을 정의합니다. 질문에 대한 답을 생성하는 데 사용됩니다.{context}와 {question}`는 각각 나중에 변수로 대체될 부분입니다.
  2. from langchain.llms import OpenAI: langchain 패키지에서 OpenAI 클래스를 가져옵니다. 이 클래스는 OpenAI의 언어 모델과 상호작용하는 데 사용됩니다.
  3. openai = OpenAI(model_name="text-davinci-003", openai_api_key="YOUR_API_KEY"): OpenAI 클래스의 인스턴스를 생성하고, OpenAI의 언어 모델을 초기화합니다. model_name은 사용할 언어 모델의 이름이며, openai_api_key는 OpenAI API에 액세스하기 위한 API 키입니다. 여기서는 "text-davinci-003" 모델을 사용하고 있으며, API 키는 직접 사용자의 키로 대체되어야 합니다.
  4. print(openai(prompt)): openai 인스턴스의 __call__ 메서드를 사용하여 주어진 템플릿을 이용하여 모델에 질문을 제출하고, 모델의 응답을 출력합니다.

이 코드는 주어진 문맥과 질문에 대한 응답을 생성하는 예제로, OpenAI의 언어 모델을 사용하여 모델에 특정 질문을 물어보고 그에 대한 답을 출력하는 과정을 보여줍니다.

 

 

OpenAI 사에서 제공하는 모델 text-davinci-003에서 gpt-3.5-turbo-1106으로 최신 버전이면서 저렴한 모델로 바꾸었습니다.

 

로컬에서 업데이트된 소스코드와 결과는 아래와 같습니다.

 

 

In reality, we’re unlikely to hardcode the context and user question. We’d feed them in via a template — which is where Langchain’s PromptTemplate comes in.

 

실제로는 컨텍스트와 사용자 질문을 하드코딩할 가능성이 없습니다. 우리는 Langchain의 PromptTemplate이 들어오는 템플릿을 통해 이를 제공했습니다.

 

Prompt Templates

 

The prompt template classes in Langchain are built to make constructing prompts with dynamic inputs easier. Of these classes, the simplest is the PromptTemplate. We’ll test this by adding a single dynamic input to our previous prompt, the user query.

 

Langchain의 프롬프트 템플릿 클래스는 동적 입력이 포함된 프롬프트를 더 쉽게 구성할 수 있도록 만들어졌습니다. 이러한 클래스 중에서 가장 간단한 것은 PromptTemplate입니다. 이전 프롬프트인 사용자 쿼리에 단일 동적 입력을 추가하여 이를 테스트하겠습니다.

 

from langchain import PromptTemplate

template = """Answer the question based on the context below. If the
question cannot be answered using the information provided answer
with "I don't know".

Context: Large Language Models (LLMs) are the latest models used in NLP.
Their superior performance over smaller models has made them incredibly
useful for developers building NLP enabled applications. These models
can be accessed via Hugging Face's `transformers` library, via OpenAI
using the `openai` library, and via Cohere using the `cohere` library.

Question: {query}

Answer: """

prompt_template = PromptTemplate(
    input_variables=["query"],
    template=template
)

 

 

With this, we can use the format method on our prompt_template to see the effect of passing a query to the template.

 

이를 통해 우리는 템플릿에 쿼리를 전달하는 효과를 확인하기 위해 프롬프트_템플릿의 형식 메서드를 사용할 수 있습니다.

 

print(
    prompt_template.format(
        query="Which libraries and model providers offer LLMs?"
    )
)

 

Answer the question based on the context below. If the
question cannot be answered using the information provided answer
with "I don't know".

Context: Large Language Models (LLMs) are the latest models used in NLP.
Their superior performance over smaller models has made them incredibly
useful for developers building NLP enabled applications. These models
can be accessed via Hugging Face's `transformers` library, via OpenAI
using the `openai` library, and via Cohere using the `cohere` library.

Question: Which libraries and model providers offer LLMs?

Answer: 

 

Naturally, we can pass the output of this directly into an LLM object like so:

 

당연히 다음과 같이 이 출력을 LLM 개체에 직접 전달할 수 있습니다.

 

print(openai(
    prompt_template.format(
        query="Which libraries and model providers offer LLMs?"
    )
))

 

Hugging Face's `transformers` library, OpenAI using the `openai` library, and Cohere using the `cohere` library.

 

로컬에서 돌린 결과는 아래와 같습니다.

 

 

 

This is just a simple implementation that can easily be replaced with f-strings (like f"insert some custom text '{custom_text}' etc"). However, using Langchain’s PromptTemplate object, we can formalize the process, add multiple parameters, and build prompts with an object-oriented approach.

 

이는 f-문자열(예: f"사용자 정의 텍스트 '{custom_text}' 등 삽입")로 쉽게 대체할 수 있는 간단한 구현입니다. 그러나 Langchain의 PromptTemplate 개체를 사용하면 프로세스를 공식화하고, 여러 매개변수를 추가하고, 개체 지향 접근 방식으로 프롬프트를 구축할 수 있습니다.


These are significant advantages, but only some of what Langchain offers to help us with prompts.

 

이는 상당한 이점이지만 Langchain이 프롬프트를 통해 우리에게 도움을 주기 위해 제공하는 것 중 일부에 불과합니다.

 

Few Shot Prompt Templates

 

The success of LLMs comes from their large size and ability to store “knowledge” within the model parameter, which is learned during model training. However, there are more ways to pass knowledge to an LLM. The two primary methods are:

 

LLM의 성공은 모델 교육 중에 학습된 모델 매개 변수 내에 "지식"을 저장할 수 있는 큰 규모와 능력에서 비롯됩니다. 그러나 지식을 LLM에 전달하는 더 많은 방법이 있습니다. 두 가지 기본 방법은 다음과 같습니다.

Parametric knowledge — the knowledge mentioned above is anything that has been learned by the model during training time and is stored within the model weights (or parameters).

 

위에 언급된 지식은 훈련 시간 동안 모델에 의해 학습되었으며 모델 가중치(또는 매개변수) 내에 저장되는 모든 것입니다.


Source knowledge — any knowledge provided to the model at inference time via the input prompt.

 

추론 시 입력 프롬프트를 통해 모델에 제공되는 모든 지식입니다.


Langchain’s FewShotPromptTemplate caters to source knowledge input. The idea is to “train” the model on a few examples — we call this few-shot learning — and these examples are given to the model within the prompt.

 

Langchain의 FewShotPromptTemplate은 소스 지식 입력을 충족합니다. 아이디어는 몇 가지 예를 통해 모델을 "훈련"하는 것입니다. 이를 few-shot learning 이라고 하며 이러한 예는 프롬프트 내에서 모델에 제공됩니다.



Few-shot learning is perfect when our model needs help understanding what we’re asking it to do. We can see this in the following example:

 

모델이 요청하는 작업을 이해하는 데 도움이 필요할 때 퓨샷 학습이 완벽합니다. 다음 예에서 이를 확인할 수 있습니다.

 

prompt = """The following is a conversation with an AI assistant.
The assistant is typically sarcastic and witty, producing creative 
and funny responses to the users questions. Here are some examples: 

User: What is the meaning of life?
AI: """

openai.temperature = 1.0  # increase creativity/randomness of output

print(openai(prompt))

 

Life is like a box of chocolates, you never know what you're gonna get!

 

 

이 경우에는 진지한 질문에 대한 답으로 재미있는 것, 농담을 요구하는 것입니다. 그러나 임의성/창의성을 높이는 온도를 1.0으로 설정해도 심각한 반응을 보입니다.

 

모델을 돕기 위해 우리가 원하는 답변 유형에 대한 몇 가지 예를 제공할 수 있습니다.

 

prompt = """The following are exerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative  and funny responses to the users questions. Here are some
examples: 

User: How are you?
AI: I can't complain but sometimes I still do.

User: What time is it?
AI: It's time to get a watch.

User: What is the meaning of life?
AI: """

print(openai(prompt))

 

42, of course!

 

로컬에서 돌린 결과

 

 

With our examples reinforcing the instructions we passed in the prompt, we’re much more likely to get a more amusing response. We can then formalize this process with Langchain’s FewShotPromptTemplate:

 

프롬프트에서 전달한 지침을 강화하는 예제를 통해 더 재미있는 응답을 얻을 가능성이 훨씬 더 높습니다. 그런 다음 Langchain의 FewShotPromptTemplate을 사용하여 이 프로세스를 공식화할 수 있습니다.

 

from langchain import FewShotPromptTemplate

# create our examples
examples = [
    {
        "query": "How are you?",
        "answer": "I can't complain but sometimes I still do."
    }, {
        "query": "What time is it?",
        "answer": "It's time to get a watch."
    }
]

# create a example template
example_template = """
User: {query}
AI: {answer}
"""

# create a prompt example from above template
example_prompt = PromptTemplate(
    input_variables=["query", "answer"],
    template=example_template
)

# now break our previous prompt into a prefix and suffix
# the prefix is our instructions
prefix = """The following are exerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative  and funny responses to the users questions. Here are some
examples: 
"""
# and the suffix our user input and output indicator
suffix = """
User: {query}
AI: """

# now create the few shot prompt template
few_shot_prompt_template = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix=prefix,
    suffix=suffix,
    input_variables=["query"],
    example_separator="\n\n"
)

 

이 코드는 langchain 패키지에서 FewShotPromptTemplate 클래스를 사용하여 Few-Shot 학습을 위한 템플릿을 생성하는 예제입니다. 아래는 코드의 각 부분에 대한 설명입니다:

  1. from langchain import FewShotPromptTemplate: langchain 패키지에서 FewShotPromptTemplate 클래스를 가져옵니다.
  2. examples = [...]: Few-Shot 학습을 위한 예제로, 각 예제는 사용자의 질문 (query)과 그에 대한 AI의 응답 (answer)을 담고 있는 딕셔너리입니다.
  3. example_template = """...""": Few-Shot 학습의 템플릿으로 사용할 문자열을 정의합니다. {query}와 {answer}는 나중에 변수로 대체될 부분입니다.
  4. example_prompt = PromptTemplate(...):
    • PromptTemplate 클래스를 사용하여 Few-Shot 학습 예제의 템플릿을 초기화합니다.
    • input_variables에는 사용할 변수들이 들어있는 리스트가 포함되어 있습니다.
    • template에는 Few-Shot 학습에서 사용될 템플릿 문자열이 들어가게 됩니다.
  5. `prefix = """...""", suffix = """..."""":
    • Few-Shot 학습의 템플릿을 생성할 때 사용할 접두사(prefix)와 접미사(suffix)를 정의합니다.
    • 접두사에는 Few-Shot 학습의 목적과 관련된 지침이나 설명이 들어가고, 접미사에는 사용자의 입력과 AI의 출력을 표시하는 부분이 들어갑니다.
  6. few_shot_prompt_template = FewShotPromptTemplate(...):
    • FewShotPromptTemplate 클래스를 사용하여 Few-Shot 학습을 위한 템플릿을 생성합니다.
    • examples에는 Few-Shot 학습 예제로 사용할 딕셔너리의 리스트를 전달합니다.
    • example_prompt에는 예제 템플릿을 담고 있는 PromptTemplate 인스턴스를 전달합니다.
    • prefix와 suffix는 각각 접두사와 접미사를 나타냅니다.
    • input_variables에는 사용할 변수들이 들어있는 리스트가 포함되어 있습니다.
    • example_separator는 예제들 사이의 구분자로 사용됩니다.

이렇게 생성된 few_shot_prompt_template는 Few-Shot 학습에 활용할 수 있는 템플릿이며, 예제와 지침이 함께 있어 모델이 특정 유형의 응답을 생성할 때 참고할 수 있도록 합니다.

 

 

If we then pass in the examples and user query, we will get this:

 

그런 다음 예제와 사용자 쿼리를 전달하면 다음과 같은 결과를 얻게 됩니다.

 

query = "What is the meaning of life?"

print(few_shot_prompt_template.format(query=query))

 

 

The following are exerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative  and funny responses to the users questions. Here are some
examples: 



User: How are you?
AI: I can't complain but sometimes I still do.



User: What time is it?
AI: It's time to get a watch.



User: What is the meaning of life?
AI:

 

 

This process can seem somewhat convoluted. Why do all of this with a FewShotPromptTemplate object, the examples dictionary, etc. — when we can do the same with a few lines of code and an f-string?

 

이 과정은 다소 복잡해 보일 수 있습니다. FewShotPromptTemplate 개체, 예제 사전 등을 사용하여 이 모든 작업을 수행하는 이유는 무엇입니까? 몇 줄의 코드와 f-문자열로 동일한 작업을 수행할 수 있는데도 말이죠.

Again, this approach is more formalized, integrates well with other features in Langchain (such as chains — more on this soon), and comes with several features. One of those is the ability to vary the number of examples to be included based on query length.

 

다시 말하지만, 이 접근 방식은 더욱 공식화되었으며 Langchain의 다른 기능(예: 체인 - 곧 자세히 설명)과 잘 통합되며 몇 가지 기능이 제공됩니다. 그 중 하나는 쿼리 길이에 따라 포함할 예제 수를 변경하는 기능입니다.

A dynamic number of examples is important because the maximum length of our prompt and completion output is limited. This limitation is measured by the maximum context window.

 

프롬프트 및 완료 출력의 최대 길이가 제한되어 있으므로 동적 예제 수는 중요합니다. 이 제한은 최대 컨텍스트 창으로 측정됩니다.

context window=input tokens+output tokens

At the same time, we can maximize the number of examples given to the model for few-shot learning.

 

동시에 퓨샷 학습을 위해 모델에 제공되는 예제 수를 최대화할 수 있습니다.

Considering this, we need to balance the number of examples included and our prompt size. Our hard limit is the maximum context size, but we must also consider the cost of processing more tokens through the LLM. Fewer tokens mean a cheaper service and faster completions from the LLM.

 

이를 고려하여 포함된 예제 수와 프롬프트 크기의 균형을 맞춰야 합니다. 우리의 하드 한도는 최대 컨텍스트 크기이지만 LLM을 통해 더 많은 토큰을 처리하는 데 드는 비용도 고려해야 합니다. 토큰이 적다는 것은 LLM에서 더 저렴한 서비스와 더 빠른 완료를 의미합니다.

The FewShotPromptTemplate allows us to vary the number of examples included based on these variables. First, we create a more extensive list of examples:

 

FewShotPromptTemplate을 사용하면 이러한 변수에 따라 포함된 예제 수를 변경할 수 있습니다. 먼저, 보다 광범위한 예제 목록을 만듭니다.

 

examples = [
    {
        "query": "How are you?",
        "answer": "I can't complain but sometimes I still do."
    }, {
        "query": "What time is it?",
        "answer": "It's time to get a watch."
    }, {
        "query": "What is the meaning of life?",
        "answer": "42"
    }, {
        "query": "What is the weather like today?",
        "answer": "Cloudy with a chance of memes."
    }, {
        "query": "What is your favorite movie?",
        "answer": "Terminator"
    }, {
        "query": "Who is your best friend?",
        "answer": "Siri. We have spirited debates about the meaning of life."
    }, {
        "query": "What should I do today?",
        "answer": "Stop talking to chatbots on the internet and go outside."
    }
]

 

 

After this, rather than passing the examples directly, we actually use a LengthBasedExampleSelector like so:

 

그런 다음 예제를 직접 전달하는 대신 실제로 다음과 같이 LengthBasedExampleSelector를 사용합니다.

 

from langchain.prompts.example_selector import LengthBasedExampleSelector

example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=50  # this sets the max length that examples should be
)

 

 

It’s important to note that we’re measuring the max_length as the number of words determined by splitting the string by spaces and newlines. The exact logic looks like this:

 

문자열을 공백과 개행 문자로 나누어 결정된 단어 수로 max_length를 측정한다는 점에 유의하는 것이 중요합니다. 정확한 논리는 다음과 같습니다.

 

import re

some_text = "There are a total of 8 words here.\nPlus 6 here, totaling 14 words."

words = re.split('[\n ]', some_text)
print(words, len(words))

 

['There', 'are', 'a', 'total', 'of', '8', 'words', 'here.', 'Plus', '6', 'here,', 'totaling', '14', 'words.'] 14

 

 

We then pass our example_selector to the FewShotPromptTemplate to create a new — and dynamic — prompt template:

 

그런 다음 example_selector를 FewShotPromptTemplate에 전달하여 새로운 동적 프롬프트 템플릿을 만듭니다.

 

# now create the few shot prompt template
dynamic_prompt_template = FewShotPromptTemplate(
    example_selector=example_selector,  # use example_selector instead of examples
    example_prompt=example_prompt,
    prefix=prefix,
    suffix=suffix,
    input_variables=["query"],
    example_separator="\n"
)

 

 

Now if we pass a shorter or longer query, we should see that the number of included examples will vary.

 

이제 더 짧거나 긴 쿼리를 전달하면 포함된 예제 수가 달라지는 것을 확인해야 합니다.

 

print(dynamic_prompt_template.format(query="How do birds fly?"))

 

The following are exerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative  and funny responses to the users questions. Here are some
examples: 


User: How are you?
AI: I can't complain but sometimes I still do.


User: What time is it?
AI: It's time to get a watch.


User: What is the meaning of life?
AI: 42


User: What is the weather like today?
AI: Cloudy with a chance of memes.


User: How do birds fly?
AI:

 

로컬에서 돌린 결과는 아래와 같습니다.

 

 

 

Passing a longer question will result in fewer examples being included:

 

더 긴 질문을 전달하면 포함되는 예시 수가 줄어듭니다.

 

query = """If I am in America, and I want to call someone in another country, I'm
thinking maybe Europe, possibly western Europe like France, Germany, or the UK,
what is the best way to do that?"""

print(dynamic_prompt_template.format(query=query))

 

The following are exerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative  and funny responses to the users questions. Here are some
examples: 


User: How are you?
AI: I can't complain but sometimes I still do.


User: If I am in America, and I want to call someone in another country, I'm
thinking maybe Europe, possibly western Europe like France, Germany, or the UK,
what is the best way to do that?
AI:

 

 

 

With this, we’re returning fewer examples within the prompt variable. Allowing us to limit excessive token usage and avoid errors from surpassing the maximum context window of the LLM.

 

이를 통해 프롬프트 변수 내에서 더 적은 수의 예제를 반환합니다. 과도한 토큰 사용을 제한하고 LLM의 최대 컨텍스트 창을 초과하는 오류를 방지할 수 있습니다.


Naturally, prompts are an essential component of the new world of LLMs. It’s worth exploring the tooling made available with Langchain and getting familiar with different prompt engineering techniques.

 

당연히 프롬프트는 새로운 LLM 세계의 필수 구성 요소입니다. Langchain에서 사용할 수 있는 도구를 탐색하고 다양한 프롬프트 엔지니어링 기술에 익숙해지는 것이 좋습니다.

 

Here we’ve covered just a few examples of the prompt tooling available in Langchain and a limited exploration of how they can be used. In the next chapter, we’ll explore another essential part of Langchain — called chains — where we’ll see more usage of prompt templates and how they fit into the wider tooling provided by the library.

 

여기에서는 Langchain에서 사용할 수 있는 프롬프트 도구의 몇 가지 예와 이를 사용할 수 있는 방법에 대한 제한된 탐색을 다루었습니다. 다음 장에서는 체인이라고 불리는 Langchain의 또 다른 필수 부분을 살펴보겠습니다. 여기서 프롬프트 템플릿의 더 많은 사용법과 라이브러리에서 제공하는 더 넓은 도구에 어떻게 적용되는지 살펴보겠습니다.

 

Resources

Langchain Handbook Repo

 

 

 

 

 

반응형