탱구탱구 Posted June 30, 2025 공유하기 Posted June 30, 2025 (edited) 안녕하세요 langchain-naver를 통해 ChatClovaX를 사용하고 있는데요. 랭체인 도구중 StructuredTool을 지원하지 않는 것으로 확인되는데.. 혹시 지원 계획이 있을까요? docstring이나 description에 적은 형태로 매개변수를 생성하여 tool calling이 잘 안되는 것 같아서 문의드립니다. 그리고 혹시 각 tool의 결과값을 다음 tool의 매개변수로 잘 활용하기 위해서 명시해야하는 prompt나 desc, docstring이 있을까요? Edited June 30, 2025 by 탱구탱구 링크 복사 다른 사이트에 공유하기 More sharing options...
CLOVA Studio 운영자9 Posted July 1, 2025 공유하기 Posted July 1, 2025 안녕하세요 @탱구탱구님, Function calling 기능을 지원하는 HCX-005, HCX-DASH-002 두 모델을 사용하실 경우, langchain-naver를 통한 Tool 관련 기능 역시 사용하실 수 있습니다. 다만 max_tokens를 1024 이상으로 정의하셔야 하는 점 참고 부탁드립니다. (API 가이드) 또한 아마 정의하시는 Tool의 복잡도에 따라 기대하시는 바에 맞게 동작하지 않을 수 있는데요. 간단한 예제로는 StructuredTool도 잘 작동하는 것으로 확인되어 혹시 지원하지 않는 것으로 확인하신 이유 또는 실행하신 코드 스니펫을 공유해주실 수 있을까요? 확인해보고 보다 상세히 답변드릴 수 있도록 하겠습니다. 감사합니다. 링크 복사 다른 사이트에 공유하기 More sharing options...
탱구탱구 Posted July 1, 2025 Author 공유하기 Posted July 1, 2025 안녕하세요 일단 날짜 조회 하는 부분부터 이슈가 있어서 전달드립니다. Tool.fromFunction을 통해서 호출할 때는 년도가 잘못 나오는 경우를 제외하면 요청 및 응답은 오는데요. 다만 @tool 데코레이션이나 StructuredTool을 통해 tool을 정의할 경우 디버그 오류가 아래 볼드처리된 부분만 나오고 끝이라서요. httpx.HTTPStatusError: Client error '400 Bad Request' for url 'https://clovastudio.stream.ntruss.com/v1/openai/chat/completions' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400 같은 코드에서 ChatOpenAi나 ChatAnthropic을 사용했을 때는 두 모델 모두 정상이라서요. 혹시 코드상에 문제가 되는 부분이 있다면 피드백 부탁드립니다. 아래는 도구 정의 및 호출하는 코드입니다. def get_current_datetime(dummy: str = "now") -> str: """오늘 날짜를 ISO 8601 형식으로 반환합니다.""" print("[tool 호출] 날짜 조회->", datetime.now().isoformat()) kst = timezone(timedelta(hours=9)) current_time = datetime.now() return {"current_time": current_time.isoformat()} TOOLS = [ StructuredTool.from_function( func=get_current_datetime, name="get_current_datetime", description="오늘 시간을 ISO 8601 형식으로 반환합니다. 입력은 무시됩니다." ) ] model = ChatClovaX(temperature=0.5, model="HCX-DASH-002", max_tokens=3000) # HCX-005, HCX-DASH-002 # create_react_agent app = create_react_agent( model=model, tools=tools, prompt=system_prompt, interrupt_before=None, interrupt_after=None, debug=True ) async def run_graph_stream(query: str, user_id: str, room_id: str): state = { "messages": [ HumanMessage( content=query, # additional_kwargs={"user_id": user_id, "meeting_id": room_id}, ) ] } print(f"=== DEBUG: 상태 생성 완료 ===") print(f"메시지 개수: {len(state['messages'])}") try: async for msg, metadata in app.astream(state, stream_mode="messages"): print(f"=== DEBUG: 스트림 응답 ===") print(f"메시지 타입: {type(msg)}") print(f"메시지 내용: {msg}") if isinstance(msg, AIMessageChunk): content_text = "" if hasattr(msg, 'content') and msg.content: if isinstance(msg.content, str): content_text = msg.content elif isinstance(msg.content, list): # content가 list인 경우 (Anthropic 형식) for item in msg.content: if isinstance(item, dict) and item.get('type') == 'text': content_text += item.get('text', '') elif hasattr(item, 'text'): content_text += item.text if content_text: data = { "type": "token", "content": content_text, "timestamp": datetime.now().isoformat() } yield f"data: {json.dumps(data)}\n\n" yield f"data: {json.dumps({'type': 'done'})}\n\n" except Exception as e: print(f"=== DEBUG: 스트림 에러 ===") print(f"에러: {str(e)}") error_data = { "type": "error", "content": f"에러 발생: {str(e)}", "timestamp": datetime.now().isoformat() } yield f"data: {json.dumps(error_data)}\n\n" 1 링크 복사 다른 사이트에 공유하기 More sharing options...
탱구탱구 Posted July 1, 2025 Author 공유하기 Posted July 1, 2025 (edited) 위 예시 코드에 tools = TOOLS 가 누락됬네요. 이부분 수정이 안되서 댓글로 추가하겠습니다. Edited July 1, 2025 by 탱구탱구 1 링크 복사 다른 사이트에 공유하기 More sharing options...
CLOVA Studio 운영자9 Posted July 10, 2025 공유하기 Posted July 10, 2025 안녕하세요 @탱구탱구님, 답변이 늦어진 점 양해 부탁드립니다. 우선 앞서 아래 문의주신 내용과 관련해서 답변드립니다: Quote 혹시 각 tool의 결과값을 다음 tool의 매개변수로 잘 활용하기 위해서 명시해야하는 prompt나 desc, docstring이 있을까요? -> 각 tool의 결과 값을 다음 tool의 매개변수로 잘 활용하기 위한 범용적인 프롬프트나 설명은 따로 없습니다. 다만 "이전 툴에서 온 결과를 특정 oo파라미터에 반드시 적용해야한다" 등의 프롬프트를 사용하면 조금 도움이 될 것으로 생각됩니다. 번거로우시겠지만 직접 변경하면서 최적의 프롬프트(설명)을 찾는 것을 권장드립니다. 또한 공유주신 코드에서 에러가 발생하는 것은 이용하시려는 함수에서 dummy라는 변수의 기본값을 "now"로 설정하는 부분 때문인 것으로 보입니다. 자세한 원인 파악 및 개선 진행중에 있으며, 현재로서는 해당 부분을 제외하면 정상 작동하는 점 참고 부탁드립니다. def get_current_datetime(dummy: str = "now") -> str: 해당 수정에도 불가하고 원하는 응답을 내려주지 않는 문제가 있는데, 이 부분은 품질상의 문제로, 함수 실행 결과의 "current_time" 필드가 현재 시간이라는 점을 프롬프트 또는 함수 설명에 추가하거나 함수 실행 결과 필드명을 "현재_시간" 등으로 변경하면 해소가 되는 것으로 보입니다. 확인 부탁드리며, 추가로 궁금하신 점이 있는 경우 편히 말씀주세요. 감사합니다. 링크 복사 다른 사이트에 공유하기 More sharing options...
CLOVA Studio 운영자9 Posted August 7, 2025 공유하기 Posted August 7, 2025 (edited) 안녕하세요 @탱구탱구님, 말씀주셨던 이슈 어제 배포된 langchain-naver v0.1.1부터는 발생하지 않는 것으로 보이는데요. 패키지 업데이트 후에도 재현이 된다면 말씀 부탁드립니다. 자세한 내용은 아래 문서를 확인 부탁드립니다. 사용해보시고 궁금한 점이나 개선 의견이 있으시면 편히 말씀주세요. 감사합니다. https://python.langchain.com/docs/integrations/chat/naver/ Edited August 7, 2025 by CLOVA Studio 운영자9 링크 복사 다른 사이트에 공유하기 More sharing options...
Recommended Posts
게시글 및 댓글을 작성하려면 로그인 해주세요.
로그인