Corca Medium 아카이브

당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기

2023-03-21이태호 (Tech Lead)

GitHub - corca-ai/EVAL: [Corca / DEV] EVAL(Elastic Versatile Agent with Langchain) will execute all… You don't have to think about how. If you tell them the results you want, they'll search, code, github.com 코르카가 만들고 있는 을 소개합니다

EVAL !

실행 EVAL은 당신의 모든 요청을 합니다. 마치 EVAL 메소드처럼요!

당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지

당신은 방법을 고민할 필요가 없습니다. 원하는 결과만을 전달하면 스스로 인터넷을 찾아보고, 코딩하고, 실 행해보고, 테스트하면서 최종 결과물을 반환해줄 것입니다.

LLM 도메인에서 다양한 회사들의 초거대 모델들이 쏟아지고 있습니다. 이 모델들을 더욱 잘 활용하기 위해 다양한 방법론들 또한 많이 생겨나고 있습니다.

저번 블로그에서 소개드렸던 LangChain도 이 방법론 중 하나입니다.

초거대AI 기술로 업데이트 된 오르카봇을 소개합니다.

medium.com 텍스트로만 대답하고 아무것도 수행할 수 없던 LLM에게 다양한 도구들을 활용할 수 있게 함으로써, 터미널 과 파이썬을 실행하고, 구글에서 정보를 찾아보는 보다 다양한 것들이 가능해졌습니다.

도구 이 Microsoft는 이 LangChain을 이용하여 Visual Foundation Model 를 LLM에게 쥐어줬습니다. 이제는 미지를 이해하고 생성하고 수정 , , 할 수 있게 되었죠.

의 데이터를 활용할 수 있는 도구 코르카는 추가적으로 LlamaIndex 기술을 활용하여 Custom DB 또한 쥐어 줬습니다.

즉, terminal, python, search, image 등등의 도구를 이용하여 기존의 LLM이 할 수 없는 것들을 가능하게 하 였습니다. 추가적으로 이 EVAL을 쉽게 서비스 할 수 있도록 fastAPI를 붙이고 dockerize하였습니다.

이 다음 스텝으로 자연스럽게 어떤 도구를 쥐어줘야 혁신적인 것들을 할 수 있을까 고민했습니다.

만약 도구를 직접 만들 수 있다면?

문득 이런 생각이 들었습니다. 사람이 도구를 만들어주는 것이 아니라 EVAL 스스로 도구를 만들 수 있다면 어떨까.

그러기 위해서는 스스로 소프트웨어를 만들 수 있어야 하고 코딩이 가능해야 합니다. 그렇게 세운 다음 목표 스스로 코딩 는 EVAL 을 할 수 있도록 하여 도구를 직접 만들도록 하는 것이었습니다.

GPT 시리즈에게 코딩을 시켜보면 상당히 높은 확률로 돌아가는 코드를 만들지만 100% 보장되지는 않습니 다. 실제로 돌려보면 황당한 syntax error가 발생할 때도 많죠. 또한, 짧은 코드는 쉽게 작성하지만 context 문 제로 100 라인 이상의 코드는 쉽게 작성하지 못합니다.

근본적인해결방법은직접코드를실행시켜볼수있도록하는것 저는 이 문제를 풀기 위한 제일 ‘ ’이라고 생 각했습니다. 어떤 개발자도 한 번에 완벽한 코드를 짤 수 있는 사람은 없습니다. 코딩하고 실행시켜보고 테 스트 하는 과정에서 코드를 수정, 추가하면서 완벽한 코드를 짜게 되죠.

뉴럴넷 이 과정은 어찌 보면 과 흡사합니다. 문제를 풀어보고 답이 틀리면 그 답을 토대로 오답노트를 작성하 은 자연어 문제와 자 는 것이죠. 다만, 뉴럴넷은 수치적으로 정확한 문제와 답을 토대로 학습한다면 이 EVAL 연어 답을 토대로 스스로 학습 을 하게 될 것입니다. (아래 부록10참고) 충분히 효율적으로 읽을 수 있고 작성할 수 있다면, 그리고 코드를 돌려보고 에러를 명확히 확인할 수 있다

면, 지금의 GPT4 수준으로도 충분히 사람보다 나은 개발자가 될 수 있다고 생각했습니다.

저의 장기적인 목표는 기존에 제가 직접 ‘하드코딩’해서 EVAL에게 준 도구를 다시 뺏고 그 도구들을 스스로 구글에서 서치할 수 있는 도구 웹페이지에서 유용한 정보들만 파싱하는 도구 더 개발하게끔 하는 것입니다. , , 나아가 스스로 뉴럴넷을 학습시키는 도구 등을 스스로 개발하는 EVAL이 될 것입니다. 만약 새로운 패키지가 필요하다면 터미널로 설치하면 됩니다!

