챗GPT MS Azure 톤 대회 기간 동안 활발한 커뮤니티 활동을 보여주신 10분을 선정하여, 마이크로소프트 후원의 IoT 기기를 드릴 예정입니다. 🌟 댓글, 좋아요, 조회수, 토론 및 출품작 참여, 챗GPT 러닝데이 참여 활동, 온라인 커뮤니티에서의 홍보 등이 기준이 됩니다. 본 플랫폼 상에서 확인할 수 있는 활동들에 대해서 아래 7분을 선정하였습니다.logMZmint전또봉드인Lora형진킴두부나머지 3분은 챗GPT러닝데이 유튜브 활동 2분과 외부 SNS를 통해 검색된 1분을 선정하여 드릴예정입니다(추적해서 따로 연락드릴 예정입니다). MS 애저톤 참여 및 커뮤니티 활동을 많이 해주셔서 더 풍성한 대회가 되었습니다. 감사합니다.
안녕하세요. 인공지능팩토리입니다. 이번 챗GPT MS애저톤 심사는 너무나 어려웠습니다. 짧은 기간인데도 독창적인 아이디어로 완성도 높은 출품작이 많고 바로 서비스화를 하는데도 손색이 없을만큼 퀄러티가 높았습니다. 한 분 한 분 모두 상을 드리고 싶지만 제한된 시상금으로 몇 개의 출품작을 선택할 수 없었다는 점 양해부탁드립니다.아래와 같이 챗GPT MS애저톤 수상 결과를 공지합니다.교육 분야 프롬프트 엔지니어링 : 우리 아이를 위한 과학동화 만들기(ksohn)교육 분야 API 기반 서비스 : 알트리드 영어 작문 교육 서비스(rikjeon94)업무 효율화 분야 프롬프트 엔지니어링 : 빠른 앱 개발을 위한 Agile ERD구축 3-Step Prompt(수연)업무 효율화 분야 API 기반 서비스 : ChatGPT API를 활용한 EMR의 FHIR 표준 자동변환(김이현)서비스 분야 프롬프트 엔지니어링 : OPM을 활용한 공급망 최적화 프롬프트(sms7950)서비스 분야 API 기반 서비스 : Story Factory : 당신의 글로, 세상에 하나뿐인 동화를 만들어보세요.(timdalxx)그리고 본 행사는 마이크로소프트 후원으로 진행되었기 때문에 애저를 잘 활용하시거나 공공선을 위한 AI에 관랸된 아래 두 건에 대해서 추가 선정을 하게 되었습니다.명함-연락처 변환기(Dayoung.K) (사유: MS 애저 활용도 높음)시민의 정책 제안을 독려하는 GPT 국회 발의법률안 해설 서비스(inseon) (사유: 공공이익 실현)위 항목별로(총8개작) 50만원(세전)의 상금이 지급될 예정입니다. 관련으로는 개별 연락을 드리겠습니다. 커뮤니티 시상은 5월 4일 18:00 이전에 다시 공지하겠습니다.
안녕하세요, 인공지능팩토리입니다.많은 분들이 프롬프트 및 서비스를 제출해 주셔서 진심으로 감사드립니다. 현재 모든 작품을 세심하게 검토하고 있으나, 이 과정에서 시간이 지체되고 있습니다. 이에 따라, 수상 공지 일정이 아래와 같이 변경되었음을 알려드립니다.(변경 전) 5월 2일 19:00(변경 후) 5월 4일 14:00수상 관련 내용은 변경된 일정에 따라 이메일로 전달드리며, 토론탭에 공지글을 다시 올릴 예정입니다. 이번 일정 변경에 대해 양해를 구하며, 여러분의 관심과 참여에 다시 한 번 감사드립니다.인공지능팩토리 드림
🛫팀 이름:skytin1004🛫팀장 아이디:sms7950@gmail.com목차1. Microsoft Azurethon 이란?2. 제출한 프롬프트3. 2023 ChatGPT MS Azurethon 동기4. 산업공학과 ChatGPT의 연결5. 2023 ChatGPT MS Azurethon 후기🛫Microsoft Azurethon 이란?Microsoft는 2021년부터 Azure 기반의 다양한 아이디어를 모으고자 매년 해커톤을 개최하고 있습니다.Microsoft Azurethon은 Microsoft Azure를 기반으로 한 다양한 서비스와 아이디어를 만드는 해커톤입니다.2021년부터 한가지 주제를 정해서 개최되었으며 2023년에는 ChatGPT를 주제로 대회가 개최되었습니다.2021년: 2021 Microsoft Azure 온라인 해커톤2022년: 2022 Azure Virtual Hackathon2023년: 2023 ChatGPT MS 애저톤ChatGPT 애저톤은 마이크로소프트에서 후원하고 AIfactory에서 주최 및 운영하는 대회이며ChatGPT 애저톤 에서는 ChatGPT 관련 프롬프트, 확장앱, API 기반 서비스를 만드는 해커톤을 진행합니다.AIfactory에는 ChatGPT 애저톤 뿐만 아니라 AI와 관련된 많은 공모전이 열리고 있습니다. 여기서 다양한 공모전을 준비해보시는 것도 좋을 것 같습니다.🛫제출한 프롬프트1.OPM모델을 활용한 공급망 최적화 프롬프트 2.동물사진 맞추기 프롬프트 3.숫자 비교하기 프롬프트 🛫 2023 ChatGPT MS Azurethon 동기저는 파이썬,자바 프로그래밍 그리고 데이터 엔지니어링 분야에 관심이 많은 산업경영공학과 학생입니다. 평소 자바 웹 개발에 대해 공부하면서 우연히 공모전 사이트를 보다가 평소에 관심이 있었던 ChatGPT를 주제로 하는 2023 ChatGPT MS 애저톤이 있어 참여하게 되었습니다.처음 대회를 준비했을 때는 ChatGPT에 대해서 아는게 많이 없었습니다.그렇지만 ChatGPT MS 애저톤에 참여함으로써 지금까지 배웠던 지식과 경험을 시험해보고, 복잡한 주제를 가지고 창의적이면서 통찰력 있는 답변을 얻는데 도전해보고자 지원했습니다.또한 ChatGPT를 통해 산업공학과 관련된 다양한 문제에 대해 창의적이고 통찰력 있는 답변을 얻을 수 있다는 것을 보여주고 싶었습니다.🛫산업공학과 ChatGPT의 연결산업공학은 복잡한 시스템, 프로세스, 조직을 최적화하는 데 관심을 갖는 분야입니다. 단순히 IT 분야에서만 생각하기 보다는 지금까지 배웠던 다양한 분야를 ChatGPT 프롬프트 분야에 접목시켜보고 싶었습니다. OPM모델을 활용한 공급망 최적화 프롬프트(링크) 도 이러한 생각에서 만들게 되었습니다. 프롬프트를 만들기 위해 산업공학의 JIT, 6시그마 이론을 다시 공부했습니다. 처음에는 생산량과 불량품 개수를 입력하면 ChatGPT가 정보를 바탕으로 6시그마 수준을 계산하고 수준값에 기반해서 공정의 생산 품질을 검사하는 프롬프트를 만들었습니다. 하지만 해당 프롬프트는 충분이 엑셀 함수 기능으로 구현할 수 있다는 생각이 들어서 6시그마와 관련된 산업공학 최적화 이론을 집중적으로 공부했습니다. 산업공학의 선형계획법 모델을 공부하던 중 OPM(Operations Planning Model)에 대해서 공부하게 되었습니다. 6시그마 수준값을 이용한 프롬프트는 매개변수가 적어서 엑셀로도 충분히 구현이 가능했지만 OPM은 상황에 따라 다른 매개변수가 사용되고 많은 변수를 필요로 하기 때문에 엑셀로 구현하기는 매우 버거웠습니다. 산업공학의 OPM을 활용한 공급망 최적화 프롬프트는 이러한 문제상황을 해결해보기 위해 만들었습니다. OPM을 활용한 공급망 최적화 프롬프트를 만들 때에는 많은 매개변수를 받아 단순히 최적화된 값을 분석하는 수준을 넘어서 계산하고 분석된 값들을 토대로 4가지 주제에 맞는 보고서를 작성하도록 계획했습니다.🛫 2023 ChatGPT MS Azurethon 후기ChatGPT MS 애저톤에는 다양한 프로그램이 준비되어 있습니다. 단순히 ChatGPT와 관련된 서비스, 프롬프트를 제출하는 것 뿐만 아니라 Microsoft의 다양한 연사님들이 유튜브 실시간 강의로 ChatGPT와 관련된 최신 기술 강의를 해주는 ChatGPT MS 애저톤 러닝데이가 있습니다. 러닝데이에 참여하면서 Microsoft Azure를 ChatGPT에 연결시키는 방법과 LLM기술을 프로그램에 적용시키는 방법을 배울 수 있었습니다. 기존의 구글링이나 책으로는 쉽게 접할 수 없는 내용들을 유튜브 강의를 통해 배울 수 있어서 LLM 관련 기술을 학습하는데 많은 도움이 되었습니다.ChatGPT MS 애저톤을 준비하면서 다양한 분야의 프롬프트를 많이 만들어보았습니다. 처음에는 프롬프트 작성을 모호하게 하여 ChatGPT가 맥락과 동떨어진 답변도 많이 했지만 이런 양식들을 구체화 하고 ChatGPT가 일관성 있는 답변을 할 수 있도록 조건을 수정해보면서 ChatGPT에게 원하는 답변을 얻을 수 있는 프롬프트를 작성하는 능력을 기를 수 있었습니다.또한 ChatGPT를 적용시킬 수 있는 다양한 분야에 대해 고민을 해보면서 복잡한 문제를 해결하기 위해 지식과 기술을 적용할 수 있는 능력을 기를 수 있었으며 산업 공학 분야에서 AI 기술의 잠재적 응용 가능성을 탐구해보고 산업 시스템 최적화를 위한 새로운 도구와 방법에 대해 많은 생각을 해볼 수 있었습니다. ※같은 내용으로 개인블로그에 작성했습니다.개인블로그 링크 🛫
서비스 소개Crush: Your personal clothes manager and fashion helper CRUSH는 AI 코디네이터와 패션 커뮤니티 기능을 동시에 제공함으로써 AI 기반 패션 플랫폼으로 동작한다.CRUSH를 통해 사용자들이 옷장을 효율적으로 관리하고, 다양한 조건에 맞는 패션 추천을 받을 수 있다. 이를 통해 사용자는 옷장 정리의 번거로움을 덜고, 개성 있는 스타일을 찾아가는 데 도움을 받을 수 있다. 기능소개 주요 기능 나만의 옷장 관리사용자는 옷장의 옷들을 사진으로 찍어 등록하고, 옷의 종류, 색상, 두께, 설명 등을 기록할 수 있다. 이렇게 저장된 데이터는 사용자의 옷장을 손쉽게 관리할 수 있도록 도와준다. AI 옷 추천사용자는 날씨, 위치, 기분 등의 조건을 설정하여 개인화된 옷 추천을 받을 수 있다. Crush는 사용자의 옷 데이터와 추천 요청 정보를 바탕으로 적절한 조합을 제안해 준다. 내 코디 등록 사용자는 자신의 패션 스타일을 보여주는 사진을 업로드할 수 있다. 이 기능은 "나의 옷장"과는 별개로, 개인의 패션 감각을 다른 사용자와 공유하는 데 초점을 맞추고 있다. 유저가 앱을 처음 실행하면 구글 계정을 통해 로그인한다. 구글 계정을 통해 인증된 유저는 자신의 id, 닉네임(name), 성별(sex), 나이(age)를 파이어베이스에서 불러온다. Crush의 기능은 크게 5가지로, 나의 옷장, 코디 등록, 나의 코디, 마이페이지가 있다. 첫 번째로 나의 옷장에서는 지금까지 유저가 등록한 옷의 목록을 볼 수 있다. 옷 등록 버튼을 통해 유저가 소지한 옷의 정보를 텍스트로 입력하고 플러터 내부의 로컬 저장소에 저장한다. 옷의 정보로는 이름(name), 색상(color), 종류(type), 두께(thickness)를 입력받는다. 이렇게 로컬 저장소에 저장한 옷들을 나의 옷장에서 텍스트 형식으로 출력한다. 또한, 옷 추천 버튼을 통해 지금까지 로컬에서 저장한 옷 데이터를 JSON 방식으로 NAS에 전송하고, 날씨, 계절, 스타일 등 여러 가지 옵션을 추가해서 종합한 정보들을 토대로 NAS 내부에서 도커 컨테이너에서 작동하는 스프링이 GPT-3.5-turbo를 이용해 옷 추천 정보를 생성해 전송한다. 그 후 전송받은 정보를 유저에게 출력해 준다. 두 번째로 코디 등록은 유저의 코디 사진을 로컬에 저장하는 기능이다. 하단 내비게이션 바 중앙의 버튼을 클릭하면 로컬 기기의 갤러리로 화면이 넘어가고, 갤러리에서 사진을 고르고 등록한다. 이렇게 등록한 사진은 파이어스토어 저장소에 저장된다. 세 번째로 나의 코디는 지금까지 유저가 올린 코디를 확인할 수 있는 페이지이다. 코디 등록에서 저장된 코디를 파이어스토어 저장소에서 불러와서 출력한다. 마지막으로 마이페이지에서는 유저의 닉네임, 성별, 나이 등을 변경하거나 로그아웃, 회원 탈퇴 기능이 들어갈 예정이다. UI / UX 디자인 앱을 실행하면 로그인 화면이 바로 나타난다. 화면 하단에는 구글 계정으로 간편하게 로그인할 수 있는 버튼이 위치하고 있다. 유저는 이 버튼을 탭하여 구글 계정으로 로그인할 수 있다. 이렇게 구글 계정을 이용한 간편 로그인 기능은 유저의 편의성과 사용성을 높이는 중요한 요소이다. 나의 옷장 페이지에서는 유저가 등록한 옷의 정보를 한눈에 확인할 수 있다. 페이지 상단에 위치한 바를 통해 상의, 하의, 기타로 등록된 옷을 각각의 카테고리로 구분해 볼 수 있다. 페이지 우측 하단의 옷 추천 버튼을 통해 소지하고 있는 옷을 바탕으로 코디를 추천해주는 옷 추천 페이지로 이동할 수 있다. 각 옷의 정보는 옷의 썸네일 사진과 함께 나열되어 있으며, 클릭하면 상세 정보를 확인할 수 있다. 상세 정보 페이지에서는 해당 옷의 이름, 종류, 색상, 두께와 같은 세부 정보를 확인할 수 있다. 우측 하단의 삭제 버튼을 통해 등록한 옷을 삭제하는 기능도 지원한다. 이를 통해 유저는 등록한 옷들을 효율적으로 관리하고, 필요한 정보를 빠르게 찾아볼 수 있다. 옷 추천 페이지는 유저의 옷장에서 등록된 옷과 선택한 옵션을 기반으로 코디를 추천해주는 기능을 하는 페이지이다. 페이지 상단에는 오늘의 날씨, 활동 장소, 스타일 등을 선택할 수 있는 옵션 바가 있으며, 선택한 옵션들이 화면에 표시된다. 페이지 하단의 옷 추천 버튼을 클릭하면 선택한 옵션과 등록된 옷 정보를 종합하여 코디 추천 API에게 전송하고, API가 반환한 정보를 출력한다. 추천 정보는 각 옷의 썸네일 사진과 종류, 색을 포함한 추천 옷 조합으로 표시되며, 해당 코디의 추천 정보도 함께 텍스트로 출력된다. 유저는 옆으로 스와이프하여 다른 추천 정보를 확인할 수 있다. 추천 정보를 통해 유저는 새로운 코디 아이디어를 얻을 수 있고, 자신의 옷장에서 등록된 옷을 더욱 효과적으로 활용할 수 있다. https://documenter.getpostman.com/view/26567111/2s93Y5Qfcz상기 link로 들어가면 코디 추천 API 문서를 확인할 수 있다. API 내의 프롬프트를 공개하자면 이러하다. chatgpt-3.5-turbo 기반이다."You are a competent fashion stylist. Look at a given set of clothes and their conditions and recommend suitable combinations in Korean. It must be appropriate for the given options." + "Follow the output form unconditionally: [[cloth1,cloth2,describe Why we recommend it],[ cloth1, cloth2, describe Why we recommend it], ...]. Up to 3 combinations." + clothes_information 이외에도 추가적으로 구현하고자 하는 기능이 많다. 하지만 구현 시간이 부족하여 현재 진행된 만큼만 공유한다.flutter 로 구현했고 apk 파일로 공유하려했으나 20mb를 넘어 첨부하진 않겠다.추후 http://52.78.216.153/crush 에 공유하도록 하겠다.
팀소개 청소년 교육 문제해결을 위해나선 ‘핵 더 프라블럼’ 팀입니다. 서비스 이름은 Bluck 입니다. - 메이커 멤버 : gyulinsight, 큐리어스탠져린, zzangyea, 목이긴기린, 구름뿅, 배장한, iryne - 학생 멤버 : 양효주(고1), 권도한(고1), 강병진(고2) 1. 서비스 개요 - 배경/ 소개 / 기대효과 2. 서비스 구조 3. 서비스 소개 주기능은 세가지입니다. 1. 자유형 상담을 통한 진로 적성 결과물 제공 2. 미래의 직업 일기를 통한 웹툰과 일기 시나리오를 통한 흥미로운 직업 간접 경험 3. 피드백을 통한 자신에 대한 이해를 확장 4. 서비스 내용실제 작동 링크https://azure-hack-git-main-kyulee0103.vercel.app/ 시연 영상 https://shrouded-name-6d4.notion.site/347536f2f323434c9efbdfae9b716817 깃헙주소 https://github.com/kyulee0103/azureHack
프롬프트 소개안녕하세요! 깃허브 README 작성 프롬프트 를 소개해드립니다.이 서비스는 깃허브 사용자들이 프로젝트를 소개하는 README 파일 작성에 도움을 줍니다. README 파일은 프로젝트를 소개하는 가장 중요한 문서 중 하나이며, 프로젝트를 사용하는 사람들에게 중요한 정보를 제공합니다. 그러나 README 파일을 작성하는 것은 어려울 수 있습니다. 해당 프롬프트를 사용하여 쉽게 README 를 작성하여 깃허브를 관리 하는시간을 줄일 수 있습니다. 1.역할 부여 및 입력 양식 지정2. 규칙 지정3. 문제 입력4. 결과 도출 프롬프트 보기: https://shareg.pt/xz3hF22
대한민국 국회는 지방자치단체, 경찰, 법원 등을 포함한 국가기관 중 압도적으로 낮은 신뢰도를 기록했다. 답변자의 81%가 국회를 신뢰하지 않는다고 답변하였다. (전국지표조사, 엠브레인퍼블릭·케이스탯리서치·코리아리서치·한국리서치)안녕하세요! 메페토팀입니다. 😆저희 팀은 ChatGPT API를 활용하여, 국회의 발의 법률안에 대한 가독성, 정보 접근성을 높이는 웹 서비스를 제안하고 있습니다.😠 국회의원 월급을 줄여야 해5명 중 4명은, 국회 신뢰하지 않아매년 어떤 사회 문제가 대두되면, 이를 해결하지 못하는 국회의원에 대한 불만도 함께 합니다. 이를 반증하듯, 전체 국가 기관 중 국회에 대한 신뢰도는 최하위입니다.🙋 심의 민주주의, 전자 민주주의란?정치 신뢰도 지표에서 최상위권을 기록하는 북유럽 국가들 중, 핀란드의 경우 시민발의제를 시행하거나, 의회의 의사 결정과정에 시민들이 참여하는 등 국회와 시민이 긴밀하게 연결된 경우가 많습니다. 하지만, 우리나라의 경우에 시민의 의견 제안 창구는 마련되어 있지만, 건수는 전자 청원 서비스가 시행된 2022년 이후 누적 5,605건으로 10,000명 중 1명에도 미치지 못하는 수치입니다.😮 이 서비스가 한국에 꼭 필요한 이유시민의 정책 제안 플로우문제 인식 → 관련 정책 내용 인식 → 정책 제안 → 제안 결과 확인 → 문제 인식한 사람이 정책을 제안하기까지의 과정을 적어보면, 위와 같은데요. 두 번째 단계인 관련 정책 내용 인식에서부터 큰 어려움이 있다는 것을 알게 되었습니다.조세특례제한법 일부개정법률안(조해진의원 등 10인), 국회 의안정보시스템법률안 특성상, 명료하게 쓰다보니 가독성이 좋지는 않습니다. 당장 대학생인 저희 팀원들 조차 법률안을 보고 어떤 맥락에서 제안된 법률안인지 파악하기 어렵습니다.💫 ChatGPT로 국회의사당에 당당하게 입장하기대형 언어 모델(LLM)인 ChatGPT를 사용하여 정책 제안을 위한 컨텍스트 이해를 돕는다면, 기존 정책 제안 과정에서 병목으로 작용했던 관련 정책 내용 인식을 해소할 수 있습니다.보여드릴 웹 서비스는 다음과 같습니다.1. 발의 법률안 검색 & 필터 기능사용자는 필터 & 검색 기능을 통해 발의자, 발의안명, 소관위원회를 기준으로 발의안을 검색할 수 있습니다.소관위원회란? 국회에서 법안을 상세하게 검토하기 위해 설치되는 작은 단위의 위원회입니다.2. ChatGPT를 통한 법률안 요약 & 설명ChatGPT를 통해 기존 법률 발의안 정보를 재구조화 & 부가설명하여 사용자가 이에 대한 이해를 더 쉽게 할 수 있도록 돕습니다.AI 제공 단어사전ChatGPT가 원문 내용에서 가장 어려운 단어 5개를 선택하고, 이에 대한 설명을 작성합니다.AI 분석 & 요약법률안이 제안된 문제 상황과, 법률안을 통한 문제 해결 방법으로 발의법률안의 세부 내용을 재구조화하여 보여줍니다.🧐 GPT 서비스 활용에 관한 자세한 설명전체적인 GPT 서비스를 활용하여 분석한 발의안 데이터를 데이터베이스에 저장하는 과정은 다음과 같습니다열린 국회 정보에서는 국회의원 발의 법률안에 대한 Open API를 제공합니다. 해당 API의 구조는 다음과 같습니다. 여기서 저희는 “row” 부분을 활용했습니다.<code class="language-plaintext">{ "nzmimeepazxkubdpn":[ { "head":[ { "list_total_count": 19048 }, { "RESULT":{ "CODE":"INFO-000", "MESSAGE":"정상 처리되었습니다." }, } ] }, { "row":[ { "BILL_ID":"PRC_P2O3N0C3B2Z7Y1Z4H3G9E3D1G4H3G7", "BILL_NO":"2121190", "BILL_NAME":"관광진흥법 일부개정법률안", "COMMITTEE":None, "PROPOSE_DT":"2023-04-06", "PROC_RESULT":None, "AGE":"21", "DETAIL_LINK":"<http://likms.assembly.go.kr/bill/billDetail.do?billId=PRC_P2O3N0C3B2Z7Y1Z4H3G9E3D1G4H3G7&ageFrom=21&ageTo=21>", "PROPOSER":"이개호의원 등 10인", "MEMBER_LIST":"<http://likms.assembly.go.kr/bill/coactorListPopup.do?billId=PRC_P2O3N0C3B2Z7Y1Z4H3G9E3D1G4H3G7>", "RST_PROPOSER":"이개호", "PUBL_PROPOSER":"김남국,박광온,서삼석,신정훈,양경숙,어기구,이병훈,조오섭,허영", "COMMITTEE_ID":None }, ... } ] } </code>위 구조에서는 해당 발의안에 대한 자세한 내용을 제시하지 않고 세부 링크만을 제공합니다. 저희는 해당 링크를 스크랩핑하여 제안 이유 및 주요 내용에 대한 정보를 가져옵니다. 코드는 아래와 같습니다.<code class="language-python"># detail link 통해서 컨텐츠 가져오기 def scrape_content(url: string): # HTML 가져오기 res = requests.get(url) html = res.content # soup의 객체 생성 soup = BeautifulSoup(html, 'html.parser') if soup is None: return None # '제안이유 및 주요내용' 부분을 포함하는 div 태그 선택 tag = soup.select_one('div[id="summaryContentDiv"]') # div 태그 내의 텍스트 출력 return tag.text.strip() </code>이렇게 가져온 정보를 gpt-3.5-turbo 모델을 이용하여 다음과 같이 프롬포트 입력해서 정보를 JSON 형태로 제공받습니다.<code class="language-plaintext">너는 어려운 내용을 쉽게 해설하는 선생님 역할을 해줘. 한국어로 제공된 국회의원 발의법률안의 제안 이유와 주요 내용을 바탕으로 문제 상황, 문제 해결 방안, 그리고 정책이나 법률 관련 어려운 단어 5개를 선별하여 JSON 형태로 응답해야돼. 미사여구는 붙이지마. JSON 구조는 다음과 같아: {"problem": 문제 상황, "solution": 문제 해결 제시 방안, "words":[{"name": 단어 명, "description": 단어 설명}]} 이제 발의법률안의 내용을 제공할 것이야. </code><code class="language-python">def get_ai_analyzed(detail: string): model = "gpt-3.5-turbo" messages = [ {"role": "system", "content": 위의 작성된 프롬포트}, {"role": "user", "content": detail} ] response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0.5, max_tokens=800, ) return response.choices[0].message.content </code>이렇게 분석된 정보는 아래와 같은 정보를 담고 있습니다. (아래는 테스트 데이터입니다!)<code class="language-plaintext">{ "problem": "노동위원회의 심판 기능을 전문적으로 다루는 지방노동법원으로 이관하기 위해 법률 개정이 필요하다.", "solution": "차별적 처우의 시정신청에 대한 노동위원회의 시정명령 기능을 지방노동법원으로 이관하고, 관련 조사, 심문, 조정, 중재 규정, 시정명령 및 과태료 규정을 삭제한다.", "words": [ {"name": "지방노동법원", "description": "노동사건을 전문적으로 다루는 법원으로, 지방 법원 내에 설치된다."}, {"name": "노동위원회", "description": "노동 분야의 분쟁 조정 및 노동정책에 관한 자문 역할을 하는 기관이다."}, {"name": "차별적 처우", "description": "근로자에게 부당한 차별을 가하는 행위를 말한다."}, {"name": "시정신청", "description": "부당한 처우를 받은 근로자가 그 처우를 바로잡기 위해 관련 기관에 요청하는 절차이다."}, {"name": "시정명령", "description": "부당한 처우를 시정하도록 명령하는 권한을 가진 기관의 결정이다."} ] } </code>위의 분석된 정보와 스크랩핑한 정보를 기존의 API 응답과 결합하여 해당 데이터를 Mongo DB Atlas 에 저장하고 웹페이지에 이를 제공합니다. 전체 코드는 여기를 참고해주세요.⚡ 기대 효과다양한 전문 용어로 인해 이해하기 어려운 법률안들을 쉽게 해석하여, 국민들의 정치적 참여 효율성을 향상시키는 서비스를 제공합니다.직관적인 사용자 인터페이스와 빠른 검색 기능을 통해, 관심 분야의 입법안을 손쉽게 찾아볼 수 있습니다.인공지능이 지원하는 단어 사전을 활용하여, 정치 관련 용어의 정의를 학습하고 정치에 대한 기본 지식을 향상시킬 수 있습니다.메니페스토 프로젝트는 누구나 쉽게 이해하고 학습할 수 있는 정치 지식을 제공하고, 더 큰 참여를 도모하여 국민 모두가 진정한 주인공이 되는 정치를 만들어갑니다. 👊📬 Contact팀명: 메페토팀장: 황인선 (inseon_ug@gm.gist.ac.kr)팀원: 서동호 (ehcws333@gm.gist.ac.kr)팀원: 박현 (andrew6303@gm.gist.ac.kr)팀원: 우성윤 (woosy2207@gm.gist.ac.kr)코드 : mefeto Github Repository
서비스 개요 📍 OOTD 스타일링 큐레이션으로서 ChatGPT를 활용한 고객 취향 및 상황에 따른 맞춤 오늘의 스타일링 이미지 제공해주는 웹 어플리케이션 📍 Tech를 기반으로 쇼핑 여정에 ‘Curation’을 더한 새로운 비즈니스 모델 제시 서비스 목적📍 평소에 옷에 관심이 없는 모모남/여 (뭐(모) 입을지 모르는 남자/ 여자)들에게 보다 나은 스타일링 제공 서비스 소개📍 이 서비스의 UI는 Typescript React를 사용해 웹 기반 앱으로 만들었습니다.📍 DB를 사용하지 않고 JSON 파일 형식으로 유저 정보를 저장했습니다. 📍 Express.js를 사용하여 클라이언트와 API 콜을 주고 받았습니다.📍 React 내부에서 ChatGPT와 Google Search Engine API를 사용하여 패션 스타일링 정보를 알아내고 그에 맞는 이미지를 불러옵니다. 🔗 https://github.com/PaulHan0527/Azureton 실행방법STEP 1. 코드 실행 후 첫 화면 페이지에서 회원가입 버튼을 눌러 아이디, 비밀번호, 나이, 몸무게, 키, 그리고 성별을 입력하여 회원가입을 진행합니다. STEP 2. 해당 아이디와 비밀번호를 입력하여 로그인을 합니다. STEP 3. OpenAI로 들어가서 OpenAI API key를 받아 입력합니다 (참고 1.) STEP 4. 챗봇이 스타일링 전문가로서 몇가지 질문이 순차적으로 진행됩니다. 사용자가 해당 질문에 대한 답변을 해주시면 됩니다. STEP 5. 최종적으로 모든 사용자의 정보를 이용하여 고객 맞춤형 스타일링 추천이 완료되면 ‘결과 보기’ 버튼을 이용하여 결과를 확인할 수 있습니다.아쉬운 점 및 개선 방법문제1. 현재 결과 사진이 안나올 수 있음 📍 챗GPT 튜닝 - 패션 잡지를 챗GPT가 학습하여 구체적인 패션 트렌드를 학습📍 인스타그램이나 카카오톡 등의 추가적인 API를 사용하여 조금 더 정확한 이미지를 불러오게 함문제2. 보안 문제📍 비밀번호 검증📍 유저에 대한 정보를 JSON 대신 DB를 저장함 참고1. OpenAI API key가 공개적으로 노출이 되면 금방 사라지기 때문에 세션마다 사용할 수 있는 key를 넣도록 기획했습니다.2. Azureton/front-end/src/pages/Home.tsx 파일 라인9-10에 SEARCH_ENGINE_ID 와 GSE_API_KEY 값을 넣어주어야 한다.3. Github 링크 README.md 파일에 실행방법을 작성했습니다. 팀 구성원이성범, 한주영, 이예나yenalee0513@gmail.com
소설가를 위한 인물간 대화 생성기(GIF 대신 영상을 첨부합니다.) 개요소설 작성 도우미는 소설 작가들을 위한 웹 애플리케이션입니다. 이 앱은 작가들이 소설 내 등장인물간의 대화를 자동으로 생성할 수 있도록 OpenAI의 GPT-3.5 API를 활용하여 제공합니다. 사용자는 등장인물 정보, 소설 개요, 소설 길이 등을 입력하면, 앱이 이 정보를 기반으로 인물 간의 대화를 생성해줍니다. 서비스 특징다양한 캐릭터 정보를 입력할 수 있습니다 (이름, 성격, 배경 정보).OpenAI GPT-3.5 API를 활용하여 캐릭터 간의 대화를 자동으로 생성합니다.사용자 정의 가능한 프롬프트 템플릿을 사용하여 GPT-3.5 API에 적합한 입력을 보장합니다. 차별점소설 작가를 위한 특화된 기능 제공: 캐릭터 간 대화 생성에 집중하여 작가들의 창작 과정을 돕습니다.다양한 캐릭터 설정 가능: 여러 캐릭터의 성격과 배경 정보를 동적으로 추가하여 다양한 시나리오 생성이 가능합니다.직관적인 사용자 인터페이스: 사용자가 쉽게 입력할 수 있는 폼과 결과를 바로 확인할 수 있는 구조로 되어 있어 편리합니다. 추후 활용 가능성Chat completion API를 활용해 추후 연속적인 대화 생성, 맥락이 보충된 대화 생성 등이 가능해집니다.소설 작가뿐만 아니라 영화나 드라마 시나리오 작성자들도 대화 생성을 통해 창작 과정을 돕는 데 활용할 수 있습니다.사용자가 원하는 기능을 추가하여 커스텀 프롬프트를 만들어 다양한 도메인에 적용할 수 있습니다.온라인 워크샵이나 교육용 자료로 활용하여 창작자들의 스토리텔링 능력을 향상시킬 수 있습니다.게임 NPC 대화 생성 도구로서도 확장 가능합니다. 소스코드Github repo: https://github.com/SantonyChoi/novel-writing-helper 팀 정보팀 이름: 버핀치팀장이자 팀원: 산토니(santony.choi@gmail.com)
서비스 소개 서비스 플로우사용자가 리뷰 요약을 원하는 상품의 링크를 input하면 리뷰 결과물을 output 해주는 플로우를 기획하였으나, 단기간에 기술적인 문제를 해결하지 못하여 DB내에 있는 정보만 Web에서 보여주는 방식으로 mvp를 제작하였습니다.다만 이 방식은 사용자가 구매하기 원하는 상품의 리뷰를 보지 못하는 문제점이 있어 추후에는 구글 익스텐션을 이용하여 사용자가 구매하려는 상품의 리뷰 요약 컨텐츠를 제공할 수 있는 제품으로 디벨롭 할 예정입니다. 서비스 링크https://review-summary-6b0d6.web.app/home 팀 정보팀 이름 : RevuGenius팀장 : 유병현 qudvkfzoqtyd1@gmail.com ChatGpt 프롬프트<code class="language-plaintext">1. 리뷰 데이터 넣기 전 프롬포트 Act as an expert in analyzing review data. I will provide the review data in table format. I will give you a total of 20 review data. But it might be too long, so I'll give it to you several times. After I give you all the review data, I'll ask you for something else. Please answer in Korean. 2. 데이터를 집어 넣기 위한 프롬포트 Below is the review data. You must saving it. Just save it for now. When I give you all the data then I'll deliver the request. Please answer in korean ------- Id review_text 3. 최종 데이터 추출 프롬포트 Please answer according to the Rules and use the data I gave you. --------- Rules - Format : "Table" - Column : "Key elements, Description" - Line: "Product Name, Review Keywords to Help You Make Purchase Judgment (Only 3 keywords), Review Summary (3 lines), Positive Review Summary, Disappointing point Review Summary, Final Review Analysis" - "Product Name" is "제품명" - Analyze only the saving data I gave you. Never add anything that is not in the data. - Exclude information related to delivery and packaging. - Analyze these from the data I gave you "Review Summary, Positive Review Summary, Disappointing point Review Summary, and Final Review Analysis." - Since this table was made to increase purchasing judgment when people purchase "Product Name", I would like you to make a table by selecting data that can increase purchasing judgment. please answer in korean</code>
• 서비스 배경 GPT를 통해 애자일한 개발환경에서 보다 빠르게 핵심적인 DB 설계하고 MVP 개발을 진행할 수 있는 업무효율화 프롬프트 시리즈 구성 데이터 초기 설계에 따라서 앱의 완성도와 개발 방향이 바뀌기 마련입니다. 그러나 아무리 좋은 앱 아이디어도 초기 데이터 설계에서 완벽하기 어렵고 Coding 과정에서 Test 과정에서 진행하면서 누락이 발견되면 결국 전체 개발을 몇 번을 뒤집어 엎어야 하는 비효율적인 과정이 반복됩니다. 이러한 비효율을 제거하고 기본적인 기능 구현에 필요한 모든 데이터를 빠르게 정리하고, 논리 구조를 시각화하고, 빠르게 앱을 시장 출시하기 위한 애자일한 앱 개발환경에 딱 맞는 GPT를 이용해봅시다. • 서비스 기대효과 서비스 구상 후 DB 초기 스케치 후 최종적으로 다이어그램화 하는 한 사이클의 프롬프트 개발로, 개발 관련 구조화 또는 협업 시에 문서 작성에 제약 받지 않고 빠른 개발 투입과 서비스 개선이 가능할 것으로 기대할 수 있습니다. • 프롬프트 엔지니어링 * Tip 간혹 출력되다가 일부 내용이 짤리는 경우가 있는데 (보통 6개 항목), 이 경우는 second를 넣어 전체 테이블을 다시 호출하거나 누락된 테이블을 지정한다. (잘리는 경우의 출력 프롬프트 예시)[테이블이 일부 잘리는 경우] : ERD 다이어그램 마크다운 중 가장 시각적으로 뛰어난 머메이드 마크다운으로 다이어그램 코딩 결과 → 그래프 표현시 일부 제약사항은 여전히 있지만 전체적인 데이터 초기 설계의 공수는 최소화하고 바로 검증부터 할 수 있다는 점에서 효율적이고 유의미한 작업이다. ※ 비주얼화하는 경우 제약사항 : 1) 필요에 따라서 GPT가 임의로 불필요한 컬럼을 제거하는 경우가 있으니 이 부분은 최종 검토 후 확정하는 것을 권장 2) 1차적인 markdown code는 data type과 컬럼명을 반대로 노출하는 경우가 있어 이 부분은 확인 후 조정하면 됨 (아래 2차코드 참고) (최종 다이어그램 확인 링크) : Mermaidv10.1.0 Live Editor (https://mermaid.live/)1차 : ERD Markdown Code 결과 (초안 - 데이터 타입이 먼저 나와 변경필요)<code class="language-plaintext"> erDiagram Organization { int organization_id varchar(50) organization_name } Personnel { int personnel_id int organization_id varchar(50) personnel_name } Profile { int profile_id int personnel_id varchar(50) question varchar(50) answer datetime created_at datetime updated_at } Role { int role_id int personnel_id varchar(50) role_name } AbsenteeismHistory { int absenteeism_history_id int personnel_id datetime date varchar(50) reason } WorkEvaluation { int work_evaluation_id int personnel_id datetime date varchar(50) content varchar(50) result } Payroll { int payroll_id int personnel_id decimal salary datetime payment_date } QABulletinBoard { int qa_bulletin_board_id int personnel_id varchar(50) question varchar(50) answer datetime created_at datetime updated_at } Organization ||--o{ Personnel : has Personnel ||--o{ Profile : has Personnel ||--o{ Role : has Personnel }o--|| AbsenteeismHistory : has Personnel }o--|| WorkEvaluation : has Personnel ||--|| Payroll : has Personnel }o--|| QABulletinBoard : has </code> (1차 코드 결과) 2차(Final) ERD Markdown Code 결과 : 데이터 타입이 먼저 코딩된 제약사항을 극복하기 위한 2차 코드 출력결과 따라 다이어그램 마크다운 코드 조정작업이 필요한데, 이 경우 아래 코드를 활용한다. <code class="language-plaintext">erDiagram Organization { org_id int org_name varchar org_address varchar created_at datetime updated_at datetime } Personnel { personnel_id int org_id int personnel_name varchar personnel_email varchar personnel_phone varchar personnel_address varchar personnel_dob date created_at datetime updated_at datetime } Profile { profile_id int personnel_id int profile_description varchar profile_start_date date profile_end_date date created_at datetime updated_at datetime } Role { role_id int personnel_id int role_name varchar role_description varchar created_at datetime updated_at datetime } Absenteeism { absenteeism_id int personnel_id int absenteeism_date date absenteeism_status varchar created_at datetime updated_at datetime } Evaluation { evaluation_id int personnel_id int evaluation_quarter varchar evaluation_score float created_at datetime updated_at datetime } Payroll { payroll_id int personnel_id int payroll_amount float payroll_date date created_at datetime updated_at datetime } QandA { qanda_id int personnel_id int qanda_question varchar qanda_answer varchar related_qanda_id int created_at datetime updated_at datetime } Organization ||--o{ Personnel : "has" Personnel ||--o{ Profile : "has" Personnel ||--o{ Role : "has" Personnel ||--o{ Absenteeism : "has" Personnel ||--o{ Evaluation : "has" Personnel ||--o{ Payroll : "has" Personnel ||--o{ QandA : "has" </code> Conclusion : Final ERD Diagram Visual (2차 - 최종) (작성 내용과 관련해 사전 협의된 AIFactory 외 제3자의 임의 배포와 상업적 활용을 금합니다.)
[서비스] J-mark 복잡한 북마크를 GPT로 쉽게 관리하세요배경저희가 개발한 URL 북마크 서비스는 무수히 많은 웹사이트를 탐색하는 인터넷 사용자들에게 필요한 정보를 빠르고 쉽게 찾을 수 있도록 돕기 위해 만들어졌습니다. 많은 사람들은 웹사이트에서 필요한 정보를 찾고 구별하는 작업은 해냈지만, 이 정보들을 저장하고 관리하는 것은 여전히 어려움을 겪고 있습니다.이 서비스는 각 페이지의 키워드를 추출하여, 해당 키워드 기반으로 내가 저장한 북마크를 쉽게 찾을 수 있도록 도와줍니다. 이를 통해 사용자는 저장한 내용을 기억하지 않아도, 추천된 페이지와 비슷한 내용을 찾아 새로운 정보를 쉽게 탐색할 수 있습니다.또한, 이 서비스는 저장한 내용의 연결된 내용을 찾는 것을 돕기 위해 사용자가 입력한 키워드와 관련된 다른 페이지도 추천해줍니다. 이를 통해 사용자는 저장한 내용과 연결된 다른 정보를 쉽게 찾아볼 수 있습니다.URL 북마크 서비스는 새로운 정보를 쉽게 찾을 수 있도록 돕습니다. 이 서비스를 통해 인터넷 사용자들은 더욱 효율적으로 정보를 탐색하고, 관리할 수 있게 됩니다. 목적저희의 목적은 사용자가 열심히 찾아낸 정보를 다시 잘 찾을 수 있도록 돕는 것입니다.사용자의 관리어려움을 대신해서 키워드를 찾아 저장해주고 사용자가 보고 있는 페이지에 연관된 북마크를 제공해서 전달해줍니다.사용자 지식 습득과 관리의 편의를 중시합니다. 크롬 확장프로그램으로 사용자들에게 손쉬운 북마크 저장기능을 제공합니다. 문제점 유저 문제 시나리오비슷한 정보를 지속해서 학습정보를 확인했는데, 연관있는 북마크 검색이 안됨이전에 중요하다고 생각한 내용과 연결이 안됨 - 새로운 지식을 계속 학습사이트(뉴스, 커뮤니티글, 쇼핑)에서 즐겨찾기 저장정보를 저장할때 이 내용을 제대로 분류해서 저장하지 못함분류를 단순하게 설정하기 어려움 - 폴더단위 저장이 불편함URL들을 분류하기 귀찮음잘못된 분류는 나중에 저장한 이유를 까먹음이후 즐겨찾기 목록에서 다시 열기무엇을 저장했는지 모름분류를 찾아가기 어려움폴더단위 구조의 계층구조는 검색을 어렵게 만듬문제 해결을 위해 제공하는 기능분류한가지 기준이 아닌 여러 기준으로 분류 제공ChatGPT를 이용한 북마크를 키워드를 선별한다.여러 키워드를 추출해서 그걸 북마크의 태그값으로 저장검색여러 키워드를 기반해서 즐겨찾기를 검색할 수 있음질문 혹은 키워드를 이용해, GPT가 연관된 키워드를 호출 이와 연결된 북마크 제공예시기존에 등록된 즐겨찾기의 키워드 - React, UseHook, UseEffect검색 : ‘UseHook’즐겨찾기 목록에서 연관된 키워드를 제공내가 보고 있는 사이트 내용과 연결된 즐겨찾기를 제공ChatGPT를 이용한 현재 사이트의 키워드를 추출추출된 키워드를 통해서 북마크 정보 제공시연북마크 저장 키워드로 검색 페이지로 검색 작동 구조코드<code class="language-python"> import os import openai openai.api_type = "azure" openai.api_base = "api_base" openai.api_version = "2023-03-15-preview" openai.api_key = "api_key" engine="engine" # make this function and export allpi def get_keywords(text): messages = [ { "role": "system", "content": """You are an AI assistant that helps to extract keywords from my website. i will give you only context. then you should summarize it and from summary, give me an answer as korean like [keyword1, keyword2, ...] and the max number of keywords is 10. so your answer format must be json style like {'summary' : summary, 'keywords': [keyword1,keyword2, ...]}""" }, { "role": "user", "content": "this is my news. i have a lot of money from lottery. happy" }, { "role": "assistant", "content": "{'summary': 'my happy new is got a lottery', 'keywords' : ['돈', '복권', '행복']}" }, { "role": "user", "content" : f"{text}" } ] try: response = openai.ChatCompletion.create( engine=engine, # engine = "deployment_name". messages=messages, temperature=0.7, max_tokens=4000, n=1, stop=None, timeout=None, ) except Exception as e: print(e) result = response.choices[0]['message']['content'] return result</code>팀 정보팀 이름 : 지비츠팀원 : 정윤도 truenorthj@naver.com팀원 : 진수연 wlstndus99@gmail.com
📝 서비스 배경 강의를 들을 때 필기는 버릴 수가 없는 행위인데요… 혹시 필기하다가 강의 진행에 흐름을 놓친적은 없으실까요? 강의를 들으면서 요약/정리 하는 것은 학습에 있어서 매우 중요합니다! 하지만! 요약에 익숙하지 않다면..! 필기 속도가 느리다면..!필기를 하는 행위는 시간과 노력의 소모가 크고 이게 글인지 지렁이인지 나중에 알아보기 힘든 사태가 발생할 수도 있죠..😭 또한, 몸이 아프다거나, 어쩔 수 없는 일이 생겨서 강의을 듣는 데 차질이 생길 경우는 또 어떤가요?아휴, 이럴 때! 누군가 수업을 대신 요약해준다면 굉장히 편리할텐데..라고 생각해본적 없으신가요? 이런 순간을 위해서 고안된 필기를 도와주는 서비스 H-Ai Light를 소개하겠습니다 😁 📝서비스 목적 및 대상 H-Ai Light의 서비스 목적 및 대상은 다음과 같습니다. 목적: 강의/회의 등 장시간의 음성 내용을 텍스트로 변환하고 ChatGPT를 통한 요약 정리대상: 학생/직장인 강의 내용을 정리/요약해주는 서비스가 필요한 모든 이들 📝서비스 방식 H-Ai Light의 서비스 방식의 순서는 다음과 같습니다. STEP01. 수업/강의 회의를 녹음하여 음성 파일로 저장합니다.STEP02. Whisper API를 활용하여 녹음된 음성 파일을 텍스트로 변환하야 줍니다.STEP03. 변환된 텍스트를 ChatGPT API로 전송하여주며 이를 학습된 Form으로 요약 정리해줍니다. 📝기대효과1. 시간 절약시간은 금이라고들 하죠? 강의 내용을 요약하여 주니 시간이 절약됩니다.추가로, 강의 내용을 필기하느라 빼앗긴 시간을 수업에 집중까지 하니 일석이조군요! 2. 편리한 서비스추가적인 필기를 하지 않아도 자동으로 핵심 내용을 기록할 수 있어서 아주 편리합니다.더불어 요약 전 내용이 필요하다면..! 강의 원본 내용을 찾아볼 수도 있습니다. 3. 학습 복습의 플러스 효과요약된 내용을 통해 강의 내용을 더 잘 이해할 수 있고 복습에도 도움이 되니 효율적인 학습이 가능합니다. 4. 공유 가능한 서비스대세는 공유와 나눔이라고 하더라고요?요약된 내용을 다른 사람과 함께 지식 공유가 가능하며, 이를 통해 시너지 효과가 창출될 수 있습니다. 5. 확장 가능한 서비스강의 뿐만 아니라 회의록/재판기록 등 업무 중심 음성 내용 요약에도 확장하여 활용 가능합니다. 📝H-AILight Prototype 소스코드H-AILight Prototype은 Python으로 제작되었습니다.아래의 상세 코드를 참고해주세요! <code class="language-plaintext"># 환경설정 !pip install openai import os import openai import json import unicodedata import pandas as pd # ChatGPT API Key Load os.environ["OPENAI_API_KEY"] = "ChatGPT API Key" openai.api_key = os.environ["OPENAI_API_KEY"] # Audio File Load and Transformation audio_file= open("speech.wav", "rb") transcript = openai.Audio.transcribe("whisper-1", audio_file) transcript # OpenAIObject를 json 형식의 문자열로 변환 json_str = json.dumps(transcript.to_dict()) # json 형식의 문자열을 파이썬 사전형식으로 변환 transcript_dict = json.loads(json_str) # 유니코드 문자열을 한국어 문자열로 변환 Message_text = unicodedata.normalize("NFC", transcript_dict["text"]) # 줄 바꿈 추가 Message_text = Message_text.replace('. ', '.\n').replace('? ', '?\n').replace('! ', '!\n') # 출력 결과 print(Message_text) # 모델 - GPT 3.5 Turbo 선택 model = "gpt-3.5-turbo" # 질문 작성하기 query = "다음 문서를 요약해줘: " + Message_text # 메시지 설정하기 messages = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": query} ] # ChatGPT API 호출하기 response = openai.ChatCompletion.create( model=model, messages=messages ) answer = response['choices'][0]['message']['content'] print("ChatGPT: "+ answer.replace('.', '.\n').replace('? ', '?\n').replace('! ', '!\n'))</code> 📝H-AILight Prototype 시연영상H-AILight Prototype 시연 영상입니다. 📝Team.오늘도레벨1 정보팀 이름: 오늘도레벨1팀장 아이디: tmdrb0415@naver.com팀원 아이디: hshyun12@kookmin.ac.kr, kjh9654@kookmin.ac.kr
이제 고민하지말고, UMM하세요 1. 서비스 명 : UMM2. 주요 서비스 요약 : 글쓰기에 어려움을 느끼는 청년들을 위한 채팅기반 레터 작성 웹서비스3. 주요 서비스 내용 : 레터를 받을 상대방과 나와의 관계, 상황을 파악하여 그에 맞는 레터를 작성해준다.4. 주요 타켓층 : 글쓰기에 어려움을 느끼는 대학생과 신입사원 (그 외 모든 사람) 5. 기획의 배경 : 입사한지 얼마 되지 않은 신입사원의 경우, 회사에서 업무 요청, 부탁, 메일, 문자 등을상급자에게 보낼때 어떻게 써야 정중하며 단어선택이 옳바른지 고민하는 경우가 많다.대학생의 경우에도 교수님이나, 주변에 일면식 없는 전문가 등 학생의 경험에서 글을 써보지 않는 경우 어려움이 있다.이러한 어려움을 챗GPT api를 활용하여 구체적인 상황과 상대방을 선정하여 보다 글쓰기에 도움을 주며 내 글쓰기에 대한 첨삭 또한 가능한 나의 “업무 및 글쓰기 비서”를 선보인다. 또한 일반적인 상황(축하, 안부, 위로, 상담)에서도 풍부한 글쓰기를 활용할 수 있다는 장점을 가지고 있다. 6. 실제 UMM 서비스 링크 (해보세요^__^)um-oh-ah-yeh.vercel.app 7. 시연영상 8. 기대효과 : 내가 적을 메일이나 레터의 첨삭을 받기 어려운 경우가 많다. 사적인 글쓰기인 만큼 다른 누군가에게 첨삭을 받기 까다로운 상황을 해결해 줄 수 있으며 업무의 효율을 증대시켜 줄 수 있다. 또한 글쓰기의 도와주며 청년들의 글쓰기실력 또한 향상될 것이라 기대한다. 9. 기술흐름도1 Depth2 Depth3 Depth당신은 누구인가요?누구에게 레터를 작성하나요?어떤 상황의 글을 작성하나요? 1.1 회사원대리님 차장님 리더님 부장님 이사님회의요청 회의보고 업무요청 업무보고 외부업체외주컨택 협업제안 견적문의 후원문의 1.2 대학생교수님성적정정 논문컨택 논문피드백 공모전피드백전문가자문요청전문외주자문요청 견적문의1.3 일반가족 친구 친구지인 부모님지인 동료안부인사 축하인사 위로인사 상담문자 10. 개발 레퍼지토리백엔드 https://github.com/MOKY4/um-oh-ah-yeh-backend-lambda프론트 https://github.com/MOKY4/um-oh-ah-yeh-frontend 11. 팀소개팀명 : MOKY4 팀장(기획) : abc1004829@naver.com백엔드 : akak640@gmail.com디자이너 : k1041010@naver.com프론트엔드 : 0310kjy@gmail.com
당신의 아이디어를 50억 스타트업으로Langchain 기반의 스타트업 빌더 솔루션 “스타트라이트”데모 영상2년 이내 스타트업, 절반은 망했습니다. 당신의 바른 시작을 돕습니다. 당신의 창업 고민, 스타트라이트에서 해결하세요. 서비스 워크플로우 스타트라이트 팀구성 강호진(ganghojin94@naver.com), 김정태(kjhmlove93@gmail.com), 박천영(chunyoungq.p@gmail.com), 최우영(bluerabbit@gmail.com)깃허브 바로가기더 알고싶으시다면 여기로
1. 서비스 개요- 개인 또는 기업이 상표 등록을 하고 싶으나, 상표 등록에 필요한 정보를 조회하기 매우 어려움. - ChatGPT로는 상표 등록에 대해 조사해보면 원론적인 답변 해줌(예:상표 등록 방법) - 구글크롬이나 엣지로는 국내 상표 등록에 자세히 나오지 않음. - 결국 상표 등록에 필요한 정보를 조회하기 위해서는 KIPRIS에 있는 상표를 조사해야함. - KIPRIS 사이트를 통해서 상표를 검색하려고 해도 일반 개인이나 기업은 이런 상표에 대한 이해가 부족함. - 용어를 이해하고 상표를 검색해도 많은 양의 정보와 노이즈로 인해 원하는 상표 데이터를 가져오기 매우 어려움. - 이런 문제를 해결하고 개인 또는 기업이 쉽게 관련 상표를 조회해보고 상표를 출원하는데 도움을 주고자 함. 2. 서비스 소개2-1) 서비스 UI효용성 검증 후 상세개발 예정입니다.2-2) 서비스 Flow1) 상표를 내고자 하는 산업(Field)분야를 User 로부터 입력 받음. 2) GPT API를 이용하여 상표를 내고자 하는 산업 분야의 Target 기업을 선정. 2-1) Target 기업의 선정의 기준은 Prompt Engineering을 통해 구현 2-2) Prompt Engineering : 국내 관련사업의 대표적인 5개 기업 추출 3) Target 기업을 KIPRIS API를 통해 조회 4) Target 기업의 해당 상표를 모두 Data로 저장(출원번호, 출원일자, 분류코드) 5) 4)에서 저장된 상표의 출원번호를 이용하여 출원번호에 해당하는 모든 Data 호출(제품명, 유사군코드) 6) 4,5)를 통해 저장된 data(dictionery) 를 모두 GPT 로 학습 7) User가 "경쟁 기업들이 설정하지 않은 productName 또는 유사군 코드를 보여줘"라는 방식의 질문을 던지면 Chatbot 이 답변 3) 소스코드 및 시연영상첨부참조recommend_company.pyprompt engineering 을 통해, User가 입력한 산업군 관련 기업 5개를 추천해줌get_data_kipris.pykipris api를 통해, 앞서 추천해준 5개 기업들의 특허정보를 crawling 함chatbot.py크롤링된 데이터를 chatbot(langchain>pandas dataframe agent)이 학습하여, 그 정보를 토대로 답변해줌특허등록 chatbot_시연영상.mp4UI가 개발중인관계로, vscode terminal에서 시연한 영상 첨부합니다.
0. LOCO?안녕하세요 저희는 팀 LOCO입니다.저희는 약속 장소, 시간, 예산만 입력하면 자동으로 데이트 코스를 짜주는 어플인 LOCO를 준비했습니다. 바쁜 와중에 매번 데이트코스 짜기 번거로우셨죠? LOCO를 통해 나만의 데이트코스를 편리하게 생성 및 관리해보세요! 1. 서비스 배경/목적/대상서비스 배경: 2019년 듀오 설문조사에 따르면 연인간 데이트 불만 원인 1위가 “매번 아무런 계획이 없는 연인” 이라고 합니다. 이를 통해 저희는 많은 커플들이 데이트코스로 고민하고 있다는 사실에 주목했습니다. 서비스 목적: LOCO는 약속 장소, 시간, 예산, 기타 사용자 요청사항 등을 입력하면 1분안에 간편하게 데이트 코스를 생성할 수 있습니다. 이를 통해 사용자는 나만의 데이트 코스를 손쉽게 생성하고 편리하게 관리할 수 있습니다. 서비스 대상: 매번 어디가서 뭐할지 고민하느라 곤욕을 치르는 커플들 2. 서비스 방식시스템 아키텍쳐 코드 Front-End: https://github.com/love-compass/loco-androidBack-End: https://github.com/love-compass/LOCO-BackendAI Engineering: https://github.com/love-compass/loco-gpt코드는 너무 길어서 맨 아래에 첨부하겠습니다. 자세한 코드는 위에 링크한 저희 github를 참조해주세요 3. 서비스 기대효과고민 없이 1분 만에 나에게 맞는 데이트 코스 생성원하지 않는 코스는 수정 , 나만의 데이트 코스를 간편하게 생성마음에 들었던 코스는 저장 후 손쉽게 관리 4. 향후 발전 방향기능개선GPT-4 API 도입코스 생성 지역 추가 (e.g., 지방 여행)지원 언어 확대 (Azure의 번역 모듈 활용) 추가 기능 개발이전 생성 코스에 대한 평가 요청, 다음 코스 생성시에 반영생성된 코스를 다른 사람들과 공유할 수 있는 기능 APPENDIX: LOCO-GPT<code class="language-python">import os import re import json from typing import List, Dict import openai from google.cloud import translate # API Keys os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "YOURGOOGLEAPI.json" # 수정 필요 openai.api_key = "YOUROPENAIKEY" # 수정 필요 google_trans_id = "YOURGOOGLEAPIID" # 수정 필요 def place_en_to_ko(location: str) -> str: place_dict ={'강남/역삼/선릉': 'Gangnam / Yeoksam / Seolleung', '강남구청': 'Gangnam-gu Office', '개포/일원/수서': 'Gaepo/Irwon/Suseo', '건대/군자/구의': 'Kondae/Gunja/Guui', '금호/옥수': 'Kumho/Oksu', '명동/을지로/충무로': 'Myeongdong/Euljiro/Chungmuro', '방이': 'Bangi-dong', '북촌/삼청': 'Bukchon/Samcheong', '삼성/대치': 'Samsung/Daechi', '상수/합정/망원': 'Sangsu/Hapjeong/Mangwon', '서울역/회현': 'Seoul Station/Hoehyeon', '서초/방배': 'Seocho/Bangbae', '서촌': 'Seochon', '선릉/삼성': 'Seolleung/Samsung', '성수/뚝섬': 'Seongsu/Ttukseom', '신사/논현': 'Sinsa/Nonhyeon', '신촌/홍대/서교': 'Sinchon / Hongdae / Seogyo', '압구정/청담': 'Apgujeong/Cheongdam', '양재/도곡': 'Yangjae/Dogok', '연남': 'Yeonnam', '영동포/여의도': 'Yeongdongpo/Yeouido', '용산/삼각지': 'Yongsan/Samgakji', '이태원/한남': 'Itaewon/Hannam', '잠실/송파': 'Jamsil/Songpa', '종로/광화문': 'Jongno/Gwanghwamun', '분당': 'Bundang-gu', '수원/광교': 'Suwon/Gwanggyo', '판교': 'Pangyo'} gyeonggido_list = ['Bundang-gu', 'Suwon/Gwanggyo', 'Pangyo'] # gyeonggido-rization if place_dict[location] in gyeonggido_list: return place_dict[location] + ", GyeongGi-Do" else: return place_dict[location] + ", Seoul" def translator(text: str, task: str, project_id=google_trans_id) -> str: client = translate.TranslationServiceClient() location = "us-central1" # 아까 지정한 용어집 이름과 같이 맞춰줘야 함 glossary = client.glossary_path(project_id, location, 'loco_translator_glossary') glossary_config = translate.TranslateTextGlossaryConfig(glossary=glossary) parent = f"projects/{project_id}/locations/{location}" # Translate text from English to Korean if task == 'ko-en': response = client.translate_text( request={ "parent": parent, "contents": [text], "mime_type": "text/plain", # mime types: text/plain, text/html "source_language_code": "ko", "target_language_code": "en-US", "glossary_config": glossary_config, } ) return response.glossary_translations[0].translated_text elif task == 'en-ko': response = client.translate_text( request={ "parent": parent, "contents": [text], "mime_type": "text/plain", # mime types: text/plain, text/html "source_language_code": "en-US", "target_language_code": "ko", "glossary_config": glossary_config, } ) return response.glossary_translations[0].translated_text else: pass def translator_chatgpt(text: str, task: str) -> str: TRANSLATION_TASK_PROMPT = "" if task == 'ko-en': TRANSLATION_TASK_PROMPT = f"Translate {text} into English." elif task == 'en-ko': TRANSLATION_TASK_PROMPT = f"Translate {text} into Korean." else: pass LOCO_TRANSLATION_PROMPT = f"""{TRANSLATION_TASK_PROMPT} You should not translate the following words: ACTIVITY, "activity_name", "start_time", "end_time", "description", "budget". Do not generate both before and after translation results. Begin!: """ response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": f"{LOCO_TRANSLATION_PROMPT}."}], temperature=1.1, max_tokens=2048, top_p=0.9, frequency_penalty=0.0, presence_penalty=0.0 ) result = response.choices[0].message.content return result def init(): LOCO_PREFIX_RPOMPT = """We are making LOCO, a dating application. LOCO aims to recommend the best dating route by receiving the Meeting and Parting time, Cost, and Approximate location as input. You must tell the user in detail where and what to do depending on the time of day. You should not provide virtual location information, but must present location information that exists in reality. You must not recommend physically impossible routes. For example, Human can not travel from Anam Station to Seoul Nat'l Univ. Station in 1 minutes. You must not make recommendations beyond a given budget. For example, you shouldn't be recommending $10 spaghetti to your user if user's budget is only $5. You must create a date path strictly according to our instructions. Do you understand this task is?:""" while True: init_loco = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": f"{LOCO_PREFIX_RPOMPT}"}], temperature=1.1, max_tokens=2048, top_p=0.9, frequency_penalty=0.0, presence_penalty=0.0 ) print("---------------------------------------------------") print("\"Human\": Do you understand what this task is?") print("\"AI\":", init_loco.choices[0].message.content) if "yes" in init_loco.choices[0].message.content.lower(): print("\"Human\": Great, Let's begin!") print("---------------------------------------------------") break else: continue def postprocessing(result: str) -> str: """ [Exception 1] OUTPUT FORMAT: ACTIVITY 1. ~ [Exception 1-1] "activity_name" not in result ACTIVITY 1. "Lotte World Tower Observation Deck" [Exception 1-2] "ACTIVITY" not in result 1. Breakfast at Bongchu Jjimdak (봉추찜닭) in Jamsil - "activity_name": "Bongchu Jjimdak (봉추찜닭)", [Exception 1-3] Variation 1-3 ACTIVITY 1. "activity_name": "Seoul Sky Observatory", [Exception 1-4] Variation 1-4 ACTIVITY 1. "Breakfast at Paul Bassett" [Exception 1-5] There is one ACTIVITY ACTIVITY "activity_name": "Seonjeongneung Park", "start_time": "2023-04-09T11:00:00", "end_time": "2023-04-09T13:00:00", "description": "A historic park featuring the tombs of two Joseon Dynasty kings and their queens.", "budget": "0" "activity_name": "Starfield COEX Mall", [Exception 2] UNINTENDED OUTPUT: "budget": "39000" Total budget: 101000 Won <- THIS [Exception 3] UNINTENDED OUTPUT between activities "budget": "0" To end the day, we can grab some coffee and dessert at Starbucks Yangjae Station Branch. It's a cozy place to chat and relax after a long day. <- THIS "activity_name": "Starbucks Yangjae Station Branch", """ # remove multiple spaces result = re.sub(' +', '', result) result = result.replace("- ", "") pattern = """ACTIVITY \"activity_name\"""" result = result.replace(pattern, "ACTIVITY\n\"activity_name\"") # exception: 1-5 if result.count('ACTIVITY') == 1: if "1. " in result: pattern = re.compile(r'\d\. .*') findall_num = pattern.findall(result) for f in findall_num: result = re.sub(f, "", result) result = result.replace("\n\"activity_name\"", "ACTIVITY\n\"activity_name\"") else: result = result.replace("\n\"activity_name\"", "ACTIVITY\n\"activity_name\"") # exception: 3 exception_pattern_3 = re.compile(r'\n\n.+\n') findall_between = exception_pattern_3.findall(result) if findall_between: for f in findall_between: if "\"activity_name\"" in f or 'ACTIVITY' in f: continue result = result.replace(f, "") # exception: 1-4 activity_findall = re.compile(r'\d\. .*').findall(result) for a in activity_findall: if "activity_name" not in a: result = re.sub(a, '\nACTIVITY', result) # exception: 1-3 if "ACTIVITY\n1. \"activity_name\"" in result: result = re.sub(r'\d\. ', 'ACTIVITY\n', result) exception_pattern_1 = re.compile(r'\d\. ' + '\"*[a-zA-Z| *|:|é|\"]*\"*') # exception: 1-1 if "activity_name" not in result: activity_findall = exception_pattern_1.findall(result) for a in activity_findall: result = re.sub(exception_pattern_1, 'ACTIVITY\n\"activity_name\": ' + a, result) result = re.sub(r'\d\. ', "", result) # exception: 1-2 if "ACTIVITY" not in result: activity_findall = exception_pattern_1.findall(result) for _ in activity_findall: result = re.sub(exception_pattern_1, 'ACTIVITY\n', result) result = re.sub(r'\d\. ', "", result) result = re.sub(r'\([^)]*\) *[a-zA-Z| *|가-힣]*', "", result) # exception: 1 if exception_pattern_1.match(result): result = re.sub('\d\. ' + '[a-zA-Z | *]*', 'ACTIVITY', result) if "ACTIVITY\n\nACTIVITY" in result: result = result.replace("ACTIVITY\n\nACTIVITY", "ACTIVITY") if "\n\n\nACTIVITY" in result: result = result.replace("\n\n\nACTIVITY", "\n\nACTIVITY") if "ACTIVITY\n\nACTIVITY" in result: result = result.replace("ACTIVITY\n\nACTIVITY", "ACTIVITY\n") # exception: 2 exception_pattern_2 = re.compile(r"\"budget\": \"[a-zA-Z0-9]*\"") findall_budget = exception_pattern_2.findall(result) if findall_budget: # not empty chop_idx_from = result.rfind(findall_budget[-1]) chop_idx_to = len(findall_budget[-1]) result = result[:chop_idx_from + chop_idx_to] # e.g., ACTIVITY 1 -> ACTIVITY result = re.sub(r'ACTIVITY ' + '[0-9]+', 'ACTIVITY', result) # e.g., ACTIVITY 1: OR ACTIVITY1: OR ACTIVITY: OR ACTIVITY : -> ACTIVITY result = re.sub(r'ACTIVITY' + '[0-9| ]*:', 'ACTIVITY', result) # e.g., 1. ACTIVITY -> ACTIVITY result = re.sub(r'\d\. ACTIVITY', 'ACTIVITY', result) # remove (SOMETHING) result = re.sub(re.compile(r'\([^)]*\) *'), "", result) # remove # # e.g., "budget": "0" # free admission -> "budget": "0" result = re.sub(re.compile(r'# *.*'), "", result) if "ACTIVITYACTIVITY" in result: result = result.replace("ACTIVITYACTIVITY", "ACTIVITY") if "ACTIVITY\nACTIVITY" in result: result = result.replace("ACTIVITY\nACTIVITY", "ACTIVITY") return result def remove_verb(p: str) -> str: p = p.replace("Artistic exploration at ", "") p = p.replace("Breakfast at ", "") p = p.replace("Brunch at ", "") p = p.replace("Chimaek at ", "") p = p.replace("Coffee at ", "") p = p.replace("Coffee and Cake at ", "") p = p.replace("Coffee and dessert at ", "") p = p.replace("Coffee break at ", "") p = p.replace("Cycling in ", "") p = p.replace("Dinner at ", "") p = p.replace("Explore ", "") p = p.replace("Go to ", "") p = p.replace("Hiking at ","") p = p.replace("Karaoke at ", "") p = p.replace("Lunch at ", "") p = p.replace("Night view at ", "") p = p.replace("Night view of ", "") p = p.replace("Picnic at ", "") p = p.replace("Riding the Cable Car at ", "") p = p.replace("Relax at ", "") p = p.replace("Shopping at ", "") p = p.replace("Shopping in ", "") p = p.replace("Stroll around ", "") p = p.replace("Tea time at ", "") p = p.replace("Visit ", "") p = p.replace("Visit to ", "") p = p.replace("Visiting ", "") p = p.replace("Virtual Reality Experience at ", "") p = p.replace("Walking tour of ", "") p = p.replace("Walking tour in ", "") p = p.replace("Walk along ", "") p = p.replace("Walk in ", "") p = p.replace("Walk around ", "") return p def change_route(meeting_time: str, parting_time: str, budget: str, place: str, user_request: str, prior_places: List[str]) -> str: m_year, m_time = meeting_time.split("T") m_year = m_year.split('-') meeting_time = m_time.strip() + ", " + m_year[0] + "/" + m_year[1] + "/" + m_year[2] p_year, p_time = parting_time.split("T") p_year = p_year.split('-') parting_time = p_time.strip() + ", " + p_year[0] + "/" + p_year[1] + "/" + p_year[2] print(f"time: from {meeting_time} to {parting_time}, budget: {budget}, place: {place}") print("---------------------------------------------------") USER_REQUEST_PROMPT = "" # user_request: "가격이 너무 비싸요" if user_request: user_request = translator(user_request, task='ko-en') # 'ko-en' or 'en-ko' USER_REQUEST_PROMPT = f"You should consider this message: {user_request}. " # prior_places: ['서울올림픽미술관', '꼬꼬춘천치킨', '코엑스 아쿠아리움', '스타필드 코엑스몰'] if prior_places: temp_places = "" for idx, pp in enumerate(prior_places): if idx == len(prior_places) - 1: temp_places += translator(pp, task="ko-en") else: temp_places = temp_places + translator(pp, task="ko-en") + ", " USER_REQUEST_PROMPT += f"You must not include the following locations: {temp_places}" print("USER_REQUEST_PROMPT: ", USER_REQUEST_PROMPT) LOCO_INSTRUCTION_RPOMPT = f"""Plan a date from {meeting_time} to {parting_time}, budget is {budget}, and Meeting place is {place}. You should actively recommend names of place that exist in reality, what it actually costs. {USER_REQUEST_PROMPT}. You should recommend only one place and don't give me a choice. OUTPUT FORMAT: ``` ACTIVITY "activity_name": "Starbucks Yangjae Station Branch", "start_time": "2023-04-09T13:00:00", "end_time": "2023-04-09T15:00:00", "description": "Starbucks is the world's largest multinational coffee chain.", "budget": "10000" ``` "activity_name" should be a place only and "description" should consist of one sentence """ LOCO_SUFFIX_PROMPT = """You must follow the OUTPUT FORMAT, Begin!:""" response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": f"{LOCO_INSTRUCTION_RPOMPT}. {LOCO_SUFFIX_PROMPT}"}], temperature=1.1, max_tokens=2048, top_p=0.9, frequency_penalty=0.0, presence_penalty=0.0 ) result = response.choices[0].message.content return result def generate_route(meeting_time: str, parting_time: str, budget: str, place: str, user_request: str) -> str: m_year, m_time = meeting_time.split("T") m_year = m_year.split('-') meeting_time = m_time.strip() + ", " + m_year[0] + "/" + m_year[1] + "/" + m_year[2] p_year, p_time = parting_time.split("T") p_year = p_year.split('-') parting_time = p_time.strip() + ", " + p_year[0] + "/" + p_year[1] + "/" + p_year[2] print(f"time: from {meeting_time} to {parting_time}, budget: {budget}, place: {place}") print("---------------------------------------------------") USER_REQUEST_PROMPT = "" # user_request: "가격이 너무 비싸요" if user_request: user_request = translator(user_request, task='ko-en') # 'ko-en' or 'en-ko' USER_REQUEST_PROMPT = f"You should consider this message: {user_request}. " # date time <= 2 hours -> recommend a place SINGLE_PLACE_PROMPT = "" if int(p_time.split(":")[0]) - int(m_time.split(":")[0]) <= 3: SINGLE_PLACE_PROMPT = "If date time is less than 2 hours, you recommend only one place. Do not give me a choice." LOCO_INSTRUCTION_RPOMPT = f"""Plan a date from {meeting_time} to {parting_time}, budget is {budget}, and Meeting place is {place}. You should actively recommend names of place that exist in reality, what it actually costs. {USER_REQUEST_PROMPT}. {SINGLE_PLACE_PROMPT} OUTPUT FORMAT: ``` ACTIVITY "activity_name": "Starbucks Yangjae Station Branch", "start_time": "2023-04-09T13:00:00", "end_time": "2023-04-09T15:00:00", "description": "Starbucks is the world's largest multinational coffee chain.", "budget": "10000" ``` "activity_name" should be a place only, "budget" should be only numbers and "description" should consist of one sentence """ LOCO_SUFFIX_PROMPT = """You must follow the OUTPUT FORMAT, Begin!:""" response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": f"{LOCO_INSTRUCTION_RPOMPT}. {LOCO_SUFFIX_PROMPT}"}], temperature=1.1, max_tokens=2048, top_p=0.9, frequency_penalty=0.0, presence_penalty=0.0 ) result = response.choices[0].message.content return result class LOCO: def __init__(self): print("Initializing LOCO") init() def inference(self, meeting_time: str, parting_time: str, place: str, budget: int, user_request: str, prior_places: List[str]) -> List[Dict]: # preprocessing place = place_en_to_ko(place) budget = str(budget) + " Won" if prior_places: # user-requested try (not empty) print("Change a meeting place") print("---------------------------------------------------") # change a meeting place result = change_route(meeting_time, parting_time, budget, place, user_request, prior_places) else: # first try # generate schedule print("Generate Routes") result = generate_route(meeting_time, parting_time, budget, place, user_request) print(result) print("---------------------------------------------------") # postprocessing result = postprocessing(result) print(result) print("---------------------------------------------------") # split paragraph parsed_result = result.replace("\n\n", "").replace("\n", "").split("ACTIVITY")[1:] # remove verb from activity, translate en to ko, and json formatting parsed_result = [json.loads("{" + remove_verb(p) + "}") for p in parsed_result] for r in parsed_result: print(r) print("---------------------------------------------------") # translation and then budget; str to int for idx in range(len(parsed_result)): parsed_result[idx]["activity_name"] = translator(parsed_result[idx]["activity_name"], task='en-ko') parsed_result[idx]["description"] = translator_chatgpt(parsed_result[idx]["description"], task='en-ko') try: parsed_result[idx]["budget"] = int(parsed_result[idx]["budget"]) except: parsed_result[idx]["budget"] = 0 return </code> APPENDIX: TEAM LOCOFront-End: 윤여준 (https://portfolio.yjyoon.dev/11626f7e3c2748ada13fac6e35745914)Back-End: 권기호 (https://chocochip101.notion.site/5db753a434f74087b768194d54b608bd)AI-Engineering: 박제윤 (https://jeiyoon.github.io/)AI-Engineering: 이문기 (https://blog.naver.com/ansrl23)
렛 미 잇 (Let Me Eat) 서비스 배경디지털 헬스케어 산업이 지속적으로 성장하는 추세디지털 헬스케어 분야별 산업이 계속해서 성장함에 따라 생성형 AI ChatGPT 활용 가능성이 증가할 것으로 보임서비스 목적 및 대상다양한 연령층에게 음식 정보 제공 및 해당 음식과 잘 어울리는 추천 서비스 및 섭취 주의사항 제공모든 연령에게 ChatGPT API를 활용한 서비스 제공서비스 방식 서비스 기대 효과음식에 대한 건강정보 제공 및 추천 음식을 통해 사용자에게 양질의 정보 제공모든 연령층에게 편리하게 ChatGPT API를 활용하여 서비스 제공현재는 음식 이미지로 제한되어 있지만 의약품을 구분할 수 있는 모델로 확장하는 경우 의료 산업분야에서 확장성 기대 시연PC Mobile 소스코드 gyheo/let-me-eat (github.com)
서비스 소개다가온 시험기간. 강의자료만 붙들고 외우고 있는 당신. 당신의 실력이 어느 정도인지 파악하고 싶지 않으신가요?“Chatster”를 통해 당신이 가지고 있는 PDF로 문제를 만들고 당신의 실력을 테스트해보세요.🤷서비스 배경공부를 하다 보면, 개념은 알지만 이 개념을 통해서 어떻게 문제가 나올 지 모르기에, 본인이 정확하게 무엇을 모르는지도 모르는 경우가 많습니다. 이에 불편함을 느낀 저희는 PDF를 첨부하면 문제를 만들어주는 서비스를 개발하게 되었습니다.🤷♀️서비스 대상교수님 혹은 선생님이 주신 강의자료로부터 문제를 만들어서 본인의 실력을 테스트해보고 싶은 학생🤷♂️서비스 목적본인이 공부한 강의자료를 바탕으로 만들어진 문제를 풀어 봄으로써, 메타 인지 능력을 향상시키고자 하여 이 서비스를 고안하게 되었습니다.※ 메타 인지란? 자기 자신이 인지하고 있음을 아는 것, 즉 "자신이 알고 있는지 모르고 있는지를 안다"라는 뜻입니다.서비스 플로우1. Main Page: PDF를 업로드하고 해당 PDF에서 문제를 출제할 페이지와 출제할 문제 수를 입력하는 페이지2. Loading Page: GPT가 문제를 생성하는 동안 표시되는 페이지3. Questions Page: GPT가 출제한 문제를 화면에 제시하여 웹상에서 직접 문제풀이가 가능하도록 함4. Answers Page: 오답 여부를 파악하고, 풀이를 확인할 수 있는 페이지로, 출제된 문제를 TXT 파일 형태로 다운로드받을 수 있음서비스 링크배포 링크: https://port-0-ms-azure-17xqnr2llgujko5k.sel3.cloudtype.app/git repository: https://github.com/wldnd2/MS_Azure.git※ 배포 툴 (cloudtype) 의 무료 용량 제한으로 인해, 배포 링크를 통해 실행하게 되면 1페이지당 1문제씩만 문제 생성이 가능합니다. 더욱 자유로운 사용을 위해선 로컬을 통해 테스트해보심을 추천드립니다!🤓데모 영상사용된 스택front-end: html, cssback-end: flask, pythondistribute: cloudtype기대 효과 & 확장 가능성학생들은 이 서비스를 이용하여 본인이 공부하던 강의자료를 바탕으로 만들어진 문제를 통해 자신이 정확하게 알고있는 것과 모르고 있는 것이 무엇인지를 알 수 있을 것입니다.특히, 문제을 출제해 줄 뿐만 아니라 요약 기능을 추가한다면 시험을 대비하여 강의 자료를 단기간에 암기하는 것에도 도움을 줄 것입니다.논문이나 전공 서적 등의 PDF 파일을 이용하여 문제를 추출하여 학습하는 데 사용한다면, 학습 효율을 극대화시킬 것이라고 기대됩니다.학원 선생님 등 문제 제작에 많은 시간을 소모하는 이들에게도 이 서비스는 유용하게 사용될 수 있습니다.Team INFO팀 Chatster(ChatGPT + Master) | 경북대학교 컴퓨터학부 소속전지웅(팀장) jun000628@naver.com김민주 kimminju77786@gmail.com김현지 khj011030@gmail.com이은지 leeej106@knu.ac.kr최희정 nuly7029@gmail.com코드 공유 (자세한 사항은 github를 확인해주세요.)run.py<code class="language-plaintext"># -*- coding: utf-8 -*- """ pip install flask pip install openai pip install PyPDF2 pip install numpy 실행: python run.py """ import os import json import openai import secrets import numpy as np from PyPDF2 import PdfReader from pdf import pdf_processing from generate_txt import generate_txt_file from werkzeug.utils import secure_filename from flask import Blueprint, send_file, request, redirect, url_for, render_template, Flask, session app = Flask(__name__) app.secret_key = secrets.token_hex(16) app.jinja_env.add_extension('jinja2.ext.loopcontrols') UPLOAD_FOLDER = os.getcwd() + '/uploads' # 절대 파일 경로 ALLOWED_EXTENSIONS = set(['pdf']) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 8 * 1024 * 1024 # 16MB로 업로드 크기 제한, RequestEntityTooLarge : 크기 초과시 이 예외 발생, 처리 필요 GPT_answer = [] User_answer = [] global false_answer false_answer = 0 def allowed_file(filename): return '.' in filename and \\ filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS @app.route('/', methods=['GET', 'POST']) def upload_file(): global false_answer GPT_answer.clear() User_answer.clear() false_answer = 0 if request.method == 'POST': result = request.form # start_page, end_page, num_of_questions 변수 저장 file = request.files['myfile'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) session['filename'] = filename session['result'] = result return redirect(url_for('questions')) return render_template('fileupload.html') # GET @app.route('/questions', methods=['GET', 'POST']) def questions(): if request.method == 'POST': for key, value in request.form.items(): User_answer.append(int(value)) return redirect(url_for('check')) else: GPT_answer.clear() User_answer.clear() filename = session.get('filename') result = session.get('result') result["filename"] = filename question = pdf_processing(result["filename"], result["start_page"], result["end_page"], result["num_of_questions"], result["api"]) Qna_result = {} Qna_number = 1 # print("***********{ PDF RESULT }***********") # print(question) print("\\n***********{ Questions PROCESSING }*************") for key, value in question.items(): try: if(value[0] == "[" and value[-1] == "]"): print("***********{ List processing }***********") value = json.loads(value) for item in value: Qna_result[Qna_number] = item Qna_number += 1 else: print("***********{ Json processing }***********") Qna_result[Qna_number] = json.loads(value) Qna_number += 1 except: print("***********{ PASS!!!! }*************") continue print("\\n***********{ FINAL RESULT }*************") print(Qna_result) print("*******************************************") for key, value in Qna_result.items(): GPT_answer.append(int(value["정답"])) print(Qna_result) session["GPT_QUESTIONS"] = json.dumps(Qna_result) return render_template('questions.html', result=Qna_result) @app.route('/check', methods=['GET', 'POST']) def check(): if request.method == 'POST': GPT_response = json.loads(session.get('GPT_QUESTIONS', '{}')) print(GPT_response) generate_txt_file(GPT_response) # 다운로드할 파일 경로 설정 filepath = os.path.join(os.getcwd(), 'GPT_questions.txt') # 파일 다운로드 함수 호출 return send_file(filepath, as_attachment=True) else: print("********** CHECK ***********") print(GPT_answer) print(User_answer) false_answer = np.equal(GPT_answer,User_answer) false_ans_num = len(false_answer) - sum(false_answer) print(false_answer) print(false_ans_num) GPT_response = json.loads(session.get('GPT_QUESTIONS', '{}')) return render_template('check.html', check_result=GPT_response, false_num=false_ans_num, false_answer=false_answer) if __name__ == '__main__': app.run() </code>pdf.py<code class="language-plaintext">import os from werkzeug.utils import secure_filename from flask import Blueprint, send_file, request, redirect, url_for, render_template, Flask from PyPDF2 import PdfReader import openai, json def pdf_processing(filename:str, start_page, end_page, num_of_questions_per_page, api): """ PDF 추출 Setting """ reader = PdfReader("./uploads/" + filename) pages = reader.pages # txt = open("./downloads/" + filename + "_questions.txt", 'w', encoding='utf-8') questions = {} questions_number = 1 cur_page = 0 # 현재 페이지 """ ChatGPT Setting """ OPEN_AI_API_KEY = api # 각자 키 입력 (<https://platform.openai.com/account/api-keys> 확인 ㄱ) openai.api_key = OPEN_AI_API_KEY model = "gpt-3.5-turbo" messages = [ # system content 손 볼 필요 있음 {"role": "system", "content": "사용자가 전송하는 내용을 토대로 문제를 정확히 1개만 출제해. { 문제 : 질문, 1 : 첫 번째 선택지, 2 : 두 번째 선택지, 3: 세 번째 선택지, 4: 네 번째 선택지, 정답: 정답번호, 해설: 해설 } 이러한 json형태로 출력해."} ] """ JSON Setting """ json_file_path = "./downloads/questions.json" json_data = {} json_data['questions'] = [] for page in pages: # 페이지별 문제 추출 cur_page += 1 # 현재 페이지 수 if cur_page < int(start_page) or cur_page > int(end_page): # start_page ~ end_page 까지만 작동 continue query = page.extract_text() # 각 페이지에서 text 추출하여 query에 저장 print(f"-- {cur_page} 페이지 문제 추출 중 --") messages.append({"role": "user", "content": query}) for i in range(int(num_of_questions_per_page)): # ChatGPT API 호출하기 response = openai.ChatCompletion.create( model=model, messages=messages ) answer = response['choices'][0]['message']['content'] print('answer: ',answer) questions[questions_number] = answer questions_number += 1 # 다음 페이지를 위해 messages에서 현재 페이지의 text로 작성된 user content 삭제 messages.pop() # txt.close() return questions </code>generate_txt.py<code class="language-plaintext">def generate_txt_file(GPT_questions): with open('GPT_questions.txt', 'w', encoding='utf-8') as f: for key, value in GPT_questions.items(): f.write(f"문제 {key}: {value['문제']}\\n") question_num = 1 while True: print("ddd") try: f.write(f"{question_num}. {value[str(question_num)]}\\n") question_num += 1 except: break f.write(f"정답: {value['정답']}\\n") f.write(f"해설: {value['해설']}\\n\\n") </code>
안녕하세요. :) Team. KHTP입니다! 저희 팀은 취업 정보 수집에 대한 어려움을 ChatGPT API와 사람인 API를 활용하여 chatGPT 대화 주도 방식을 통해 사용자에게 정보를 수집해 사용자 맞춤형 기업을 추천해주는 서비스를 개발했습니다 ! Github 주소https://github.com/Team-KHPT/Project_Kim서비스 주소 (4월 29일 배포완료)https://kim.gbsw.hs.kr/chat 서비스 소개‘김비서’는 채팅을 통해 사용자가 보유하고 있는 기술과 희망하는 직종, 스펙 등을 분석해 사용자에 맞는 회사를 추천해 주는 대화형 인공지능입니다. 제작 배경저희는 현재 특성화 고등학교에 다니며 이제 취업을 준비하는 시기가 왔습니다. 현재 저희의 가장 큰 관심사인 '취업'과 가장 핫한 ‘ChatGPT’를 결합한 결과물이 바로 이 김비서 프로젝트 입니다. <취업 정보 찾기 어려워요!!> 사용자층특성화고등학교 학생들마이스터고등학교 학생들취업 담당 선생님들취업 준비생들 목표‘김비서는’ 국내 직업계고 학생들과 취준생 등 직장을 찾는 사람들이 시간 낭비 없이 본인과 어울리는 직장을 찾을 수 있도록 최고의 서포트를 하는 것을 목표로 합니다. 기대 효과사용자가 선택할 수 있는 회사의 폭이 늘어나 실업률이 낮아진다.좋은 조건을 가지고 있는 중소기업들의 구인이 쉬워진다.취업계 고등학교를 다니고 있는 고등학생과 사회초년생들의 취업 고민을 덜어준다. 향후 계획(발전 가능성)데이터를 추가하여 초,중,고등학생들을 위한 진로 상담 AI 개발챗봇 형식으로 변형하여 사람인, 잡코리아 등과 같은 메이저 취업 사이트에 취업 상담 챗봇으로 탑재사용자의 피드백을 받아 GPT Fine-tuning 팀소개Team. KHPT팀장KKH@kanghyun3130팀원KDH@kimd0nghyuk팀원KYH@yunhyeon05 서비스OpenAI API, 사람인 API를 탑재한 Django 웹서버를 제작하였습니다.페이지 디자인 (시연은 아래에..) 사용한 프롬프트들 사용자와 채팅을 위한 프롬프트<code class="language-python"># Project_Kim/chat/magic/chatting.py chatting_prompts = [ { 'role': 'system', 'content': ''' 너는 취업 상담사야. 사용자가 원하는 직무를 물어봐. 직무를 알았다면 사용자가 원하는 근무형태를 물어봐. 상세하게 물어보지는 않아도 돼. 근무형태를 알았다면 사용자의 학력을 물어봐. 학력을 알았다면 취업을 원하는 지역을 물어봐. 모두 알게 되었다면 계속 대화를 이끌어 나가며 적극적으로 상대방에게 질문해야 해. ''' }, {'role': 'assistant', 'content': "안녕하세요. 저는 사용자님께 알맞은 취업 정보를 제공해 드릴 김비서 입니다."} ] # ...</code>ChatGPT가 사용자에게 적극적으로 질문하도록 프롬프트를 작성하였습니다. 또한 assistant의 말을 미리 추가함으로써 사용자와의 대화에서 주제를 벗어나지 않게 함과 동시에 대화 말투를 지정해줄 수 있었습니다. 대화에서 정보 추출<code class="language-python"># Project_Kim/chat/magic/convert_chatting_to_info.py chatting_to_info_prompt = { 'role': 'user', 'content': ''' 지금까지 알아낸 정보를 아래와 같은 형식으로 말해줘. 모르는 값은 none 이라고 해줘. info: [ 직무: {직무}, 근무형태: {근무형태}, 학력: {학력}, 지역: {지역} ] ''' } # ...</code>사용자가 채팅 중에 ‘분석하기’ 버튼을 누르면 실행되는 코드의 프롬프트 입니다. 현재까지의 대화를 받은 뒤 user의 역할로 ChatGPT에게 물어보아 대답을 얻어냅니다. 이렇게 추출한 데이터는 가공을 거쳐 취업 정보를 불러오는데 사용됩니다. 추출한 정보를 취업 정보 API 요청 파라미터로 변환<code class="language-python"># Project_Kim/chat/magic/convert_info_to_code.py info_to_code_prompts = [ { 'role': 'system', 'content': f''' 아래의 테이블을 참고해서 하나 이상의 코드로 바꿔줘. 해당하는 코드가 없다면 비슷한 것을 골라서 코드로 바꿔줘. 코드만 답변해줘. none은 -1 이라고 출력해줘. 근무 형태 테이블. {get_job_type_data()} 지역 테이블. {get_loc_mcd_data()} 직무 테이블. {get_job_cd_data()} 학력 테이블. {get_edu_lvl_data()} ''' }, { 'role': 'user', 'content': ''' info: [ 직무: IT, 근무형태: 안정적인 형태, 학력: 고등학교 졸업 예정, 지역: none ] ''' }, { 'role': 'assistant', 'content': ''' 직무: 2, 근무형태: 1, 학력: 1, 지역: -1 ''' } ] # ...</code>위에서 추출한 정보를 사람인 취업정보 API 요청 파라미터로 변환 합니다. 이번에도 user와 assistant의 대화를 미리 추가해 줌으로써 답변 형식을 확실하게 정해줄 수 있었습니다. 직무 코드(API 파라미터) 세분화<code class="language-python"># Project_Kim/chat/magic/convert_job_to_detailed.py def get_prompts(job_cd: int) -> list: prompts = [ { 'role': 'system', 'content': f'''Based on the below table, pick one or more codes that is related to keyword. If you picked multiple codes, please separate them with commas. If you can't answer, say error. Table {get_detailed_job_cd_with(job_cd)} ''' }, {'role': 'user', 'content': '''백엔드 개발자'''}, {'role': 'assistant', 'content': '''84'''}, {'role': 'user', 'content': '''Unity 게임 개발자'''}, {'role': 'assistant', 'content': '''80,304'''}, {'role': 'user', 'content': '''ㄹㄷㅈㄹㄷㄹㅈㄷ'''}, {'role': 'assistant', 'content': '''error'''}, {'role': 'user', 'content': '''dsff'''}, {'role': 'assistant', 'content': '''error'''}, ] return prompts</code>사람인 API에는 직무 상위 코드와 그 아래 하위 직무 코드가 있습니다. 예를 들어 직무 상위 코드가 ‘IT개발·데이터’ 라면‘딥러닝’, ‘데이터분석가’ 등의 직무 키워드가 그 아래에 있습니다. (참고: https://oapi.saramin.co.kr/guide/code-table5?mcode=2)위 과정은 사용자가 원하는 직무와 관련된 하위 직무 코드를 모두 찾아내는 것 입니다.이번 프롬프트에서도 답변 예시를 추가해 주어 원하는 형식으로 답을 얻어낼 수 있게 하였습니다.(이 부분은 한글보다 영어를 잘 알아듣길래 영어로 프롬프트 작성했습니다 ㅎ..) 위에 작성한 프롬프트들 총 집합<code class="language-python"># Project_Kim/chat/views.py # ... def analyze(messages: list): # 1. exported_data = magic.convert_chatting_to_info(messages) # 2. converted_data = magic.convert_info_to_code([{'role': 'user', 'content': exported_data}]) # 3. job_cd = converted_data.split("직무: ")[1].split(",\n")[0] job_type = converted_data.split("근무형태: ")[1].split(",\n")[0] edu_lv = converted_data.split("학력: ")[1].split(",\n")[0] loc_mcd = converted_data.split("지역: ")[1].split("\n")[0] exported_job_data = exported_data.split("직무: ")[1].split(",")[0] detailed_job_code = magic.convert_job_to_detailed(job_cd, [{'role': 'user', 'content': exported_job_data}]) # 4. response = utils.job_info_request(detailed_job_code, job_type, edu_lv, loc_mcd) # 5. return response['jobs']['job'] # ...</code>채팅 내역이 함수에 전달됩니다.채팅 내역에서 정보를 추출추출한 정보를 취업 정보 API 파라미터 코드로 변경직무 세분화. 직무 상위 코드 → 직무 코드 (참고: https://oapi.saramin.co.kr/guide/code-table5?mcode=2)취업 정보 요청 시연채팅을 입력하면 답변을 스트림으로 제공합니다 대화 계속 대화.. 분석하기! (하나 밖에 안나오넹..) 이번에는 지역을 서울로 바꿔서 재시도!이번에는 여러개가 나왔네요..!분석 결과에 있는 링크를 누르면 사람인 채용 공고 페이지가 새 탭에 열리게 됩니다. 서비스 흐름도1. 서비스 흐름(Analyze Process는 아래에.) 2. 채팅 분석 흐름 1 (Analyze Process) 3. 채팅 분석 흐름 2 ( + 향후 계획) 본래 계획으로는 취업 정보 API를 통해 얻은 취업 정보를 다시 한번 ChatGPT로 분류할 계획이었지만현재로썬 취업 정보 API로 얻은 결과를 출력하는 기능만 구현되었습니다.계속 업데이트 해나가도록 하겠습니다. 감사합니다 :)