paint-brush
코드 생성을 통한 챗봇 개선: 출판물을 위한 상황 인식 챗봇 구축~에 의해@shanglun
1,178 판독값
1,178 판독값

코드 생성을 통한 챗봇 개선: 출판물을 위한 상황 인식 챗봇 구축

~에 의해 Shanglun Wang19m2023/11/05
Read on Terminal Reader

너무 오래; 읽다

GPT 기반 시스템은 지식 관리에 큰 효과를 거두기 위해 사용되었지만 현재의 최첨단 구현은 메타데이터 기반 검색 기능이 제한되어 있습니다. 오늘날 우리는 의미론적 검색과 메타데이터 검색을 모두 수행할 수 있는 시스템을 구축하여 검색 증강 생성 시스템의 기능을 크게 향상시켰습니다.
featured image - 코드 생성을 통한 챗봇 개선: 출판물을 위한 상황 인식 챗봇 구축
Shanglun Wang HackerNoon profile picture

소개

ChatGPT가 2023년 초 대중의 상상력을 사로잡은 이후 대규모 언어 모델 기반 애플리케이션의 상용화에 대한 관심이 폭발적으로 증가했습니다. 가장 흥미로운 응용 프로그램 중 하나는 독점 지식 기반 데이터베이스에서 자연어 쿼리에 응답할 수 있는 전문가 채팅 시스템을 만드는 것입니다.


