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