見出し画像

LLM(大規模言語モデル)を使ったマーケティングリサーチ論文のエッセンスと実装上の工夫

こんにちは、ウィスコンシン大学マディソン校PhD課程の西村です。先日、以下のようなツイートをしたら、幸運なことに多くの方から反響をいただきました。ありがとうございます。

学術界以外にも、マーケター、PdM、そしてエンジニアの方も多くいいねやリツイートをしてくれました。ありがとうございます。

ツイート内のリンク先は学術雑誌であるため、大学などの研究機関に所属するか、お金を払って購入しないと読めません。さらに、論文は英語で書かれているため、読むのに時間がかかる方が多いと懸念します。

そのため、この論文の内容のエッセンスと、結果生成のための実装の解説(と一部のコードスニペット)を公開したいと思います。今後も、自分が著者に入っている論文については、実務における解釈や応用可能性の観点を踏まえ、このようなエッセンス記事を書いていこうと思います。

なお、本記事に使っている図表は、SSRN(正式なジャーナルに乗せる前の"プレプリント"を乗せるサイトです。arxivと似ているサービス)に載せているものから引っ張りました。ご興味のある方は、こちらのリンクからご確認ください。Twitterのリンク先のペーパーに近い内容です。

論文のエッセンス

この論文は、とても雑に一言でいうと「実際に企業で使った定量、定性リサーチの問と回答者のペルソナをインプットとして、GPT-4に回答を生成させたら、両方とも比較的うまくいったよ」です。

もう少し詳しく言えば、定性リサーチについては、

  1. In-depth interviewについて、GPT-4に生成させた回答と、実際に企業が行ったときの人間の回答とを、クラウドワーカーの採点によって比べると、Depth(回答の深さ、詳しさ)とInsightfulness(洞察の多さ)で、GPT-4はより良い性能を発揮したよ。

  2. 意味的な分析では、人間の回答とGPT-4の回答は、重なっているところもあるし、人間の回答でしかわからないインサイトもあれば、GPT-4でしかわからないインサイトもあったよ(だから両方を実施することに意味があるよ)。

  3. (他の分析も合わせていえば)GPT-4や同性能のLLMではリサーチのデザインや想定するペルソナの生成、回答の生成、その結果の分析、といった、リサーチデザインから分析まで、人間の良いサポート役になれるよ。

という感じです。定量リサーチについては、

  1. RAGやIn-context learningなしでは、人間の回答と大きな方向性の違いはなかったよ(つまり選択肢が1−5だとして、人間の回答の平均が2のとき、GPT-4が生成した回答の平均も2前後だったよ)。ただし、人間の回答に見られるような分布(分散、つまり回答のばらけ、散らばり具合)やInternal consistency(ある回答にYesと答えたら次の回答もYesと答えないと一貫性が満たされないよね、ということ)が見られなかったよ。

  2. これまでの質問と回答の履歴を、次の質問のインプットにして回答を生成する、というIn-context learningと、関連する定性リサーチの質問と結果を外部データベースとしたRAGの両方を使うと、散らばり具合やInternal consistencyが人間の回答に近くなったよ。(これは例えば、3番目の質問をインプットするときに、1-2番目の質問と生成した回答のペアを一緒にインプットすると、3番目の質問の散らばり具合が人間に近くなったよ、ということです。)

  3. 定量リサーチでも、サーベイ自体のデザインやその生成にGPTや他のLLMを活用できるよ。

という感じです。以下は、もう少し詳しいデータを補足します。

定性リサーチ

定性リサーチの生成は、インプットを「ペルソナ、リサーチの目的、具体的な質問」として、LLMに回答をアウトプットさせています。特にインパクトのあった工夫として、「LLMにインタビューのモデレータを模倣させる」というものがあります。この点は、コードとともに「実装上の工夫」セクションで紹介します。

以下は分析結果の補足です。

