반응형

프로젝트: 노인을 위한 스마트챗봇

본 문서는 [프로젝트] 노인을 위한 스마트챗봇에 대한 설명서입니다.

프로젝트 개요

노인분들이 스마트폰 등 디지털 기기를 사용하는 데 어려움을 겪는 경우가 많습니다. 이에 따라 노인분들이 쉽게 사용할 수 있는 인터페이스를 제공하고, 일상생활에서 유용한 정보와 서비스를 제공하는 스마트챗봇을 개발하고자 합니다.

프로젝트 목표

  • 노인분들이 쉽게 사용할 수 있는 인터페이스 제공
  • 일상생활에서 유용한 정보와 서비스 제공
  • 사용자 맞춤형 서비스 제공

프로젝트 일정

  • 기획 및 설계: 2022년 1월 ~ 2월
  • 개발: 2022년 3월 ~ 6월
  • 테스트 및 보완: 2022년 7월 ~ 8월
  • 출시 및 유지보수: 2022년 9월 이후

프로젝트 구성원

  • 기획팀: 1명
  • 개발팀: 3명
  • 디자인팀: 1명
  • 마케팅팀: 1명

프로젝트 결과물

  • 노인분들이 쉽게 사용할 수 있는 스마트챗봇
  • 일상생활에서 유용한 정보와 서비스를 제공하는 스마트챗봇

프로젝트 예산

  • 총 예산: 100,000,000원
  • 인건비: 60,000,000원
  • 개발비: 20,000,000원
  • 디자인비: 5,000,000원
  • 마케팅비: 5,000,000원
  • 기타 경비: 10,000,000원

노션 ai 를 써서 알아서 써보라고 하니 이렇게 작성해준다. ㅋㅋㅋㅋ은근 잘써주네.

 

여튼

👉프로젝트: 노인을 위한 스마트챗봇

본 문서는 [프로젝트] 노인을 위한 스마트챗봇에 대한 설명서입니다.

GPT API 를 이용한 챗봇을 개발합니다.

👉프로젝트 개요

노인분들이 스마트폰 등 디지털 기기를 사용하는 데 어려움을 겪는 경우가 많습니다. 이에 따라 노인분들이 쉽게 사용할 수 있는 인터페이스를 제공하고, 일상생활에서 유용한 정보와 서비스를 제공하는 스마트챗봇을 개발하고자 합니다.

👉프로젝트 목표

  • 노인분들이 쉽게 사용할 수 있는 인터페이스 제공
  • 일상생활에서 유용한 정보와 서비스 제공
    • 찾기 쉬운 노인복지
    • 요즘 젊은이들은? 젊은이들과 대화하기
    • 지하철 길찾기 (더이상 주변사람에게 묻지마)
  • 사용자 맞춤형 서비스 제공

👉프로젝트 일정

  • 기획, 설계, 개발, QA : 2022년 3월 ~ 6월
  • 빨리 끝내고싶다.

👉프로젝트 개발환경

  1. React + Express
    • 일단은 웹 프로젝트로 진행할 예정.
    • 시간이 된다면 flutter로 전환예정.
  2. STT : React-speech-recognition
    • google cloud STT 도 있지만 일단 연결이 쉬운 패키지로 선정했다.
    • openai Whisper 도 보았으나 실시간 처리를 지원하지 않아 패스하기로 했다.
  3. Openai GPT3.5
  4. TTS : Google Cloud

진행사항

현재 React 로 테스트 페이지를 제작했으며, 음성인식을 통해 텍스트를 화면에 출력하고, 텍스트를 api 통신 후 response 를 받는데 성공했다. 이 response 를 출력하는데 까지 진행했다.

 

 

나말고도 STT, TTS 를 이용하는 분이 한 분 계시는데 그분은 Google Cloud STT 를 사용하는 것 같다. 시연 테스트를 보니 정확도는 나나 그분이나 비슷한 것 같아서 다행이긴한데 실시간 처리가 정확히 되는 모델을 무료로 찾는건 어려울 것 같다.

 

이제 TTS 도 연결하고 시나리오를 구체화해서 개발을 진행하면 될 것 같다.

 

기존 GPT 3.5 를 이용해 챗봇을 만들기엔 한계가 있기 때문에 open ai 에서 제공하는 fine tuning 을 이용할 예정이다.