이 분야에서 가장 인기 있는 기술 중 하나는 [검색 증강 생성](https://retrieval Augmented Generation aws) 또는 RAG입니다. RAG는 대규모 언어 모델을 사용하여 생성하기 전에 문서 임베딩을 사용하여 사용자 쿼리와 관련된 항목을 찾습니다. 답변.


이 기술은 매우 저렴하고 빠른 조회를 허용하고, 지식 기반이 시간이 지남에 따라 변경 및 발전할 수 있는 극도의 유연성을 제공하며, 환각과 실수를 크게 줄이는 정보에 기초하고 정확한 답변을 제공하므로 매우 강력합니다.


RAG 시스템에 대한 보다 심층적인 분석과 이를 구현하는 방법을 알아보려면 여기에서 이전 기사를 읽어보세요.


RAG 시스템은 강력하지만 아키텍처에는 몇 가지 심각한 제한 사항이 있습니다. 이전 기사에서 몇 가지 제한 사항을 살펴보고 아키텍처를 개선할 수 있는 방법을 제안했습니다.


오늘은 임베딩 기반 아키텍처의 또 다른 한계를 탐구하고, 아키텍처의 한계를 극복할 수 있는 방법을 제안하겠습니다.

문제 설명

임베딩 기반 RAG의 한계

우리가 독자와 고객이 질문할 수 있는 채팅 인터페이스를 만들고자 하는 출판물이라고 가정해 보겠습니다.


물론 “X에 대한 당신의 의견은 어떻습니까?”와 같은 질문에 대답할 수 있을 것입니다. 또는 “Y에 대해 뭐라고 말했어요?” 간단한 RAG 구현을 사용하지만 RAG 아키텍처는 "2021년 X에 대해 뭐라고 말하셨나요?"와 같은 질문을 처리할 때 실제로 어려움을 겪기 시작합니다. 또는 "2021년부터 2023년 사이에 Y에 대한 보장이 어떻게 변경되었나요?"


임베딩 기반 RAG의 과제 중 하나는 임베딩 모델이 일반적으로 메타데이터를 체계적인 방식으로 인코딩할 수 없다는 것입니다. 따라서 출판 날짜나 저자 이름과 같은 정보가 필요한 조회는 RAG 시스템에 상당한 문제를 일으킬 수 있습니다. .


우리는 대규모 언어 모델의 가장 흥미로운 기능 중 하나인 코드 생성을 활용하여 이 문제를 해결할 수 있습니다. 실제 출판물을 살펴보고, RAG 아키텍처를 개선하는 LLM 기반 알고리즘을 설계하고, 알고리즘을 기반으로 챗봇을 구축해 보겠습니다.

비즈니스 문제

오늘은 스타트업과 기술을 다루는 인기 일간 뉴스레터인 CB Insights Newsletter를 살펴보겠습니다. 전 CB Insights의 풀스택 개발자로서 저는 업무가 끝나면 창업자의 독특한 브랜드 재치와 통찰력을 자주 기대했습니다.


오늘 우리는 CB Insights 뉴스레터 아카이브를 기본 데이터로 사용하여 바닐라 임베딩 기반 RAG 구현보다 우수한 방식으로 메타데이터 기반 자연어 쿼리에 응답할 수 있는 챗봇을 구축할 것입니다.


특히 우리는 챗봇이 다음과 같은 질문에 답할 수 있기를 원합니다.


  • 2020년 Uber에 대해 어떻게 말씀하셨나요?


  • 2016년부터 2019년까지 에어비앤비의 운명은 어떻게 변했나요?


  • 2020년대 인도에서 주목할만한 유니콘 스타트업은 어떤 것들이 있나요?


시작해 봅시다!

사용된 기술

이 작업을 수행하기 위해 우리는 다음 기술을 사용합니다.

파이썬

내 다른 기사를 팔로우했다면 이 기사의 대부분의 코드에 Python을 사용하게 될 것이라는 사실은 놀랄 일이 아닙니다. Python에는 뛰어난 웹 스크래핑, 데이터 처리 및 OpenAI 통합 기능이 있으며, 오늘 프로젝트에서 이 모든 기능을 활용할 것입니다.

SQL

SQL은 사용자가 SQLite, MySQL, PostgreSQL 및 SQL Server를 포함한 여러 주요 관계형 데이터베이스와 상호 작용할 수 있게 해주는 쿼리 언어입니다. 언어는 데이터를 사용자에게 반환하기 전에 데이터를 검색, 결합 및 조작하는 방법에 대한 데이터베이스 지침 세트입니다.

LLM 코드 생성

LLM 코드 생성은 GPT 3.5, GPT 4 및 LLaMa 2를 포함한 여러 기본 모델이 자연어 쿼리에 응답하여 놀라울 정도로 복잡한 코드를 생성하는 기능을 입증했기 때문에 지난 몇 달 동안 광범위한 관심을 받은 기술입니다.


GitHub의 Copilot과 같이 특별히 훈련되고 조정된 시스템은 코드 생성을 위해 특별히 설계된 모델을 사용하여 매우 지능적인 코드를 작성할 수 있지만 적절하게 프롬프트된 범용 GPT 모델은 코드 작성과 관련하여 이미 탁월한 기능을 갖추고 있습니다.

의미론적 임베딩

시맨틱 임베딩은 대부분의 RAG 구현의 중추입니다. 일련의 자연어 기술을 사용하여 자연어 텍스트를 의미론적 벡터 공간 내에서 텍스트의 내용을 나타내는 숫자 벡터로 바꿀 수 있습니다.


그런 다음 벡터 대수학을 사용하여 이러한 임베딩을 조작할 수 있으므로 수학적 방법을 사용하여 두 텍스트 말뭉치 간의 관계를 결정할 수 있습니다.

GPT-3.5 및 GPT-4

1조 7천억 개의 매개변수를 갖춘 GPT-4는 오늘날 시장에서 사용할 수 있는 가장 강력한 변환기 기반 대형 언어 모델입니다. GPT-4는 대규모 텍스트 본문, 복잡한 추론, 어려운 프롬프트에 대한 긴 설득력 있는 답변 생성을 이해할 수 있습니다.


GPT-4의 훨씬 작은 사촌인 GPT-3.5는 ChatGPT가 전 세계를 강타했을 때 이를 지원한 모델입니다. 엄청나게 복잡한 프롬프트를 처리할 수 있으며, 순수한 추론 능력이 부족한 점을 속도와 비용 절감 측면에서 보완합니다.


더 간단한 작업을 위해 GPT3.5는 성능과 정확성 사이의 균형을 유지합니다.

Chatbot 백엔드 설정

데이터베이스 설정

AI를 구축하기 전에 데이터를 가져와야 합니다. 이를 위해 지난 뉴스레터 모음이 있는 CB Insights의 뉴스레터 아카이브 페이지[ https://www.cbinsights.com/newsletter/ ]를 사용할 수 있습니다.


모든 링크를 얻으려면 다음과 같이 Python의 요청과 아름다운 수프 라이브러리를 사용할 수 있습니다.

 import requests from bs4 import BeautifulSoup res = requests.get('https://www.cbinsights.com/newsletter/') soup = BeautifulSoup(res.text) article_links = [[i.text, i['href']] for i in soup.find_all('a') if 'campaign-archive' in i['href'] ]


링크가 있으면 각 링크로 이동하여 기사 HTML을 다운로드할 수 있습니다. Python의 목록 이해 기능을 사용하면 이 작업을 한 줄로 수행할 수 있습니다.


 article_soups = [BeautifulSoup(requests.get(link[1]).text) for link in article_links]


이 작업은 시간이 좀 걸리지만 결국에는 모든 링크가 삭제됩니다.


이제 BeautifulSoup을 사용하여 관련 섹션을 추출할 수 있습니다.


 import re # SEO optimizations cause some articles to appear twice so we dedupe them. # We also remove some multiple newlines and unicode characters. def get_deduped_article_tables(article_table): new_article_tables = [] for i in article_table: text_content = re.sub(r'\n{2,}', '\n', i.replace('\xa0', '').strip()) if text_content not in new_article_tables or text_content == '': new_article_tables.append(text_content) return new_article_tables result_json = {} for soup_meta, soup_art in zip(article_links, article_soups): article_tables = [] cur_article = [] for table in soup_art.find_all('table'): if table.attrs.get('mc:variant') == 'Section_Divider': article_tables.append(get_deduped_article_tables(cur_article)) cur_article = [] else: cur_article.append(table.text) article_tables.append(get_deduped_article_tables(cur_article)) result_json[soup_meta[0]] = article_tables


좀 더 처리를 수행하고 이를 DataFrame으로 변환해 보겠습니다.


 import pandas as pd result_rows = [] for article_name, article_json in result_json.items(): article_date = article_json[0][1] for idx, tbl in enumerate(article_json[1:]): txt = '\n'.join(tbl).strip() if txt != '': result_rows.append({ 'article_name': article_name, 'article_date': article_date, 'idx': idx, 'text': txt, }) df = apd.DataFrame(result_rows)


데이터프레임을 검사하면 아래와 같은 내용이 표시됩니다.



데이터가 있는 동안 기사에 대한 임베딩도 생성해 보겠습니다. OpenAI의 ada 임베딩 모델을 사용하면 이는 매우 쉽습니다.


 import openai EMBEDDING_MODEL = "text-embedding-ada-002" openai.api_key = [YOUR KEY] df['embedding'] = df['text'].map(lambda txt: openai.Embedding.create(model=EMBEDDING_MODEL, input=[txt])['data'][0]['embedding'])


이제 이 연습에 사용할 데이터가 있으므로 해당 데이터를 데이터베이스에 로드해 보겠습니다. 이 연습에서는 Python과 함께 패키지로 제공되는 경량의 독립형 데이터베이스 시스템인 SQLite를 사용합니다.


프로덕션 환경에서는 여기에서 사용하는 SQL을 약간 수정하여 MySQL 또는 PostgreSQL과 같은 적절한 데이터베이스 인스턴스를 사용하고 싶을 수도 있지만 일반적인 기술은 동일하게 유지됩니다.


데이터베이스를 인스턴스화하고 로드하려면 Python에서 다음을 실행하면 됩니다. 기사 텍스트와 임베딩 외에도 게시 날짜와 같은 일부 메타데이터도 저장하고 있습니다.


또한 대부분의 다른 SQL 데이터베이스와 달리 SQLite3은 동적 입력 시스템을 사용하므로 생성 쿼리에서 데이터 유형을 지정할 필요가 없습니다.


 import sqlite3 import json con = sqlite3.connect("./cbi_article.db") cur = con.cursor() cur.execute("CREATE TABLE article(name, date, idx, content, embedding_json)") con.commit() rows = [] for _, row in df.iterrows(): rows.append([row['article_name'], row['article_date'], row['idx'], row['text'], json.dumps(row['embedding'])]) cur.executemany("INSERT INTO article VALUES (?, ?, ?, ?, ?)", rows) con.commit()


그리고 데이터를 쿼리해 보겠습니다.


 res = cur.execute(""" SELECT name, date, idx FROM article WHERE date >= DATE('now', '-2 years'); """) res.fetchall()


다음과 같은 결과가 나와야 합니다.




꽤 좋아 보인다!


메타데이터 조회를 위한 코드 생성기 구축

이제 SQLite 데이터베이스에 데이터가 로드되었으므로 다음 단계로 넘어갈 수 있습니다. 임베딩 전용 RAG 구현의 과제 중 하나는 유연한 메타데이터 조회 기능이 부족하다는 점을 기억하세요.


그러나 이제 SQL 데이터베이스에 메타데이터가 로드되었으므로 GPT의 코드 생성 기능을 사용하여 유연한 메타데이터 조회를 수행할 수 있습니다.


SQL 코드를 생성하기 위해 몇 가지 간단한 프롬프트 엔지니어링을 사용할 수 있습니다.


 response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] )


