23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
이번 블로그는 Azure Prompt Workshop 에 다녀와서 배운 내용 기반으로 정리해보았습니다.
Azure API를 통해 샘플링 방식과 토큰 수를 조절하면서 다양한 상황에서 적합한 프롬프트를 생성할 수 있다는 점 등 많은 걸 알게된 교육이었습니다.
system: 미리 정의된 페르소나
user: 요청 메시지
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이상의 값을 넣으면 매번 다른 답이 나옵니다.
두 파라미터는 동시에 사용하는 건 권장하지 않습니다. 둘 중 하나만 사용하여야합니다.
zero-shot: LLM 에게 별다른 예시 없이 질문하는것
few-shot: 몇가지의 예시 or 데모를 제공하고 질문하는 것
CoT(Chain of Thought): LLM에게 step by step 단계별로 풀이하도록 질문하는것
예를 들어 위와같이, 중간 추론단계를 제공하여, 좀 더 복잡한 추론이 가능하도록 한 것입니다.
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를 작성할 수 있습니다. 다음은 몇가지 예시입니다.
Prompt
시장을 가서 10개의 사과를 샀다. 이웃에게 2개를 주고 수선공에게 2개를 줬다. 그리고 5개의 사과를 더 샀고 1개를 먹었다. 몇개가 남았을까?Answer
11개zero shot 으로 산수문제를 물어봤을때 틀렸습니다!
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(단계별로 생각하기) 스킬을 이용해서 정답을 유도했습니다.
피드백의 긍/부정 판단하는 질문을 몇가지의 예시와 함께 질문하였습니다.
Prompt
이거 대박입니다!! // 긍정
이거 별로에요! // 부정
정말 최고입니다 // 긍정
무슨 이런 끔찍한 쇼인가요! //Answer
부정이렇게 LLM 에게 샘플을 제공하고 질문하는 것이 few shot prompting 입니다.
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이렇게 한번에 정의를 해두면, 다양한 케이스에서 좀 더 효율적으로 설계된 쿼리를 만들수 있습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.