위 기능을 이용하려면 데이터가 필요한데 데이터를 어떻게 학습시킬지 모델 구상하기가 조금 귀찮다. ㅋ

반응형

'ChatGPT > 챗봇프로젝트' 카테고리의 다른 글

[프로젝트] 노인을 위한 스마트챗봇 -2-  (0) 2023.06.17
반응형

ChatGPT 의 API 를 연결하려면 우선 로그인을 해야한다. 로그인을 하고 나서 Documentation 탭에 들어간다. API Reference 항목에서 Authentication 항목을 클릭하면 글 내용 중 볼드 처리된 API Keys 가 보이는데 이를 클릭하면 API Key 를 생성할 수 있다.

 

 

키가 발급되고 나면 팝업창이 뜨는데 전체 키를 보여주며 닫으면 다시 볼 수 없으니 복사를 잘 해놓자.

이제 적당한 폴더를 만들어

npm install openai

를 입력해 패키지를 설치하자.

 

 

https://platform.openai.com/docs/api-reference/chat/create

openAI 홈페이지에 가면 아주 잘 나와있으니 참고하면 편하다.

api.js 파일을 만들어 다음과 같이 입력한다.

const { Configuration, OpenAIApi } = require("openai");

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

const completion = await openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [{role: "user", content: "Hello world"}],
});
console.log(completion.data.choices[0].message);

위의 코드를 실행하면 다음과 같은 response를 받을 수 있다.

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\\n\\nHello there, how may I assist you today?",
    },
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}

Request Body 를 더 자세피 살펴보면

  • model(Required) : api 에 사용되는 모델
  • message(Required) : 전송할 메시지
  • temperature : 0~2 값을 입력. 더 높은 값일 수록 랜덤한 대답이 생성
  • top_p : temperature를 대체할 변수. 따라서 동시에 사용하지말자.
  • n : 각 입력 메시지에 대해 생성할 대화 완료 선택사항 수. 기본값은 1
  • stream : 생성되는 대답의 부분이 출력. 대답이 끊어서 전달된다.
response = openai.ChatCompletion.create(
    model='gpt-3.5-turbo',
    messages=[
        {'role': 'user', 'content': 'Count to 100, with a comma between each number and no newlines. E.g., 1, 2, 3, ...'}
    ],
    temperature=0,
    stream=True  # again, we set stream=True
)

위의 request 를 보내고

for chunk in response:
    chunk_time = time.time() - start_time  # calculate the time delay of the chunk
    collected_chunks.append(chunk)  # save the event response
    chunk_message = chunk['choices'][0]['delta']  # extract the message
    collected_messages.append(chunk_message)  # save the message
    print(f"Message received {chunk_time:.2f} seconds after request: {chunk_message}")

다음과 같이 response 를 확인한다면

Message received 0.10 seconds after request: {
  "role": "assistant"
}
Message received 0.10 seconds after request: {
  "content": "\\n\\n"
}
Message received 0.10 seconds after request: {
  "content": "1"
}
Message received 0.11 seconds after request: {
  "content": ","
}
Message received 0.12 seconds after request: {
  "content": " "
}
Message received 0.13 seconds after request: {
  "content": "2"
}
...
Message received 0.13 seconds after request: {
  "content": "100"
}