다음 프롬프트 엔지니어링 1) 데이터베이스 스키마를 제공하지만 단순하게 유지합니다. 2) 반환 열을 지정합니다. 3) 필터링 가능한 컬럼을 지정합니다. 4) SQL 플레이버를 지정합니다. 이 프롬프트는 아래와 같은 SQL 코드를 생성해야 합니다.


 SELECT * FROM article WHERE date BETWEEN '2022-06-01' AND '2022-08-31'


이제 반환 값이 결정적이지 않기 때문에 생성된 코드에서 특이성이 발생하는 경우가 있습니다. 이러한 조건을 처리하려면 try-catch 루프를 사용하여 데이터를 재생성하면 됩니다. 물론 우리는 이 작업을 무한정 수행하고 싶지 않으므로 세 번 시도해서 적절한 SQL을 생성할 수 없으면 그냥 종료하고 바닐라 RAG로 돌아갈 것입니다.


다음과 같이 필터를 구현할 수 있습니다.


 res = [] for i in range(3): response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] ) generated_query = response.choices[0].message['content'] is_query_safe = True for no_use_word in {'DELETE', 'UPDATE', 'DROP'}: if no_use_word in generated_query.upper(): is_query_safe = False if not is_query_safe: break # the user input is likely malicious. Try to answer the question with vanilla RAG res = cur.execute(generated_query).fetchall() if len(res) > 0: break if len(res) == 0: # vanilla RAG in memory. Use a vector DB in production please. res = cur.execute('''SELECT * FROM articles''').fetchall()


