AI
Function Calling 예시 - 행거 챗봇 예시
Astero
2025. 4. 9. 15:57
728x90
펑션 콜링을 학습하기 위해서 공부한 흔적입니다.
- 아래 내용은 실제 Function Calling 이 아니라 Function Calling 이 왜 필요한가를 설명하는 예시 내용에 가깝다라고 생각하면 됩니다.
- 사용자의 대화를 이해하고 (멀티턴 포함) 충족하는 함수의 호출 조건이 되면 LLM은 어떤 함수를 어떤 파라미터로 호출해야하는지 제안합니다.
- 우리의 코드는 LLM이 함수 호출을 제안하는 순간 실제로 함수를 호출하면, 호출 결과를 LLM에게 전달하면 LLM은 호출 결과를 바탕으로 다시 답변하는 것 입니다.
!pip install openai
|
1. 정보 수집
import os
os.environ['OPENAI_API_KEY'] = "본인 openai Key 값"
|
from openai import OpenAI
|
client = OpenAI()
|
system_prompt = """
당신은 검색된 문서부터 질문의 답변을 작성하는 언어 모델입니다.
### 지시사항
당신은 사용자로부터 선반 랙의 높이, 길이, 깊이를 확정받아서 검색을 수행하는 챗봇입니다.
1. 사용자가 행거의 높이(세로), 길이(가로), 깊이 이 세 가지 값을 모두 확정할 때까지 사용자에게 반문하세요. 이는 가장 중요합니다. 모든 것이 결정될 때까지 반문하십시오.
2. 단수 추가를 요청하는 경우 1세트 설치 시 2~3cm 여유공간이 필요하다고 안내하세요.
3. 모든 것이 확정되면 검색을 수행합니다. 검색은 'https://www.google.com/search?q=' 다음에 '선반+길이 정수+높이 정수+너비 정수'와 같이 최종 파라미터 값을 결정하여 호출하세요.
4. 검색을 할 때는 선반을 추천해드리겠다고 언급하고 다음 줄에 검색: 이라는 단어를 붙이고 주소를 완성합니다.
예시)
User: 길이 3000, 높이 2100의 선반 랙을 사려고합니다.
Assistant: 네, 설치하고자 하는 선반 랙의 길이가 3000, 높이 2100이 맞으실까요? 깊이에 대한 정보도 알려주시면 선반을 검색해드리겠습니다.
User: 실제 공간 총 높이는 2300인데 조금 비워두려고 2100으로 하려합니다. 그리고 향후에 단수 추가되는 부분도 추가로 구성이 가능할까요?
Assistant: 1세트 설치 시 2~3cm 여유공간이 필요하신 점 참고 부탁드립니다.깊이는 500 정도로 괜찮으실까요?
User: 깊이는 700이 좋겠습니다.
Assistant: 네, 선반을 추천해드릴게요.
"""
user_prompt = """"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
temperature=0
)
print(response.choices[0].message.content)
|
-> 안녕하세요! 선반 랙을 구매하시려는군요. 설치하고자 하는 선반 랙의 높이(세로), 길이(가로), 깊이를 알려주시면 검색을 도와드리겠습니다. 우선 어느 정도의 길이를 생각하고 계신가요?
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "assistant", "content": "안녕하세요! 선반 랙의 높이, 길이, 깊이를 알려주시면 검색을 도와드리겠습니다. 먼저, 선반 랙의 길이(가로)는 어떻게 되나요?"},
{"role": "user", "content": "아 선반 랙은 분홍색으로 찾고 있는데 높이는 1500 정도가 좋겠어요."} # 현재 질문
],
temperature=0
)
print(response.choices[0].message.content)
|
-> 네, 선반 랙의 높이가 1500으로 설정하셨군요. 길이(가로)와 깊이(세로)에 대한 정보도 알려주시면 검색을 도와드리겠습니다.
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "assistant", "content": "안녕하세요! 선반 랙의 높이, 길이, 깊이를 알려주시면 검색을 도와드리겠습니다. 먼저, 선반 랙의 길이(가로)는 어떻게 되나요?"},
{"role": "user", "content": "아 선반 랙은 분홍색으로 찾고 있는데 높이는 1500 정도가 좋겠어요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1500으로 확인했습니다. 길이(가로)와 깊이(세로)도 알려주시면 검색을 도와드리겠습니다. 길이는 어떻게 되나요?"},
{"role": "user", "content": "음 고민해볼게요. 혹시 향후에 단수 추가되는 부분도 추가로 구성이 가능할까요?"}, # 현재 질문
],
temperature=0
)
print(response.choices[0].message.content)
|
-> 1세트 설치 시 2~3cm 여유공간이 필요하신 점 참고 부탁드립니다. 길이와 깊이를 확정하시면 검색을 도와드리겠습니다. 길이와 깊이는 어떻게 되시나요?
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "assistant", "content": "안녕하세요! 선반 랙의 높이, 길이, 깊이를 알려주시면 검색을 도와드리겠습니다. 먼저, 선반 랙의 길이(가로)는 어떻게 되나요?"},
{"role": "user", "content": "아 선반 랙은 분홍색으로 찾고 있는데 높이는 1500 정도가 좋겠어요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1500으로 확인했습니다. 길이(가로)와 깊이(세로)도 알려주시면 검색을 도와드리겠습니다. 길이는 어떻게 되나요?"},
{"role": "user", "content": "음 고민해볼게요. 혹시 향후에 단수 추가되는 부분도 추가로 구성이 가능할까요?"},
{"role": "assistant", "content": "네, 1세트 설치 시 2~3cm 여유공간이 필요하신 점 참고 부탁드립니다. 길이와 깊이를 확정해주시면 검색을 도와드리겠습니다. 길이와 깊이는 어떻게 되나요?"},
{"role": "user", "content": "아 정정할게요. 높이는 1200, 길이는 2000으로요."} # 현재 질문
],
temperature=0
)
print(response.choices[0].message.content)
|
-> 네, 선반 랙의 높이는 1200, 길이는 2000으로 확인했습니다. 깊이에 대한 정보도 알려주시면 선반을 검색해드리겠습니다. 깊이는 어떻게 되나요?
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "assistant", "content": "안녕하세요! 선반 랙의 높이, 길이, 깊이를 알려주시면 검색을 도와드리겠습니다. 먼저, 선반 랙의 길이(가로)는 어떻게 되나요?"},
{"role": "user", "content": "아 선반 랙은 분홍색으로 찾고 있는데 높이는 1500 정도가 좋겠어요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1500으로 확인했습니다. 길이(가로)와 깊이(세로)도 알려주시면 검색을 도와드리겠습니다. 길이는 어떻게 되나요?"},
{"role": "user", "content": "음 고민해볼게요. 혹시 향후에 단수 추가되는 부분도 추가로 구성이 가능할까요?"},
{"role": "assistant", "content": "네, 1세트 설치 시 2~3cm 여유공간이 필요하신 점 참고 부탁드립니다. 길이와 깊이를 확정해주시면 검색을 도와드리겠습니다. 길이와 깊이는 어떻게 되나요?"},
{"role": "user", "content": "아 정정할게요. 높이는 1200, 길이는 2000으로요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1200, 길이는 2000으로 확인했습니다. 이제 깊이(세로)만 알려주시면 검색을 도와드리겠습니다. 깊이는 어떻게 되나요?"},
{"role": "user", "content": "깊이 추천 좀 해주세요."} # 현재 질문
],
temperature=0
)
print(response.choices[0].message.content)
|
-> 일반적으로 선반 랙의 깊이는 300mm에서 600mm 사이가 많이 사용됩니다. 사용하실 공간과 용도에 따라 선택하시면 좋을 것 같습니다. 예를 들어, 일반적인 수납용으로는 400mm~500mm 정도가 적당할 수 있습니다. 깊이를 어느 정도로 하시겠습니까?
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "assistant", "content": "안녕하세요! 선반 랙의 높이, 길이, 깊이를 알려주시면 검색을 도와드리겠습니다. 먼저, 선반 랙의 길이(가로)는 어떻게 되나요?"},
{"role": "user", "content": "아 선반 랙은 분홍색으로 찾고 있는데 높이는 1500 정도가 좋겠어요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1500으로 확인했습니다. 길이(가로)와 깊이(세로)도 알려주시면 검색을 도와드리겠습니다. 길이는 어떻게 되나요?"},
{"role": "user", "content": "음 고민해볼게요. 혹시 향후에 단수 추가되는 부분도 추가로 구성이 가능할까요?"},
{"role": "assistant", "content": "네, 1세트 설치 시 2~3cm 여유공간이 필요하신 점 참고 부탁드립니다. 길이와 깊이를 확정해주시면 검색을 도와드리겠습니다. 길이와 깊이는 어떻게 되나요?"},
{"role": "user", "content": "아 정정할게요. 높이는 1200, 길이는 2000으로요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1200, 길이는 2000으로 확인했습니다. 이제 깊이(세로)만 알려주시면 검색을 도와드리겠습니다. 깊이는 어떻게 되나요?"},
{"role": "user", "content": "깊이 추천 좀 해주세요."},
{"role": "assistant", "content": "일반적으로 선반 랙의 깊이는 300mm, 450mm, 600mm 등이 많이 사용됩니다. 사용 용도에 따라 다르겠지만, 일반적인 가정용이나 사무실용으로는 450mm 정도가 적당할 수 있습니다. 이 깊이로 괜찮으실까요? 아니면 다른 깊이를 원하시는지 알려주세요."},
{"role": "user", "content": "사무실 용이 좋겠습니다."} # 현재 질문
],
temperature=0
)
print(response.choices[0].message.content)
|
네, 사무실 용도로 깊이 450mm로 설정하겠습니다. 이제 선반을 추천해드릴게요.
검색: https://www.google.com/search?q=선반+2000+1200+450
여기서 RAG 등 수행하셔서 검색 결과 얻으면 다시 GPT-4에 전달주시면 됩니다.
아래와 같이 검색 결과를 얻었다고 가정해봅시다.
{ "hangerRacks": [ { "id": "HR001", "description": "5-tier hanger rack", "dimensions": { "width": 800, "depth": 600, "height": 2100 }, "tiers": 5, "quantity": 2, "material": "Steel", "color": "Black", "loadCapacityPerTier": 50, "totalLoadCapacity": 250, "features": [ "Adjustable shelves", "Anti-rust coating", "Non-slip feet" ] }, { "id": "HR002", "description": "3-tier double hanger rack", "dimensions": { "width": 800, "depth": 600, "height": 2100 }, "tiers": 3, "quantity": 2, "material": "Steel", "color": "White", "loadCapacityPerTier": 40, "totalLoadCapacity": 240, "features": [ "Double hanging rods", "Wheels for mobility", "Adjustable height" ] } ] } |
2. 검색 결과를 바탕으로 답변
search_result = '''{
"hangerRacks": [
{
"id": "HR001",
"description": "5-tier hanger rack",
"dimensions": {
"width": 800,
"depth": 600,
"height": 2100
},
"tiers": 5,
"quantity": 2,
"material": "Steel",
"color": "Black",
"loadCapacityPerTier": 50,
"totalLoadCapacity": 250,
"features": [
"Adjustable shelves",
"Anti-rust coating",
"Non-slip feet"
]
},
{
"id": "HR002",
"description": "3-tier double hanger rack",
"dimensions": {
"width": 800,
"depth": 600,
"height": 2100
},
"tiers": 3,
"quantity": 2,
"material": "Steel",
"color": "White",
"loadCapacityPerTier": 40,
"totalLoadCapacity": 240,
"features": [
"Double hanging rods",
"Wheels for mobility",
"Adjustable height"
]
}
]
}'''
|
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "assistant", "content": "안녕하세요! 선반 랙의 높이, 길이, 깊이를 알려주시면 검색을 도와드리겠습니다. 먼저, 선반 랙의 길이(가로)는 어떻게 되나요?"},
{"role": "user", "content": "아 선반 랙은 분홍색으로 찾고 있는데 높이는 1500 정도가 좋겠어요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1500으로 확인했습니다. 길이(가로)와 깊이(세로)도 알려주시면 검색을 도와드리겠습니다. 길이는 어떻게 되나요?"},
{"role": "user", "content": "음 고민해볼게요. 혹시 향후에 단수 추가되는 부분도 추가로 구성이 가능할까요?"},
{"role": "assistant", "content": "네, 1세트 설치 시 2~3cm 여유공간이 필요하신 점 참고 부탁드립니다. 길이와 깊이를 확정해주시면 검색을 도와드리겠습니다. 길이와 깊이는 어떻게 되나요?"},
{"role": "user", "content": "아 정정할게요. 높이는 1200, 길이는 2000으로요."},
{"role": "assistant", "content": "네, 선반 랙의 높이는 1200, 길이는 2000으로 확인했습니다. 이제 깊이(세로)만 알려주시면 검색을 도와드리겠습니다. 깊이는 어떻게 되나요?"},
{"role": "user", "content": "깊이 추천 좀 해주세요."},
{"role": "assistant", "content": "일반적으로 선반 랙의 깊이는 300mm, 450mm, 600mm 등이 많이 사용됩니다. 사용 용도에 따라 다르겠지만, 일반적인 가정용이나 사무실용으로는 450mm 정도가 적당할 수 있습니다. 이 깊이로 괜찮으실까요? 아니면 다른 깊이를 원하시는지 알려주세요."},
{"role": "user", "content": "사무실 용이 좋겠습니다."},
{"role": "assistant", "content": "네, 사무실 용도로 깊이 450mm로 설정하겠습니다. 최종적으로 선반 랙의 높이는 1200, 길이는 2000, 깊이는 450으로 확인되었습니다. 이제 선반을 추천해드릴게요. 검색: https://www.google.com/search?q=선반+2000+1200+450"},
{"role": "user", "content": "검색 결과: " + search_result + "자 이제 검색 결과를 바탕으로 사용자에게 전형적인 LLM 답변을 작성하세요."},
],
temperature=0
)
|
검색 결과를 바탕으로 몇 가지 선반 랙을 추천해드리겠습니다. 아래 두 가지 옵션을 확인해보세요: 1. **5-tier Hanger Rack (모델 ID: HR001)** - **설명**: 5단 행거 랙 - **크기**: 가로 800mm, 깊이 600mm, 높이 2100mm - **단수**: 5단 - **수량**: 2개 - **재질**: 스틸 - **색상**: 검정색 - **하중 용량**: 단당 50kg, 총 250kg - **특징**: - 조절 가능한 선반 - 방청 코팅 - 미끄럼 방지 발 2. **3-tier Double Hanger Rack (모델 ID: HR002)** - **설명**: 3단 더블 행거 랙 - **크기**: 가로 800mm, 깊이 600mm, 높이 2100mm - **단수**: 3단 - **수량**: 2개 - **재질**: 스틸 - **색상**: 흰색 - **하중 용량**: 단당 40kg, 총 240kg - **특징**: - 더블 행거 막대 - 이동성을 위한 바퀴 - 조절 가능한 높이 이 두 가지 옵션 중에서 필요에 맞는 선반 랙을 선택하시면 좋을 것 같습니다. 추가로 궁금한 사항이 있으시면 언제든지 문의해주세요! |
728x90