과 같은 출력을 할 수 있다.

  • stop : API가 추가 토큰 생성을 중지하는 최대 4개의 시퀀스.
  • max_tokens : 한번의 대답이 생성되기 위한 최대 토큰의 개수
  • presense_penalty : -2~2 사이의 숫자이며, 양수로 갈 수록 새로운 토큰이 지금까지 텍스트에 나타나는지 여부에 따라 대답을 다르게 한다.
  • frequency_penalty : -2~2 사이의 숫자이며, 양수로 갈수록 빈도를 기준으로 새로운 토큰에 페널티를 줘 동일한 행 생성을 막는다.
  • logit_bias : -100~100 사이의 값에 매핑한 json 개체를 이용해 지정된 값에 따른 토큰이 나타날 가능서을 수정한다.
  • user : user 를 입력해 openai 에서 로그를 수집해 피드백을 줄 수 있게 허가해준다.npm install openaiapi.js 파일을 만들어 다음과 같이 입력한다.위의 코드를 실행하면 다음과 같은 response를 받을 수 있다.Request Body 를 더 자세피 살펴보면
    • model : api 에 사용되는 모델
    • message : 전송할 메시지
    • temperature : 0~2 값을 입력. 더 높은 값일 수록 랜덤한 대답이 생성
    • top_p : temperature를 대체할 변수. 따라서 동시에 사용하지말자.
    • n : 각 입력 메시지에 대해 생성할 대화 완료 선택사항 수. 기본값은 1
    • stream : 생성되는 대답의 부분이 출력. 대답이 끊어서 전달된다.
    response = openai.ChatCompletion.create(
        model='gpt-3.5-turbo',
        messages=[
            {'role': 'user', 'content': 'Count to 100, with a comma between each number and no newlines. E.g., 1, 2, 3, ...'}
        ],
        temperature=0,
        stream=True  # again, we set stream=True
    )
    
    위의 request 를 보내고다음과 같이 response 를 확인한다면과 같은 출력을 할 수 있다.
    • stop : API가 추가 토큰 생성을 중지하는 최대 4개의 시퀀스.
    • max_tokens : 한번의 대답이 생성되기 위한 최대 토큰의 개수
    • presense_penalty : -2~2 사이의 숫자이며, 양수로 갈 수록 새로운 토큰이 지금까지 텍스트에 나타나는지 여부에 따라 대답을 다르게 한다.
    • frequency_penalty : -2~2 사이의 숫자이며, 양수로 갈수록 빈도를 기준으로 새로운 토큰에 페널티를 줘 동일한 행 생성을 막는다.
    • logit_bias : -100~100 사이의 값에 매핑한 json 개체를 이용해 지정된 값에 따른 토큰이 나타날 가능서을 수정한다.
    • user : user 를 입력해 openai 에서 로그를 수집해 피드백을 줄 수 있게 허가해준다.
  • Message received 0.10 seconds after request: { "role": "assistant" }
  • Message received 0.10 seconds after request: { "content": "\\n\\n" }
  • Message received 0.10 seconds after request: { "content": "1" }
  • Message received 0.11 seconds after request: { "content": "," }
  • Message received 0.12 seconds after request: { "content": " " }
  • Message received 0.13 seconds after request: { "content": "2" }
  • ...
  • Message received 0.13 seconds after request: { "content": "100" }
반응형
반응형

MSI 윈도우 설치 시 드라이버를 모르고 삭제했을 경우 MSI 공식 홈페이지에서 다운을 받아야한다. 

 

하지만, 드라이버가 왠만한거는 다 안되므로 어떻게 구글링 하다가 메디텍에서 만든 드라이버를 구했더니 설치가 완료되었다.

 

나같은 사람이 또 없기를 바라며 포스팅 한다.

meditek_wlan_ 3.00.01.1239.zip
2.22MB

반응형

'Day Life' 카테고리의 다른 글

2023 회고  (1) 2023.12.31
2022/08/06  (0) 2022.08.06
21.08.13  (0) 2021.08.13
실버 달성  (0) 2021.04.27
HI  (0) 2021.04.21
반응형

Layout.tsx

import React, {FC} from "react";
import {Stack, Flex, Box, Text, Button} from '@chakra-ui/react';
import { Link } from "react-router-dom";

const Layout: FC = ({children}) =>{
    return( 
    
    <Stack h="100vh">
        <Flex bg="purple.200" p={4} justifyContent="space-around" alignItems="center">
            <Box>
                <Text fontWeight="bold">h662-Animals</Text>
            </Box>
            <Link to="/">
                <Button size="sm" colorScheme="blue">
                    Main
                </Button>
            </Link>
            <Link to="my-animal">
                <Button size="sm" colorScheme="red">
                    My Animal
                </Button>
            </Link>
            <Link to="sale-animal">
                <Button size="sm" colorScheme="green">
                    Sale Animal
                </Button>
            </Link>
        </Flex>
        <Flex direction="column" h="full" justifyContent="center" alignItems="center">
            {children}
        </Flex>
    </Stack>
    );
}

export default Layout

 

MyAnimalCard.tsx

 