이는 상대적으로 조잡한 필터이므로 프로덕션 사용 사례에서는 관련성과 SQL 정확성에 대해 더 많은 검사를 실행하고 싶을 수도 있지만 이 예에서는 이것으로 충분합니다.


AI 보안에 대한 간단한 참고 사항은 AI에서 반환된 코드를 실행할 때 특히 사용자 입력이 프롬프트의 일부로 사용된 경우 주의해야 합니다.


출력을 삭제하지 않으면 사용자가 AI를 조작하여 업데이트 또는 삭제 문을 생성하려고 시도하는 프롬프트 엔지니어링 공격에 취약해집니다.


따라서 컴퓨터에서 코드를 실행하기 전에 출력이 예상한 대로인지 항상 확인해야 합니다.


검색된 결과를 보려면 다음 코드를 실행하세요.


 df = pd.DataFrame([{c[0]: v for c, v in zip(cur.description, row)} for row in res])


이제 다음과 같은 결과가 표시됩니다.



결과로 표준 RAG 실행

이제 메타데이터 조회 결과가 나왔으므로 나머지는 간단합니다. 검색된 모든 결과에 대해 다음과 같이 코사인 유사성을 계산합니다.


 from openai.embeddings_utils import cosine_similarity q_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding'] df['cosine_similarity'] = df['embedding_json'].map(lambda js: cosine_similarity(json.loads(js), q_embed))


이제 우리는 상위 10개 뉴스레터를 선택하고 프롬프트 엔지니어링을 사용하여 질문에 답할 수 있습니다. 여기서는 각 뉴스레터 발췌 내용이 상대적으로 짧기 때문에 10개를 선택했습니다.


긴 기사로 작업하는 경우 잠재적으로 더 적은 수의 기사를 사용하거나 보너스 섹션에서 다루는 기술을 사용하는 것이 좋습니다.


 answer_prompt = ''' Consider the following newsletter excerpts from the following dates: ''' for _, row in df.sort_values('cosine_similarity', ascending=False).iloc[:10].iterrows(): answer_prompt += """ ======= Date: %s ==== %s ===================== """ % (row['date'], row['content']) answer_prompt += """ Answer the following question: %s """ % user_question response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a tech analyst that can summarize the content of newsletters"}, {"role": "user", "content": answer_prompt}, ] )