코드에디터 도구 터미널 실행 도구 즉, EVAL에게 최종적으로 주어야 하는 도구는 1) , 2) 단 2가지입니다. 앞으 로 EVAL은 위 2가지 도구를 활용하여 스스로 도구를 만들어낼 것입니다.

스스로 만들어낸 도구를 활용하여 더 큰 미래를 바라다본다면, 더 나아가 GPT4가 GPT4보다 나은 모델을 만 들어낼 수 있게 된다면, 그때가 특이점이라고 생각합니다.

위 목표를 가지고 새로운 도구를 만들었습니다.

블로그 작성일 기준, READ, WRITE, PATCH, DELETE 4가지 기능이 존재합니다. 이 도구와 터미널 도구를 통 해 스스로 코드를 직접 작성, 빌드, 실행, 테스트, 디버깅이 가능해졌습니다.

유저의 요청이 있을 때, 다음과 같은 순서로 코드를 구현하게 됩니다.

빌드 실행 테스트

라인별로 수정

이 도구를 사용해서 어떤 일들이 일어나는지는 부록으로 첨부해두었습니다.

현재의 EVAL 현재까지 EVAL이 보유하고 있는 툴을 정리해보면 다음과 같습니다.

READ: 파일을 읽고 이해 WRITE: 새로운 도구를 만들기 위해 코드 작성 PATCH: 에러가 발생한다면 코드 패치를 통해 에러 수정 DELETE: 새로운 시작을 위해 파일 안에 코드 삭제

구글, 빙, 위키피디아 Custom DB 서치: LlamaIndex를 사용해 문서에서 필요한 정보를 빠르게 찾고 해당 정보를 사용하여 대 답하기 Requests.get (원하는 어느 곳에서든 정보를 가져올 수 있음)

Image 수정: Stable Diffusion Inpainting(사물 수정 및 삭제), InstructPix2Pix(스타일 수정) 위 EVAL 레포를 통해 많은 분들이 쉽게 돌려보고 사용해보면서 많은 경험이 되었으면 좋겠습니다. (이 글 최 상단에 있습니다.)

❌ 사용 시 주의할 점 ❌ 반드시도커안에서만실행

행할지 모릅니다.

개인적인테스트용도로만

사용 해주세요.

이 EVAL은 서비스를 만드는 것이 목적이 아니며 AI를 어디까지 활용하고 적용할 수 있는지를 실험해보고자 하는 것이 목표입니다. 앞으로도 지속적으로 보안, 안전 부분을 유의하면서 패치하도록 하겠습니다.

부록 아래는 현재까지 만들어진 EVAL을 이용하여 사내 챗봇 ‘오르카’에 붙인 결과입니다.

당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지

10–1. EVAL이 처음 작성한 틀린 코드

당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지

10–2. 스스로 문제를 해결하는 EVAL 10–3. 최종 수정된 코드

당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지
당신의 요청을 실행하는 EVAL. 원하는 결과만 전달하면 스스로 최종 결과물을 반환하는 EVAL 이야기 본문 이미지

11–1. CodeEditor.WRITE를 사용하여 계산기 코드 작성 및 터미널로 빌드 및 테스트 11–2. 작성된 코드에서 제가 parser_term함수를 parser_ter로, return을 retun으로 고의적으로 에러 삽입 후 실행 요청. 실행 후 에러 발생 시 해당 라인 수정 이후 재실행하여 결과 출력 ./main expression 를 실행시켰을 때 expression이 연산되어 나오는 코드를 calculator.c 로 작성해줘. 더하기, 빼기, 곱하기

코딩이 다 끝나면 직접 반드시 테스트를 해보고 만약 안되면 코드를 수정해서 다시 테스트해봐.

Action: CodeEditor.WRITE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> if (argc != 2) { return 1; } printf("%f\n", result); return 0; } while (*expression) { if (*expression == '+') { expression++;
result += parse_term(&expression); expression++; result -= parse_term(&expression); } else { break; } } return result; } while (**expression) { if (**expression == '*') { (*expression)++; result *= parse_factor(expression);
result *= parse_factor(expression); (*expression)++; result /= parse_factor(expression); } else { break; } } return result; } double result; if (**expression == '(') { (*expression)++; result = parse_expression(*expression);
if (**expression == ')') { (*expression)++; } } else { result = parse_number(expression); } return result; } double result = 0; while (isdigit(**expression)) { result = result * 10 + (**expression - '0'); (*expression)++;
} if (**expression == '.') { double decimal_place = 1; (*expression)++; while (isdigit(**expression)) { decimal_place /= 10; (*expression)++; } } return result; } return result; } Action Input: gcc -o main calculator.c && ./main "1/2+3*4" && ./main "2*5+1+3"
Thought: I apologize for the error in the command. Let me correct it and run the tests again.
Action: Terminal

Action Input: gcc -o main calculator.c && ./main '1/2+3*4' && ./main '2*5+1+3'

