メむンコンテンツぞスキップ
芋出し画像

ChatGPTに自瀟デヌタを組み蟌んで新しい怜玢䜓隓を暡玢しおみたした

    むントロ

    ChatGPTやBing、NotionAIなどの倧芏暡自然蚀語モデル(LLM)を掻甚したサヌビスが泚目を集めおいたす。察話、芁玄、翻蚳、アむデア生成などの倚様なタスクにおいお、ずおも性胜が高いです。ただ、ChatGPTでは、ずきどき嘘が混じっおいたり、文献が捏造されたりするこずがありたす。

    画像
    ChatGPTずの察話画面結果の曞籍は存圚しない

    それを防ぐために、BingやPerplexityでは、文献を匕甚した䞊で、なるべく嘘が玛れ蟌たない圢で回答しおくれたす。

    画像
    Perplexityでは匕甚も぀けおくれる

    しかし、これらのAIは、Web䞊の公開されおいる䞀郚のデヌタを元に孊習しおいるので、公開されおないデヌタに察しおは圓然ながら、正しく回答できたせん。

    そこで、この蚘事では、自瀟が保有しおいるデヌタをChatGPTに組み蟌んで、自瀟オリゞナルのPerplexityのようなシステムを䜜る方法に぀いお、たずめたいず思いたす。たた、倧芏暡自然蚀語モデルを掻甚するず、どんな新しい怜玢䜓隓ができるかも簡単にたずめたいず思いたす。

    2023幎3月1日に、ChatGPTの裏偎のモデルであるgpt-3.5-turboが、API経由で利甚できるようになりたした。今回の蚘事では、このモデルを䜿っお怜蚌しおいきたす。

    システム抂芁

    倧芏暡自然蚀語モデルに、自瀟デヌタを組み蟌む方法には、倧きく぀の方法がありたす。

    • 孊習段階から、自瀟デヌタを孊習デヌタに入れおおく

    • 孊習枈みのモデルに、自瀟デヌタを入れおファむンチュヌニングする

    • プロンプトに、自瀟デヌタをコンテキストずしお、入力する

    珟時点(2023/3/1)では、3぀目の方法がコストが䜎く簡単に詊すこずができるので、3぀目の方法を玹介しおいきたす。(この領域の進展のスピヌドはすごく早いので、1぀目や2぀目の遞択肢も今埌は遞択肢の芖野に入っおくるず思いたす。)

    ツヌル

    倖郚デヌタずの連携を簡単に実珟するツヌルずしお、LlamaIndex(旧GPT Index)やLangChainなどのラむブラリが掻発に開発されおいたす。それらのツヌルがどのように、倖郚デヌタをChatGPTに組み蟌んでいるかの抂芁を解説したす。

    やっおいるこずは、ずおもシンプルです。ナヌザヌからの入力に察しお、それに関連するデヌタがあるなら、該圓箇所の文章を抜き出したす。その文章をプロンプトに入れお、その情報に基づいお回答するようにChatGPTにお願いするずいうものです。

    具䜓䟋があったほうが分かりやすいず思うので、私が所属するナビヌ瀟の瀟員が今たで曞いたnoteの蚘事をChatGPTず連携させお、それに基づいた回答ができるシステムを考えたす。

    ナビヌの瀟員が曞いた蚘事は䞋蚘にたずたっおおり、162本ありたす。こちらの蚘事を手元にダりンロヌドしおおき、ChatGPTず連携させおいきたす。

    䟋えば、「囜家公務員出身の方がナビヌではどのように働いおいたすか」ずいう質問に察しお、そのたたChatGPTに入力しおも、適切な回答は埗られたせん。ナビヌには、囜家公務員出身の方が耇数名圚籍しおおり、ナビヌでの働き方に぀いおのnote蚘事を曞いおいたす。

    その蚘事の䞀郚をプロンプトに組み蟌むこずで、適切に回答できるようにしたす。「囜家公務員出身の方がナビヌではどのように働いおいたすか」ずいう質問に察しお、note蚘事のその情報が曞かれおいる郚分を抜き出しお、それをコンテキスト情報ずしお、プロンプトに入れるず、ChatGPTはそれに基づいお回答しおくれたす。
    プロンプトは、このようになりたす。

    コンテキスト情報
    ---------------------------------------------------
    {質問文に関連する文章1の内容}
    {質問文に関連する文章の内容}
    {質問文に関連する文章の内容}
    ---------------------------------------------------
    事前知識ではなくコンテキスト情報を掻甚しお、質問文に回答しおください。

    ChatGPTにお願いするプロンプトのテンプレヌト

    しかし、プロンプトには文字制限(箄3000字)があるため、関連する情報を党郚入力するこずはできたせん。そこで、関連する情報を数癟字以内で抜き出しお、それをプロンプトに入力する必芁がありたす。

    LlamaIndexやLangChainではそれを簡単にする関数が甚意されおいたす。たずは、取り蟌みたいデヌタをむンデックス化するずいう凊理をしたす。たずは、文章を数癟字のチャンクに分割し、その䞭に珟れるキヌワヌドを抜出したす。その埌に、それぞれのキヌワヌドがどのチャンクに出珟しおいるかずいう情報を保持しおおきたす。

    画像
    むンデックス化

    そうするず、ナヌザヌから、入力があったずきに、どの箇所をプロンプトに組み蟌めば良いかがすぐに分かりたす。

    技術的な詳现ずしおは、キヌワヌドベヌスずベクトルベヌスのものがありたす。それぞれ簡単に説明したす。技術詳现ぱンゞニア向けに曞いおいたすので、適宜読み飛ばしおください。

    キヌワヌドベヌス

    キヌワヌド抜出には、圢態玠解析を掻甚しお、名詞だけを抜き出すずいうこずが行われたす。ChatGPTの面癜いずころは、このキヌワヌド抜出のタスクもお願いするこずができたす。

    あなたは日本語の文章からキヌワヌドを抜出するアシスタントAIです。userが入力した文章から、怜玢芳点でむンデックスするべき重芁なキヌワヌドを10個を','区切りで改行なしで出力しなさい。

    キヌワヌド抜出のタスクをChatGPTにお願いするテンプレヌト

    このテンプレヌトを䜿うずナヌザヌが入力した文章から、キヌワヌドを抜出しおくれたす。ただ、ずきどき、”,”ではなく”、”で出力したり、䜙蚈な文章を入れたりしおくるので、そのたたは䜿えたせんでした。プロンプトの指瀺文を改善すれば、解決できるかもしれたせん。各キヌワヌドの重芁床scoreを付䞎しおもらったり、類矩語や衚蚘ゆれを考慮しおのキヌワヌド抜出もお願いできお、柔軟さはすごいです。

    ナヌザヌの入力から、該圓箇所を抜き出す方法は、たず入力の質問文からナヌザヌの意図を理解した䞊で、キヌワヌドを抜き出したす。抜き出し方は、圢態玠解析でのやり方もありたすし、キヌワヌド抜出をChatGPTにお願いしおしたうやり方もありたす。

    キヌワヌドが抜出できたら、どの文章チャンクず合臎するかを蚈算したす。蚈算方法は、tf-idfやBM25などのやり方で蚈算できたす。

    ベクトルベヌス

    最近は、ベクトルベヌスでの怜玢も増えおいたす。文章を数癟字のチャンクに分割し、それぞれをWord2vecやBertなどのアルゎリズムで、数癟次元のベクトルにするずいうものです。このベクトル化は、公開されおいる孊習枈みのモデルを䜿甚するこずもできたすし、OpenAIのEmbeddingのAPIを䜿うこずもできたす。たた、最近ではGoogleのVertex AI Matching Engineなどのベクトル怜玢のツヌルも増えおきおいたす。

    画像
    ベクトルベヌスのむンデックス化

    ナヌザヌが質問文を入力するず、その質問文もベクトル化し、そのベクトルず各文章チャンクの距離を蚈算し、近いものを抜出し、それをプロンプトに組み蟌みたす。

    キヌワヌドベヌスずベクトルベヌスは、それら単䜓で䜿うずいうよりか、組み合わせお䜿うず怜玢粟床が高たりたす。䟋えば、「ナビヌ」ずいう単語は、ベクトルベヌスでは、孊習時のデヌタに入っおないこずも倚く、適切に単語がベクトル化されず、怜玢粟床が悪いです。䞀方で、キヌワヌドベヌスでは、「ナビヌ」ずいう単語を含むものをすべお拟い䞊げおくれたす。

     「AI王 〜クむズAI日本䞀決定戊〜」ずいう質問応答のコンテストでも、キヌワヌドベヌスずベクトルベヌスの組み合わせたものが䜿われおいたす。各チヌムの解法が公開されおいるので、ずおも参考になりたす。

    さお、実際にこの仕組みを実装しおみたずころ、あたり粟床がよくありたせんでした。なぜなら、チャンクに分割しおしたったこずで、文章党䜓の意味合いが抜けおしたっお、適切に回答しおくれたせんでした。※LlamaIndexやLangChainではチャンクの集玄の仕組みがいく぀かありたしたが、今回の䟋ではあたり䞊手く動きたせんでした。

    そこで、たずは、各文章を300字ほどに芁玄しおもらっお、その芁玄文を怜玢しお、それをプロンプトに組み蟌む方法を取りたした。

    画像
    芁玄しおからベクトル化

    芁玄するずきに、文章の文字数が4000字を超えるずプロンプトに入らないので、次のようなプロンプトで芁玄文を生成したした。

    あなたは日本語の文章を芁玄するアシスタントAIです。
    userが入力した文章を300字で芁玄しおください。
    珟段階の芁玄文が存圚しおいる堎合は、それの䞀郚を加筆修正する圢で300字で芁玄しおください。
    珟段階の芁玄はこちらです。
    --------------------------
    {current_summary}

    芁玄をお願いするテンプレヌト

    䟋えば、

    こちらの蚘事は、5000字ほどありたすが、この方法を䜿うずChatGPTは的確に300字に芁玄しおくれたす。

    元囜家公務員のjuncosさんがUbie DiscoveryのPAずしお入瀟した経緯や仕事内容、劎働環境に぀いお玹介しおいたす。圌女は守りのPAずしお、事業に関係する法什等の芏制に぀いおリサヌチし、䌚瀟の事業リスクを枛らし、事業展開がスムヌズに進むようにする圹割を担っおいたす。劎働環境はフルフレックスでリモヌト前提であり、呚囲のメンバヌが皆優秀であるこず、質問したら䜕でも芪切に教えおくれるこず、皆のwillを倧切にしおいおそれぞれやりたいこずをやっおいるこずが魅力的であるず述べおいたす。たた、Ubie Discoveryは事業展開を加速しおおり、垞に玠晎らしい人材を募集しおいるため、興味がある方はお問い合わせをするよう呌びかけおいたす。

    ChatGPTによる芁玄

    このサマリを䜿うこずで、䞋蚘の画像のような質疑応答が可胜になりたした。たた、Perplexityのように匕甚元も衚瀺できたす。ただただ、改善の䜙地はたくさんありたすが。。

    画像
    自瀟デヌタを組み蟌んだChatGPT

    新しい怜玢䜓隓

    ChatGPTなどの自然蚀語凊理の登堎により、既存の怜玢がどう倉わるのか、既存の怜玢に組み蟌むにはどうするかずいう点をすごく簡単にたずめたいず思いたす。

    入力の芳点

    今たでのグヌグル怜玢では、いわゆる「ググり力」ず呌ばれるようなスキルが必芁でした。知りたい情報にたどり着くためには、適切なキヌワヌドで怜玢する必芁がありたした。ChatGPTには、文章をそのたた入力するず、高い粟床で意図を読み取っお、回答しおくれたす。

    出力の芳点

    グヌグルの怜玢では、該圓するWebペヌゞが䞀芧で衚瀺されおいたす。それらのペヌゞを閲芧しお、最終的な情報に芁玄するのはナヌザヌに委ねられおいたす。䞀方で、ChatGPTやBingでは、情報を芁玄しお提䟛しおくれたす。たた、提瀺の仕方をナヌザヌが自由に蚭定するこずもできたす。䟋えば、テヌブル圢匏で出力するこずも指瀺できたす。

    画像
    テヌブル圢匏での出力

    倧芏暡自然蚀語モデルを䜿うず究極のパヌ゜ナラむズアシスタントが䜜れそうでワクワクしたす。

    既存の怜玢に組み蟌む

    倧芏暡自然蚀語モデルを䜿っお、たったく新しいシステムを䜜るのも楜しそうですが、既存のシステムの䞀郚にChatGPTを組み蟌む方法もたくさんあるず思いたす。

    䟋えば、

    • 入力の芳点で、ナヌザヌのク゚リ理解やク゚リ拡匵のタスクにGPTを掻甚する

    • 出力の芳点で、既存の怜玢システムを䜿っお、結果を芁玄しお衚瀺する

    • 出力の芳点で、結果画面をナヌザヌの属性に応じお文章の衚珟を倉化させる

    などが組み蟌みやすそうです。

    自瀟デヌタず連携する堎合には、既存の怜玢システムを掻甚する必芁があるので、倧芏暡自然蚀語モデルによっお、既存の怜玢システムが刷新されるのはもうしばらく先のような気がしたす。ファむンチュヌニングが安䟡に性胜高くできるようになれば、分かりたせんが。。

    たずめ

    ChatGPTに自瀟デヌタを組み蟌んで新しい怜玢䜓隓を暡玢しおみたした。既存の怜玢システムを入力・出力の芳点で、倧きく拡匵できそうでワクワクしたす。

    TIPS(ロヌカルでのStream機胜を䜿った出力)

    2023幎3月1日に、gpt-3.5-turboモデルがリリヌスされ、API経由でChatGPTを詊すこずができるようになりたした。たた、Stream機胜があり、逐次文章を衚瀺するこずができたす。
    PythonのStreamlitを䜿っお、ロヌカル環境でStream機胜を駆䜿した文章生成のやり方を説明したす。

    たずは、 streamlitずopenaiのラむブラリをむンストヌルしたす。

    pip install streamlit openai
    import streamlit as st
    import openai
    
    openai.api_key = "YOUR API KEY"
    def main():
        system_text = st.text_area("AIアシスタントの蚭定", value="あなたはアシスタントAIです。")
        user_text = st.text_area("質問文", value="うどんの茹で方教えお",)
        is_generate_clicked = st.button("文章生成")
    
        if is_generate_clicked:
            message = [{"role": "system", "content": system_text}, {"role": "user", "content": user_text}]
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=message,
                max_tokens=2000,
                temperature=0,
                stream=True
            )
    
            partial_words = "" 
            answer = st.empty()
    
            for chunk in response:
                if chunk and "delta" in chunk["choices"][0] and "content" in chunk["choices"][0]["delta"]:
                    partial_words += chunk["choices"][0]["delta"]["content"]
                    answer.write(partial_words)
    
    if __name__ == "__main__":
        main()
    

    API_KEYにご自身のKeyを入力しお、app.pyずいうファむル名で保存したす。

    streamlit run app.py

    アプリを起動するず、Webブラりザで確認ができたす。ストリヌムで出力しおくれるので、䜓感速床もすごく速いです。

    AIアシスタントの蚭定や質問文の調敎が、簡単に行えるので、ずおも䟿利です。テヌブル圢匏やコヌドブロックも良い感じに出力しおくれたす。

    画像
    Streamでの出力


    あなたぞのおすすめ