그러면 다음과 비슷한 결과가 나타납니다.


핀테크의 미래는 2022년 여름에 다양한 뉴스레터에서 논의되었습니다. 2022년 2분기 자금이 2021년 최고치 이후 2020년 수준으로 급락하면서 핀테크 분야에서 눈에 띄는 둔화가 있었습니다. 2022년 2분기 보고서는 글로벌 핀테크 투자의 감소를 강조했습니다. .


그러나 특히 결제 분야에서 초기 단계 스타트업을 향한 상당한 변화가 주목되면서 핀테크의 미래는 유망해 보였습니다. 결제 부문의 전 세계 투자는 2021년 정점 이후 자금이 정상으로 복귀함에 따라 2022년 1분기에서 2분기 51억 달러로 43% 감소했습니다.


이 영역의 신규 진입자는 2022년 현재까지 더 높은 거래 비중(63%)을 유치하여 스타트업에 대한 투자자의 관심을 나타냈습니다. 또한 핀테크가 소매 은행에 경쟁을 심화시켜 핵심 서비스의 디지털화를 우선시하도록 강요하고 있다는 보고도 있습니다.


은행 부문은 챗봇 및 고객 분석 플랫폼과 같은 기술을 사용하여 고객 경험 향상, 특히 모바일 뱅킹에 중점을 두는 방식으로 대응했습니다. 이 모든 것은 앞으로 활기차고 경쟁적인 핀테크 산업이 펼쳐질 것임을 시사합니다.


꽤 좋은데요! 답변 프롬프트를 보고 답변의 사실 여부를 확인하면 통계가 모두 원본 자료에서 나온 것임을 알 수 있습니다. 또한 GPT4가 무시할 수 있었던 소스 자료에 몇 가지 특이한 형식이 있음을 알 수 있습니다. 이는 데이터 요약 시스템에서 LLM의 유연성을 보여줍니다.

보너스: 요약 미들웨어

이 과정에서 발생할 수 있는 문제 중 하나는 말뭉치가 매우 크면 최종 프롬프트도 매우 커질 수 있다는 것입니다. GPT-4를 사용하는 경우 비용이 많이 들 수 있지만 프롬프트가 너무 길면 모델을 혼동할 수도 있습니다.


이 문제를 해결하기 위해 GPT-3.5로 개별 기사를 사전 처리하여 최종 단계에서 GPT-4로 보내는 최종 프롬프트를 압축할 수 있습니다.


 summarization_prompt = ''' Summarize the following passage and extract only portions that are relevant to answering the user question. Passage: ======= %s ======= User Questions: %s ''' (row['content'], user_question) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a summarizer of tech industry reports"}, {"role": "user", "content": summarization_prompt}, ] )


그런 다음 요약을 프롬프트에 넣을 수 있으므로 순수 기사를 최종 프롬프트에 넣는 것보다 상당한 비용을 절약할 수 있습니다.

간단한 프런트엔드 구축

이제 Python 코드가 작성되었으므로 이를 간단한 웹 애플리케이션으로 패키징해 보겠습니다.

백엔드 API

Flask를 사용하여 코드를 백엔드 API로 패키징하는 것은 비교적 간단합니다. 간단히 함수를 만들고 다음과 같이 Flask에 연결하세요.


 import requests from bs4 import BeautifulSoup import re import pandas as pd import sqlite3 import json import openai from openai.embeddings_utils import cosine_similarity from flask import Flask, request, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) EMBEDDING_MODEL = "text-embedding-ada-002" openai.api_key = [Your OpenAI Key] db_location = [Location of your SQLite DB] def process_user_query(user_question): con = sqlite3.connect(db_location) cur = con.cursor() user_question = 'What did you say about the future of the fintech industry in summer of 2022?' res = [] for i in range(3): response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] ) generated_query = response.choices[0].message['content'] is_query_safe = True for no_use_word in {'DELETE', 'UPDATE', 'DROP'}: if no_use_word in generated_query.upper(): is_query_safe = False if not is_query_safe: break # the user input is likely malicious. Try to answer the question with vanilla RAG res = cur.execute(generated_query).fetchall() if len(res) > 0: break if len(res) == 0: # vanilla RAG in memory. Use a vector DB in production please. res = cur.execute('''SELECT * FROM articles''').fetchall() df = pd.DataFrame([{c[0]: v for c, v in zip(cur.description, row)} for row in res]) q_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding'] df['cosine_similarity'] = df['embedding_json'].map(lambda js: cosine_similarity(json.loads(js), q_embed)) answer_prompt = ''' Consider the following newsletter excerpts from the following dates: ''' for _, row in df.sort_values('cosine_similarity', ascending=False).iloc[:10].iterrows(): answer_prompt += """ ======= Date: %s ==== %s ===================== """ % (row['date'], row['content']) answer_prompt += """ Answer the following question: %s """ % user_question response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a tech analyst that can summarize the content of newsletters"}, {"role": "user", "content": answer_prompt}, ] ) return response.choices[0].message['content'] @app.route('/process_user_question', methods=["POST"]) def process_user_question(): return jsonify({ 'status': 'success', 'result': process_user_query(request.json['user_question']) }) app.run()