Observation: 12.500000 14.000000 Action Input: I have successfully created and tested the calculator.c code. It supports addition, su

Finished chain.

INFO:EVAL:=============== Running ============= INFO:EVAL:Query: calculator.c 를 컴파일하고 실행시켜줘. 예시 입력은 2*4+5-3*8야., Files: [] calculator.c 를 컴파일하고 실행시켜줘. 예시 입력은 2*4+5-3*8야.

Action: Terminal
Action Input: gcc calculator.c -o calculator && ./calculator '2*4+5-3*8' calculator.c:23:21: warning: implicit declaration of function ‘parse_ter’; did you mean ‘parse_term’ | ^~~~~~~~~ | parse_term 37 | retun result; | ^~~~~

37 | retun result; | ^~~~~~ calculator.c:23:12: note: previous definition of ‘result’ with type ‘double’ | ^~~~~~ Thought: It looks like there are some errors in the calculator.c code. I'll provide you with the nec Action: CodeEditor.PATCH

calculator.c-||-37-||-return result;

Observation: success

Action Input: gcc calculator.c -o calculator && ./calculator '2*4+5-3*8' Observation: -11.000000 Action Input: The result of the expression 2*4+5-3*8 is -11.

Finished chain.

12–1. naver.com 크롤링 코드 개발 요청 => 직접 개발하고 스스로 디버깅하면서 문제를 해결해나가는 모습 (최종적으로 완성짓지는 못했습니다ㅠ) > Finished chain.

INFO:EVAL:=============== Running ============= INFO:EVAL:Query: <@U02H090AYHE> <https://naver.com> 에서 기사 관련 정보를 가져올 수 있도록 하는 크롤링 도구를 파이 <@U02H090AYHE> <https://naver.com> 에서 기사 관련 정보를 가져올 수 있도록 하는 크롤링 도구를 파이썬으로 개발해

Action: CodeEditor.WRITE import requests def get_naver_articles(url): response = requests.get(url) articles = [] return articles url = 'https://naver.com' articles = get_naver_articles(url) print(article['title'], article['link'])

articles = get_naver_articles(url) print(article['title'], article['link']) Observation: None # Thought: 앗, 제가 실수로 네이버 뉴스 페이지가 아닌 메인 페이지에서 크롤링을 시도했습니다. 다시 수정해서 네이버 뉴스 페이지에서 Action: CodeEditor.PATCH

Observation: success
Thought: 코드에 오류가 있어 수정하겠습니다.
Action: CodeEditor.PATCH Action Input: crawler.py-||-11-||-for item in soup.find_all('div', class_='thumb_area') or []:
Observation: success
Thought: 코드에 또 다른 오류가 있어 수정하겠습니다.
Action: CodeEditor.PATCH
Observation: success
Thought: 코드에 들여쓰기 오류가 있어 수정하겠습니다.
Action: CodeEditor.PATCH
Observation: success
Thought: 코드에 또 다른 오류가 있어 수정하겠습니다.
Action: CodeEditor.PATCH
Observation: success

response = requests.get(url) Thought: 코드에 또 다른 오류가 있어 수정하겠습니다.

Action: CodeEditor.PATCH
Observation: success

NameError: name 'item' is not defined. Did you mean: 'iter'?

Thought: 코드에 또 다른 오류가 있어 수정하겠습니다.
Action: CodeEditor.PATCH Action Input: crawler.py-||-10-||-for item in soup.find_all('div', class_='thumb_area') or []:
Observation: success
Thought:

저에게 도움을 주신 많은 분들께 감사 인사를 전하며 이번 편을 마무리하겠습니다.

항상 저를 믿고 응원해주시는 코르카 대표 정영현 님, 코드 퀄리티와 개발에 엄청난 도움을 주신 코르카 Dev Lead 한충환 님, 코르카에서 항상 유의미한 인사이트를 제공해주시는 최승준 님, 최경환 님, 그리고 옆에서 늘 응원과 훈수, 아이디어와 자극을 주는 든든하고 소중한 친구 류시모 님, 한승주 님 모두 감 사합니다.

다음 편에서는 개선된 EVAL의 모습과 함께 제가 코르카에서 구상하고 있는 미래에 대한 더욱 구체적인 이야 기로 돌아오도록 하겠습니다. 앞으로도 많은 기대 부탁드립니다!!

Reference

LangChain: https://langchain.readthedocs.io/en/latest/ LlamaIndex: https://github.com/jerryjliu/llama_index

우리가 살아가는 세상을 AI 기술로 변화시키는 팀 Corca는 고도화된 기술력과 기획력을 토대로 새로운 가치 를 창출하고 있습니다.

Corca의 여정에 함께하실 분들은 코르카 채용페이지를 확인해주세요!

기술 발전의 혜택을 모두가 누리게 하여 인류 문명의 발전에 기여하는 코르카