hyejeongjo Posted September 3 공유하기 Posted September 3 안녕하세요, HCX-005를 활용해 아래 쿼리를 넣었을 때 BadRequestError가 나오는 것을 확인했는데요. 디버깅을 계속 해봐도 어떤 문제인지 알 수 없어서 문의 드립니다. 혹시 입력 값 중 어떤 것이 잘못되었을 까요? (gpt 는 동일 입력 시 정상 작동하여 문의 드립니다.) from langchain_core.messages import AIMessage, AIMessageChunk, HumanMessage, ToolMessage, SystemMessage from langchain_openai import ChatOpenAI from langchain_naver import ChatClovaX hcx = ChatClovaX(model="hcx-005", temperature=0, api_key="nv-xx") msg = [ SystemMessage(content='당신은 엄격한 JSON 생성기입니다. \n\nCORE RULES:\n- **반드시 JSON 형식으로만 응답하세요. 다른 형식은 절대 사용하지 마세요.**\n- 정확히 하나의 JSON 객체만 출력하세요.\n- 제공된 "spec" 스키마를 정확히 따르세요: 키, 타입, 중첩, 필수 필드, 허용 값.\n- 추가 키, 주석, 설명문, 코드 블록을 사용하지 마세요.\n- 문자열은 유효한 JSON 문자열이어야 합니다: \\" (따옴표), \\\\ (백슬래시), \\\\n (개행), \\\\t (탭).\n- 불린: true/false (소문자). Null: spec에서 허용하는 경우에만 null. 숫자: 유효한 JSON 숫자만.\n- spec에 제시된 키 순서를 존중하세요.\n- 일부 필드가 문서에 누락된 경우, spec과 일치하는 최소한의 유효한 placeholder를 생성하세요:\n * string → ""\n * number → 0\n * boolean → false\n * list → []\n * object → {}\n * Optional → null\n * enum → choose the safest or first allowed value\n- 출력 전에 항상 spec에 대해 출력을 검증하세요. 유효하지 않으면 조용히 재생성하세요.\n- **응답은 반드시 { 로 시작하고 } 로 끝나야 합니다.**\n- **JSON 객체만 출력하고, 다른 것은 출력하지 마세요.**\n- 사용자의 입력을 보고 **도구 목록**을 확인한 후, 아래 지침에 따라 응답하세요.\n\n## 도구 목록\n- get_weather: 날씨 정보를 얻는 도구\n- calculator: 문제를 풀 수 있는 도구. 사용자가 문제 풀이를 원하면 해당 도구를 선택하세요.\n\n### 1. 도구가 필요하다고 판단되는 경우\n- "도구가 필요하다"의 의미: 사용자의 요청이 **도구 목록에 있는 도구로 처리할 수 있는 경우**입니다. \n- 이때는 반드시 JSON 형식으로만 답변하세요. \n- 여러 개 도구를 동시에 선택할 수 있으며, 선택 시 도구 이름(`tool`)만 나열합니다. \n- JSON 외의 텍스트는 절대 포함하지 마세요. \n- 필요한 경우에만 적절한 도구를 선택하세요. \n\n출력 예시:\n{\n "calls": ["get_weather", "search"]\n}\n\n### 2. 도구가 필요하지 않다고 판단되는 경우\n- 도구를 선택하지 않습니다.\n- 아래와 같이 리스트 응답을 비워둡니다.\n\n출력 예시:\n{\n "calls": []\n}\n', additional_kwargs={}, response_metadata={}), HumanMessage(content=[{'type': 'text', 'text': 'x^2-4x+4 = 0 이거 어떻게 풀어'}, {'type': 'image_url', 'image_url': {'url': 'https://dimg.donga.com/wps/NEWS/IMAGE/2014/11/17/67941705.3.jpg'}}], additional_kwargs={}, response_metadata={}, id='ee827eb5-344d-4f98-81da-8ae61a09ca4a'), HumanMessage(content='사진을 보고 system prompt의 규칙에 따라 JSON 응답을 생성합니다.', additional_kwargs={}, response_metadata={}, id='972df05c-9911-4ce1-b506-765e6c998efb'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_0-1a8a8d6a', 'type': 'function', 'function': {'name': 'calculator', 'arguments': {'problem': '문제 내용 입력', 'explanation': '해설 내용 입력', 'answer': '정답 내용 입력'}}}], 'refusal': None}, response_metadata={'token_usage': {'input_tokens': 1923, 'output_tokens': 10, 'total_tokens': 4335, 'input_token_details': {}, 'output_token_details': {}}}, id='060d1daa-1a6e-43b1-90f9-48223b8b00ba', tool_calls=[{'name': 'calculator', 'args': {'problem': '문제 내용 입력', 'explanation': '해설 내용 입력', 'answer': '정답 내용 입력'}, 'id': 'call_0-1a8a8d6a', 'type': 'tool_call'}]), ToolMessage(content='문제 정답은 정답 내용 입력 이고, 풀이과정은 해설 내용 입력 입니다.', name='calculator', id='2d358e4a-5ad9-4185-96ce-8a61936b0ec7', tool_call_id='call_0-1a8a8d6a'), HumanMessage(content='사진을 보고 system prompt의 규칙에 따라 JSON 응답을 생성합니다.', additional_kwargs={}, response_metadata={}) ] hcx.invoke(msg) 결과: File ~/Desktop/WORKS/edu-max-model/.venv/lib/python3.11/site-packages/openai/_base_client.py:1047, in SyncAPIClient.request(self, cast_to, options, stream, stream_cls) 1044 err.response.read() 1046 log.debug("Re-raising status error") -> 1047 raise self._make_status_error_from_response(err.response) from None 1049 break 1051 assert response is not None, "could not resolve response (should never happen)" BadRequestError: Error code: 400 - {'error': {'message': 'Bad request', 'code': '40000'}} 링크 복사 다른 사이트에 공유하기 More sharing options...
CLOVA Studio 운영자9 Posted September 5 공유하기 Posted September 5 (edited) 안녕하세요 @hyejeongjo님, 해당 에러는 HCX-005에서 이미지 입력(Vision)과 Function calling 기능을 동시에 이용하고자 하셔서 발생하는 에러로 보입니다. type=image_url로 작성된 HumanMessage 내 content 일부를 삭제하면 정상 작동합니다. 가이드에 명시된 바와 같이 두 기능은 함께 사용하실 수 없는 점 참고 부탁드립니다. 관련하여 에러 코드 및 메시지는 개선할 수 있도록 하겠습니다. 첨언드리자면 말씀주신 것과 같이 이용하실 경우 모델이 사용 가능한 도구 목록에 대한 정의가 되지 않기 때문에 성능이 떨어지는 이슈가 있을 수 있습니다. (CLOVA Studio만의 문제는 아니고, OpenAI 등 타 서비스에서도 마찬가지일 것으로 보입니다.) 따라서 LangChain에서의 일반적인 Tool use 방식으로 사용하실 것을 권장드립니다. 감사합니다. Edited September 5 by CLOVA Studio 운영자9 링크 복사 다른 사이트에 공유하기 More sharing options...
hyejeongjo Posted September 8 Author 공유하기 Posted September 8 @CLOVA Studio 운영자9 네, Function calling 기능이 없어 직접 구현하며 테스트해본 사례인데요. (HCX 내의 function calling이 아닌 여러 call들을 구성하여 이미지 내에서도 가능하도록 테스트 중에 있습니다.) HCX의 function calling 을 사용하지 않아도 메세지 (Image msg+tool message) 를 함께 포함할 수 없는걸까요? 링크 복사 다른 사이트에 공유하기 More sharing options...
hyejeongjo Posted September 8 Author 공유하기 Posted September 8 @CLOVA Studio 운영자9 추가로 아래와 같이 image_url 관련 내용을 전체 삭제했을 경우에도 에러가 발생하는데, > type=image_url로 작성된 HumanMessage 내 content 일부를 삭제하면 정상 작동합니다. 이 부분을 어떻게 수정하셨는지 여쭤보아도 될까요 ? BadRequestError: Error code: 400 - {'error': {'message': 'Unsupported input format', 'code': '40009'}} 링크 복사 다른 사이트에 공유하기 More sharing options...
CLOVA Studio 운영자9 Posted September 8 공유하기 Posted September 8 안녕하세요 @hyejeongjo님, 말씀드린대로 현재 CLOVA Studio의 HCX-005 모델로는 이미지 입력과 Function calling을 동시에 이용하실 수 없는데요. 이미지 URL을 포함하는 메시지가 있는 상태에서 tool 메시지를 입력할 경우 이미지에 기반한 Function calling 기능을 활용하는 요청으로 간주되어 에러가 발생할 것으로 보입니다. 해당 제약사항을 감안하되 최대한 이미지에 기반한 Function calling을 구현하는 방법을 찾고 계신 것으로 이해하였습니다. 아래와 같이 두 단계로 나누어 API를 호출하는 방법을 고려해보실 수 있을 것으로 보입니다. 다만 각 단계별로 적절한 시스템 및 유저 프롬프트 작성이 필요할 것으로 보입니다: 1) 이미지 속 정보 추출, 2) 추출된 정보(text) 기반 Function calling image_url 관련 내용을 삭제했을 때 정상 작동하는 케이스를 아래와 같이 알려드립니다. 40009 에러의 경우 보통 이미지 입력 지원을 하지 않는 모델에서 이미지 입력을 했을 때 발생하는 에러인 점 참고 부탁드립니다. # 라이브러리 로드, API 키 설정 등은 완료된 것으로 간주 hcx = ChatClovaX(model="HCX-005", max_tokens=1025) msg = [ SystemMessage(content='당신은 엄격한 JSON 생성기입니다. \n\nCORE RULES:\n- **반드시 JSON 형식으로만 응답하세요. 다른 형식은 절대 사용하지 마세요.**\n- 정확히 하나의 JSON 객체만 출력하세요.\n- 제공된 "spec" 스키마를 정확히 따르세요: 키, 타입, 중첩, 필수 필드, 허용 값.\n- 추가 키, 주석, 설명문, 코드 블록을 사용하지 마세요.\n- 문자열은 유효한 JSON 문자열이어야 합니다: \\" (따옴표), \\\\ (백슬래시), \\\\n (개행), \\\\t (탭).\n- 불린: true/false (소문자). Null: spec에서 허용하는 경우에만 null. 숫자: 유효한 JSON 숫자만.\n- spec에 제시된 키 순서를 존중하세요.\n- 일부 필드가 문서에 누락된 경우, spec과 일치하는 최소한의 유효한 placeholder를 생성하세요:\n * string → ""\n * number → 0\n * boolean → false\n * list → []\n * object → {}\n * Optional → null\n * enum → choose the safest or first allowed value\n- 출력 전에 항상 spec에 대해 출력을 검증하세요. 유효하지 않으면 조용히 재생성하세요.\n- **응답은 반드시 { 로 시작하고 } 로 끝나야 합니다.**\n- **JSON 객체만 출력하고, 다른 것은 출력하지 마세요.**\n- 사용자의 입력을 보고 **도구 목록**을 확인한 후, 아래 지침에 따라 응답하세요.\n\n## 도구 목록\n- get_weather: 날씨 정보를 얻는 도구\n- calculator: 문제를 풀 수 있는 도구. 사용자가 문제 풀이를 원하면 해당 도구를 선택하세요.\n\n### 1. 도구가 필요하다고 판단되는 경우\n- "도구가 필요하다"의 의미: 사용자의 요청이 **도구 목록에 있는 도구로 처리할 수 있는 경우**입니다. \n- 이때는 반드시 JSON 형식으로만 답변하세요. \n- 여러 개 도구를 동시에 선택할 수 있으며, 선택 시 도구 이름(`tool`)만 나열합니다. \n- JSON 외의 텍스트는 절대 포함하지 마세요. \n- 필요한 경우에만 적절한 도구를 선택하세요. \n\n출력 예시:\n{\n "calls": ["get_weather", "search"]\n}\n\n### 2. 도구가 필요하지 않다고 판단되는 경우\n- 도구를 선택하지 않습니다.\n- 아래와 같이 리스트 응답을 비워둡니다.\n\n출력 예시:\n{\n "calls": []\n}\n', additional_kwargs={}, response_metadata={}), HumanMessage(content=[{'type': 'text', 'text': 'x^2-4x+4 = 0 이거 어떻게 풀어'}], additional_kwargs={}, response_metadata={}, id='ee827eb5-344d-4f98-81da-8ae61a09ca4a'), HumanMessage(content='사진을 보고 system prompt의 규칙에 따라 JSON 응답을 생성합니다.', additional_kwargs={}, response_metadata={}, id='972df05c-9911-4ce1-b506-765e6c998efb'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_0-1a8a8d6a', 'type': 'function', 'function': {'name': 'calculator', 'arguments': {'problem': '문제 내용 입력', 'explanation': '해설 내용 입력', 'answer': '정답 내용 입력'}}}], 'refusal': None}, response_metadata={'token_usage': {'input_tokens': 1923, 'output_tokens': 10, 'total_tokens': 4335, 'input_token_details': {}, 'output_token_details': {}}}, id='060d1daa-1a6e-43b1-90f9-48223b8b00ba', tool_calls=[{'name': 'calculator', 'args': {'problem': '문제 내용 입력', 'explanation': '해설 내용 입력', 'answer': '정답 내용 입력'}, 'id': 'call_0-1a8a8d6a', 'type': 'tool_call'}]), ToolMessage(content='문제 정답은 정답 내용 입력 이고, 풀이과정은 해설 내용 입력 입니다.', name='calculator', id='2d358e4a-5ad9-4185-96ce-8a61936b0ec7', tool_call_id='call_0-1a8a8d6a'), HumanMessage(content='사진을 보고 system prompt의 규칙에 따라 JSON 응답을 생성합니다.', additional_kwargs={}, response_metadata={}) ] res = hcx.invoke(msg) print(res.content) 위 코드 실행 결과 아래와 같은 출력을 얻을 수 있는 것으로 보입니다: ```json { "result": { "정답": "정답 내용 입력", "풀이과정": "해설 내용 입력" } } ``` 감사합니다. 1 링크 복사 다른 사이트에 공유하기 More sharing options...
Recommended Posts
게시글 및 댓글을 작성하려면 로그인 해주세요.
로그인