이것이 실제로 우리가 백엔드를 위해 해야 할 전부입니다!

프런트엔드 코드

엔드포인트가 하나뿐이고 애플리케이션에 많은 상태가 필요하지 않기 때문에 프런트엔드 코드는 매우 간단해야 합니다. 지난 기사 에서 특정 경로에서 구성 요소를 렌더링할 수 있는 라우팅을 사용하여 React 애플리케이션을 설정했다는 것을 기억하세요.


해당 문서의 지침에 따라 React.JS 프로젝트를 설정하고 선택한 경로에 다음 구성 요소를 추가하기만 하면 됩니다.


 import React, {useState, useEffect} from 'react'; import axios from 'axios'; const HNArticle = () => { const [result, setResult] = useState(''); const [message, setMessage] = useState(''); const [question, setQuestion] = useState(''); const askQuestion = () => { axios.post("http://127.0.0.1:5000/process_user_question", {user_question: question}) .then(r => r.data) .then(d => { console.log(d); setResult(d.result); }); } return <div className="row" style={{marginTop: '15px'}}> <div className="col-md-12" style={{marginBottom: '15px'}}> <center> <h5>Hackernoon CB Insights Demo</h5> </center> </div> <div className="col-md-10 offset-md-1 col-sm-12 col-lg-8 offset-lg-2" style={{marginBottom: '15px'}}> <ul className="list-group"> <li className="list-group-item"> <h6>Your Question</h6> <p><input className="form-control" placeholder="Question" value={question} onChange={e => setQuestion(e.target.value)} /></p> <p>{message}</p> <p> <button className="btn btn-primary" onClick={askQuestion}>Ask</button> </p> </li> {result? <li className="list-group-item"> <h6>Response</h6> {result.split("\n").map((p, i) => <p key={i}>{p}</p>)} </li>: ''} </ul> </div> </div>; } export default HNArticle;


코드를 실행하면 다음과 같은 인터페이스가 표시됩니다.




질문을 하고 잠시 후에 출력이 표시됩니다.


그리고 짜잔! 우리는 바닐라 RAG 시스템을 뛰어넘는 고급 쿼리 기능을 갖춘 챗봇을 성공적으로 구축했습니다!

결론

오늘 기사에서는 강력한 코드 생성 기능을 갖춘 챗봇을 구축했습니다. 이는 현재 많은 AI 선구자들이 구축하고 있는 새로운 종류의 LLM 애플리케이션의 한 예입니다. 이 애플리케이션은 데이터, 프로그래밍 언어 및 자연어 이해를 활용하여 전문 노하우를 갖춘 생성적 AI 시스템을 구축할 수 있습니다.


이러한 전문 시스템은 OpenAI 및 Anthropic과 같은 플랫폼 제공업체가 직접 제공하는 것 이상의 가치를 제공하려는 LLM 애플리케이션의 상업적 생존 가능성을 열어주는 열쇠입니다.


코드 생성은 최근 상업적으로 이용 가능한 대규모 언어 모델을 통해 가능해진 기술 중 하나일 뿐입니다.


LLM이 어떻게 상용화될 수 있는지에 대한 아이디어가 있거나 AI에 관해 대화를 나누고 싶다면 주저하지 말고 LinkedIn 또는 GitHub 에 문의하세요. 저는 지난 한 해 동안 독자들과 많은 통찰력 있는 대화를 나누었으며 더 많은 대화를 나누기를 기대합니다!