import React , {FC, useState, ChangeEvent} from "react";
import {Box, Text, InputGroup, Input, InputRightAddon, Button} from "@chakra-ui/react"
import AnimalCard from "./AnimalCard";
import { saleAnimalTokenContract, web3 } from "../contracts";

export interface IMyanimalCard{
    animalTokenId : string;
    animalType : string;
    animalPrice : string;
}

interface MyAnimalCardProps extends IMyanimalCard {
    saleStatus:boolean;
    account:string;
}

const MyAnimalCard: FC<MyAnimalCardProps> = ({animalTokenId, animalType, animalPrice, saleStatus, account}) =>{
    const [sellPrice, setSellPrice] = useState<string>("");
    const [myAnimalPrice, setMyAnimalPrice] = useState<string>(animalPrice)

    const onChangeSellPrice = (e: ChangeEvent<HTMLInputElement>) =>{
        setSellPrice(e.target.value);
    }

    const onClickSell = async () =>{
        try{
            if(!account || !saleStatus) return;

            const response = await saleAnimalTokenContract.methods
            .setForSaleAnimalToken(animalTokenId, web3.utils.toWei(sellPrice, "ether"))
            .send({from:account});

            if(response.status) {
                setMyAnimalPrice(web3.utils.toWei(sellPrice, "ether"));
                console.log(response)
            }
        }catch(err){
            console.log(err);
        }
    }

    return(
        <Box textAlign="center" w={150}>
            <AnimalCard animalType={animalType} /><Box  mt={2}>
                {animalPrice === "0" ? (
                <>
                    <InputGroup>
                        <Input type='number' value={sellPrice} onChange={onChangeSellPrice}/>
                        <InputRightAddon children="Matic" />
                    </InputGroup>
                    <Button size="sm" colorScheme="green" mt={2} onClick={onClickSell}>
                        Sell
                    </Button>
                </>) : <Text d="inline-block">{web3.utils.fromWei(myAnimalPrice)} Matic</Text> }
            </Box>
        </Box>
    )
}

export default MyAnimalCard;

함수 설명

  1. onChangeSellPrice = (e: ChangeEvent<HTMLInputElement>)
    • Input 박스 내의 요소가 바뀔때마다 price 를 바꿔준다.
  2. onClickSell
    • 토큰을 판매 등록하는 함수

SaleAnimalCard.tsx

import React, {FC, useState, useEffect} from "react";
import AnimalCard from "./AnimalCard";
import {Box, Text, Button} from "@chakra-ui/react"
import { mintAnimalTokenContract, saleAnimalTokenContract, web3 } from "../contracts";

interface SaleAnimalCardProps{
    animalType:string;
    animalPrice:string;
    animalTokenId: string;
    account:string;
    getOnSaleAnimalTokens: () => Promise<void>;
}

const SaleAnimalCard:FC<SaleAnimalCardProps> =({animalType,animalPrice,animalTokenId, account,getOnSaleAnimalTokens}) =>{
    const [isBuyable, setIsBuyable] = useState<boolean>(false);

    const getAnimalTokenOwner = async () => {
        try{
            const response = await mintAnimalTokenContract.methods.ownerOf(animalTokenId).call();
            
            console.log(response)
            console.log(account);
            setIsBuyable(response.toLocaleLowerCase() === account.toLocaleLowerCase())
        } catch(err){
            console.log(err);
        }   
    } 

    const onClickBuy = async () =>{
        try{
            if(!account) return;
            const response = await saleAnimalTokenContract.methods.purchaseAnimalToken(animalTokenId).send({from: account, value:animalPrice});

            if(response.status){
                getOnSaleAnimalTokens();
            }
        } catch(err){
            console.log(err)
        }
    }

    useEffect(() => {
      
        getAnimalTokenOwner();
    }, [])
    

    return(
        <Box textAlign ="center" w={100}>
            <AnimalCard animalType={animalType} />
            <Box>
                <Text d="inline-block">
                    {web3.utils.fromWei(animalPrice)} Matic
                </Text>
                <Button size="sm" colorScheme="green" m={2} disabled={isBuyable} onClick={onClickBuy}>Buy</Button>
            </Box>
        </Box>
    )
}

export default SaleAnimalCard
반응형

+ Recent posts