「Depth(回答の深さ、詳しさ)とInsightfulness(洞察の多さ)で、GPT-4はより良い性能を発揮した」というのは、以下のRegressionの結果から得られるものです。Regressionは、文字数や回答者のペルソナもコントロールした上で実施しています。興味のある方はSSRNの論文内の23-24ページに詳しい説明があります。

また、Sentence Transformerを使って、人間とGPT-4の回答の意味的な差分を比較しています。Visualizationとして、Sentence Transformerの結果を、UMAPで2次元に落とし込んでマッピングしています。こちらもSSRN論文内の56-57ページに記載があります。

定量リサーチ

In-context learningやRAGの具体的なやり方は、次のセクションで図とともに説明します。このセクションは、エッセンスで述べた部分のデータでの補足を述べます。

以下のグラフは、ある3つの質問に対する回答の平均値(選択肢は1−5)と95%信頼区間をエラーバーで表したグラフです。人間の回答を「Actual」、Zero-shotのGPT-4を「LLM1」、回答と質問ペアの履歴を入れたものを「LLM2」、In-context learningに加えてRAGを施したものを「LLM3」としています。LLM2,3が、Zero-shotのGPT-4に比べて人間の回答に近づいていっている、及びその信頼区間が広がっている(=分散が高くなっている)ことがわかります。ただし、人間の散らばり程度によりも狭いままです。SSRN上では41ページ付近に図と説明があります。

また、Internal consistencyについては、ある7つの問題に対するCorrelation matrixを調べています。以下の図で、LLM1から、LLM2,3に変化させたときの改善が見えます。SSRNの論文では、42ページにこの図と説明があります。LLM2だとちょっと相関が強く出すぎている一方、LLM3だとそれがよりマイルドになっています。ただし、LLM2,3どちらの結果も、人間のCorrelation matrixとは統計的に有意に異なっています。

また、この論文では、最終的には、定性、定量のマーケティングリサーチにおいて、LLMをどこでどのように使えるかのフレームワークを提示しています。それが以下の図です。SSRNの論文で、17ページと43ページにある図を合わせたものです。左が定性リサーチ、右が定量リサーチのおすすめワークフローです。

実装上の工夫

このセクションでは、まず全体のアーキテクチャを概説した後、定性、定量リサーチの回答生成において、実装上で工夫した点を説明します。

アーキテクチャ

システム図は以下のとおりです。ペルソナとリサーチコンテクストやリサーチ目的をSystem roleに入れて、具体的な質問をUser roleに入れています。それをAPI経由でサーバに送り、レスポンスをパースしてValidation check(例えば1-5の間の数値のみで回答しているか、など)にかけます。通ればそれを保存すると同時に、質問と回答のペアを次の質問のUser role内に入れます。これを、質問セットが完了するまで繰り返します。
上記のイテレーションを、必要なサンプル数だけ繰り返します。

回答生成の工夫

定性リサーチ
上記に記載の通り、最も大きな工夫は、「LLMにモデレータの役割もやらせた」点です。

人間が行うIn-depth interviewでは、回答者の回答が不足していたり、もっと突っ込んだら面白そう、というときに、モデレータがより深く突っ込んだ質問を行いますよね(これをProbingと呼びます)。このProbingをLLMにやらせてみよう、というのがコンセプトです。私達は、これを"Moderated interview of LLMs by LLMs"と名付けました(そのままですね)。

セミナーのプレゼンから抜粋
  1. まず質問をLLMに投げます。

  2. 返ってきた回答を、別のリクエストとして、「この回答は、このリサーチの目的から考えると何点だと思う?」とインプットし、LLMに採点させます。

  3. そのスコアが一定以下であれば、「このリサーチと質問、回答を踏まえて、Probingのための質問を考えて」と、LLMに問います。

  4. 返ってきたProbingの質問を、再度LLMに回答させます。

  5. この一連の流れを、スコアが閾値以上になるまで、もしくは3回終わるまで実施します。

このモデレーションのためのコードスニペット(簡略化してます)は以下のとおりです。そのままでは動きません、疑似コード的にご覧ください。

