데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      간단 예제와 함께한 Prompt basics 가이드

      nabbang 23.12.21
      1,950 17 1
      DEVOTEE 요약
      이 글은 Azure Prompt Workshop에서 배운 내용을 정리한 것으로, 프롬프트 작성 능력과 LLM(Large Language Models)을 이용한 질의응답의 다양한 기법을 소개하고 있습니다. 'zero-shot'(질문만 제시), 'few-shot'(질문과 함께 예시 몇 개 제시), 'CoT (Chain of Thought)'(단계별로 문제 해결을 유도) 방식을 통한 질문과 답변의 예를 들고 있으며, 이를 활용한 쿼리 생성 예시까지 시연하고 있습니다. Azure API를 통해 샘플링 방식과 토큰 수를 조절하면서 다양한 상황에서 적합한 프롬프트를 생성할 수 있음을 보여주고 있습니다.
      DEVOTEE 추천 블로그

      이번 블로그는 Azure Prompt Workshop 에 다녀와서 배운 내용 기반으로 정리해보았습니다.

      Azure API를 통해 샘플링 방식과 토큰 수를 조절하면서 다양한 상황에서 적합한 프롬프트를 생성할 수 있다는 점 등 많은 걸 알게된 교육이었습니다.


      역할

      1. system: 미리 정의된 페르소나

      2. user: 요청 메시지

      3. assistant: 답변

      예시,

      messages=[
          {"role": "system", "content": "Generate next conversation."},
          {"role": "user", "content": "Q: Roger has 5 tennis balss. He buys 2 more cans of tennis balls. Each can has 3 tennis balls. How many tennis balls does Roger have now?"},
          {"role": "assistant", "content": "A: The answer is 11."},
          {"role": "user", "content": "Q: A juggler can juggle 16 balls. Half of the balls are golf balls and half of the golf balls are blue. How many blue golf balls are there?"},
      ]


      기본 파라미터

      def call_openai(num_times, prompt, temperature, top_p):
          for i in range(num_times):
              response = openai.ChatCompletion.create(
                  engine=model,
                  messages = [{"role":"system", "content":"You are a helpful assistant."},
                              {"role":"user","content": prompt}],
                      max_tokens=60,
                      temperature = temperature,
                      top_p = top_p
              )
              print(response['choices'][0]['message']['content'])`
      • temperature(0~2)

      • top_p(0~1)

      두 파라미터 모두 방식이 다를뿐이지 같은 역할(샘플링)을 합니다.

      둘다 0으로 하면 매번 같은 답이 나오지만 0이상의 값을 넣으면 매번 다른 답이 나옵니다.

      두 파라미터는 동시에 사용하는 건 권장하지 않습니다. 둘 중 하나만 사용하여야합니다.


      Prompt Techniques

      1. zero-shot: LLM 에게 별다른 예시 없이 질문하는것

      2. few-shot: 몇가지의 예시 or 데모를 제공하고 질문하는 것

      3. CoT(Chain of Thought): LLM에게 step by step 단계별로 풀이하도록 질문하는것

      image.png

      예를 들어 위와같이, 중간 추론단계를 제공하여, 좀 더 복잡한 추론이 가능하도록 한 것입니다.

      def call_openai_api(messages, max_token=100, stop=None, n=1, temperature=0.1):
          response = openai.ChatCompletion.create(
              engine=model,
              messages=messages,
              temperature=temperature,
              max_tokens=max_token,
              stop=stop,
              n=n,
          )
          return response'

      그래서 zero-shot, few-shot 과 CoT를 연계해서 prompt를 작성할 수 있습니다. 다음은 몇가지 예시입니다.


      Zero shot

      Prompt

      시장을 가서 10개의 사과를 샀다. 이웃에게 2개를 주고 수선공에게 2개를 줬다. 그리고 5개의 사과를 더 샀고 1개를 먹었다. 몇개가 남았을까?

      Answer

      11개

      zero shot 으로 산수문제를 물어봤을때 틀렸습니다!


      zero-shot with CoT

      Prompt

      시장을 가서 10개의 사과를 샀다. 이웃에게 2개를 주고 수선공에게 2개를 줬다. 그리고 5개의 사과를 더 샀고 1개를 먹었다. 몇개가 남았을까?
      단계별로 생각해보자

      Answer

      1. 시장에서 10개의 사과를 샀다.
      2. 이웃에게 2개를 주었으므로, 남은 사과는 10 - 2 = 8개이다.
      3. 수선공에게 2개를 줬으므로, 남은 사과는 8 - 2 = 6개이다.
      4. 5개의 사과를 더 샀으므로, 남은 사과는 6 + 5 = 11개이다.
      5. 1개의 사과를 먹었으므로, 남은 사과는 11 - 1 = 10개이다.
      
      따라서, 사과는 10개가 남았다.

      정답~!

      CoT(단계별로 생각하기) 스킬을 이용해서 정답을 유도했습니다.


      Few shot

      피드백의 긍/부정 판단하는 질문을 몇가지의 예시와 함께 질문하였습니다.

      Prompt

      이거 대박입니다!! // 긍정
      이거 별로에요! // 부정
      정말 최고입니다 // 긍정
      무슨 이런 끔찍한 쇼인가요! //

      Answer

      부정

      이렇게 LLM 에게 샘플을 제공하고 질문하는 것이 few shot prompting 입니다.


      Practical example: SQL Query 만들기

      LLM은 쿼리도 잘짭니다.


      Prompt

      ### Postgres SQL tables, with their properties:
      #
      # Employee(id, name, department_id)
      # Department(id, name, address)
      # Salary_Payments(id, employee_id, amount, date)
      #
      ### 
      최근 3개월간 10명이상 채용을 진행한 부서를 찾는 쿼리
      
      쿼리:

      schema 를 간단히 제공하고, 찾고자 하는 조건을 명시하여 쿼리를 만들어달라고 요청해보겠습니다.

      SELECT department_id
      FROM Employee
      WHERE id IN (
          SELECT employee_id
          FROM Salary_Payments
          WHERE date >= current_date - interval '3 months'
          GROUP BY employee_id
          HAVING count(*) >= 10
      )
      GROUP BY department_id
      HAVING count(*) >= 10

      좋은 쿼리가 잘 나왔습니다!


      좀 더 체계적으로 쿼리 생성기를 만들고자 하면,

      query = '''
      Given the following SQL tables, your job is to write queries given a user’s request.
      
      CREATE TABLE Orders (
        OrderID int,
        CustomerID int,
        OrderDate datetime,
        OrderTime varchar(8),
        PRIMARY KEY (OrderID)
      );
      
      CREATE TABLE OrderDetails (
        OrderDetailID int,
        OrderID int,
        ProductID int,
        Quantity int,
        PRIMARY KEY (OrderDetailID)
      );
      
      CREATE TABLE Products (
        ProductID int,
        ProductName varchar(50),
        Category varchar(50),
        UnitPrice decimal(10, 2),
        Stock int,
        PRIMARY KEY (ProductID)
      );
      
      CREATE TABLE Customers (
        CustomerID int,
        FirstName varchar(50),
        LastName varchar(50),
        Email varchar(100),
        Phone varchar(20),
        PRIMARY KEY (CustomerID)
      );
      '''

      이렇게 모든 schema를 잘 정의해서 system 에 넘겨주도록 하겠습니다.

      request1 = "2023-04-01 의 모든 주문의 총 주문액 평균을 계산하는 SQL 쿼리를 작성해줘"
      
      response = openai.ChatCompletion.create(
        engine=model,
        messages = [{"role":"system", "content":query},
                     {"role":"user","content": request1}],
        temperature=0,
        max_tokens=500,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0,
        stop=["#",";"])
      print(response['choices'][0]['message']['content'])

      아래와 같이 깔끔한 쿼리 잘 나옵니다!

      SELECT AVG(total_order_value) AS average_total_order_value
      FROM (
        SELECT o.OrderID, SUM(od.Quantity * p.UnitPrice) AS total_order_value
        FROM Orders o
        INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
        INNER JOIN Products p ON od.ProductID = p.ProductID
        WHERE o.OrderDate = '2023-04-01'
        GROUP BY o.OrderID
      ) AS subquery

      이렇게 한번에 정의를 해두면, 다양한 케이스에서 좀 더 효율적으로 설계된 쿼리를 만들수 있습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      nabbang 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기