# sys_dict includes data related to persona and research context.
persona, research_q = sys_dict['Persona'], sys_dict['ResearchContext']
probe_count = 0
while exist_probe and probe_count < MAX_PROBE:
    # get score from LLM to decide if we should ask additional probe
    ans_dict = ask_llm_to_score(persona, research_q, latest_q)
    exist_probe = average_scores(ans_dict)
    # if the confidence level higher than threshold, then go next q.
    if exist_probe >= probe_threshold:
        print("There is no additional probe. Go to next question.")
        break
    else: # generate additional probe
        ask_probe = generate_probe(persona, research_q, latest_q)
        ans = post_api(sys_role=sys_role, usr_role=ask_probe)

ask_llm_to_score関数では、「関連性、深さ、明確さ、インサイトがあるの4つの観点で、与えられた質問と回答を、与えられたリサーチコンテクストから採点して」をプロンプトとして、APIをリクエストしています。

generate_probe関数では、「与えられた質問と回答、及び与えられたリサーチコンテクストを踏まえて、追加で問うべき1つのProbeを出力して」をプロンプトとして、APIをリクエストしています。なおpost_apiは、エラーハンドリングなどを行いながらOpenAI APIを呼び出すための関数です。

定量リサーチ
定量リサーチでは、In-context learningとRAGを用いました。以下に使い方を述べます。

In-context learningの応用は、質問回答のペアの履歴を、System roleに入れる、というシンプルなものです。post_apiで回答を得たら、回答と質問をhistorical data を保存しているDictに保存して、それをパースして次の質問のときに取り込む、ということを実施しました。

RAGは、既存の別リサーチを外部データソースとして活用する、というものです。

セミナーの資料から抜粋

外部データソースは、この論文ではChromaDBを用いました。が、別のサービス、例えばPineconeでも構いません。

  1. まず、外部データソースに何を使うか決めます。私達の論文では、既存の定性リサーチの質問と回答結果を使いました。他の候補としては、外部のリサーチ会社が作ったリサーチペーパーや公的なデータでも良いでしょう。重要なことは、自分が生成するリサーチの目的に「関連した」データを集める、ということです。

  2. 次に、外部データソースをベクトル化します。私達の場合はSentence Transformerを使いましたが、これもいろんなやり方があると思うので、好みの、もしくはより効果の高いモデルを使うと良いと思います。

  3. 次に、生成させたい質問と関連する情報を、外部データから取り出します(Retrieveします)。私たちは、これをChromaのメソッドを使って実施しましたが、RAGはこのRetrieveが本質的に重要なところなので、目的に沿ってより複雑なリトリーブ方法を導入しても良いと思います。図では、「Q: How important is "Made with Human-Grade Ingredients" to you? ​A: Somewhat Unimportant. Dogs do not have the same dietary needs as humans. ​」が該当箇所です。

  4. 最後に、リトリーブした結果と、生成させたい質問(図では、「Q: How likely would you be to purchase Human graded dog food?​」が該当)をセットでLLMに質問し、回答を得ます。本セクションもコードスニペットは省略します。

さいごに

今回の記事では、LLMにマーケティングリサーチを生成させてみた論文のエッセンスと実装上の工夫を、論文の図やステートメント、及びセミナーでの発表資料とかんたんな疑似コードを交えて説明しました。

今後も、自分たちのリサーチや最新のリサーチを、実際のマーケティングや経営、プロダクトの業務に従事している方を想定読者として、わかりやすく発信していきたいと思います。

本記事へのご意見、ご質問やリクエストがございましたら、ぜひコメント欄にお願いします!

また、私自身は、いつでも企業とのコラボレーションの機会を探し求めています!リサーチのコラボレーションは、私だけではなくWisconsin School of Businessの教授も含めて実施します。ぜひお声がけください!私の詳しいプロフィールはこのリンク先ページにございますので、お気軽にメールをいただければ幸いです!(Twitterでももちろん構いません!)

この記事が気に入ったらサポートをしてみませんか?