Command R+でRAGを使って個人開発したWebサービスを広める方法を聞いてみる 

# はじめに
Llama3やPhi-3など最近また精度の高い大規模言語モデルで一斉に発表されましたね。
そんな中ですっかり影が薄くなってしまってが、Command R+というモデルがその少し前に発表されました。
Llama3やPhi-3などが発表された今でも、私の中でCommnad R+を高く評価しています。
「<strong>Command R+</strong>」はCohere社が新たに発表した大規模言語モデルで、日本語にも対応していて、特徴はRAGなど長いコンテキストタスク向けに最適化されています。
以下からその性能を試すことができます。

https://huggingface.co/spaces/CohereForAI/c4ai-command-r-plus

<strong>RAG</strong>とは、Retrieval-Augmented Generationの略で、「検索拡張生成」などと訳されます。
Googleの検索結果やPDFなどの外部情報を読み込ませ、そこからユーザーの質問に関する情報を検索し、回答を生成します。

今回はこれを使って、個人開発してリリースしたてでユーザーのいないのWebサービス「<strong>推したいむ</strong>」がどうやったらユーザーを増やせるかをCommand R+先生に聞いてみたいと思います。

推したいむの内容はLlamaIndexのSimpleWebPageReaderを使って、URLからページの内容を読み取ってもらってそこからこちらの質問に回答してもらいます。

## 宣伝
この度 「[推したいむ]("https://ohitime.jp")」 という、推し活管理のためのカレンダー作成Webサービスを個人開発でリリースしました。

https://oshitime.jp


ユーザーが推しとその推しのイベントの情報を登録してファン同士で共有し、それをフォローすることで自分用の推し活カレンダーが作れるというサービスです。

ぜひご活用ください。


# 環境
Google ColabでCohereのAPIの無料枠を使って試します。
CohereのAPI KEYは https://dashboard.cohere.com/welcome/login からログインして取得してください。

# Colabで実行
## パッケージインストール
```
!pip install llama_index.core llama_index.llms.cohere llama_index.embeddings.cohere llama_index.postprocessor.cohere_rerank llama-index-readers-web
```
[LlamaIndex](https://www.llamaindex.ai/) を使うのでその辺のパッケージをインストールします。

## LLMの設定
```py
from llama_index.llms.cohere import Cohere
from llama_index.core import Settings

llm = Cohere(api_key=<COHERE_API_KEY>, model="command-r-plus")
Settings.llm = llm
```
\<COHERE_API_KEY> に自分のCohereのAPI Keyを入力します。
Colabのシークレット機能を使った方が安全なのでそちらをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/61544576-8e99-e733-9daa-e03173440d4b.png)

## 埋め込みモデルの設定
```py
from llama_index.embeddings.cohere import CohereEmbedding

embed_model = CohereEmbedding(
    cohere_api_key=<COHERE_API_KEY>,
    model_name="embed-multilingual-v3.0",
    input_type="search_query",
)
Settings.embed_model = embed_model
```
Webページの内容をAIが読み取るためにベクトル変換するためのモデルです。

## Webサービスの読み込み
```py
from llama_index.readers.web import SimpleWebPageReader
from llama_index.core import VectorStoreIndex

documents = SimpleWebPageReader(html_to_text=True).load_data(
    ["https://oshitime.jp",
     "https://oshitime.jp/faves",
     "https://oshitime.jp/events",
     "https://oshitime.jp/faves/4",
     "https://oshitime.jp/faves/10",
     "https://oshitime.jp/faves/12",
     "https://oshitime.jp/events/15",
     "https://oshitime.jp/events/24",
     "https://oshitime.jp/events/25"]
)
index = VectorStoreIndex.from_documents(documents)
```
[推したいむ]("https://oshitime.jp")のTopページといくつかサンプルになりそうなページを読み込ませます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/15ee8e50-35fd-3b61-0c9c-0e19393706d2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/de25e32d-b14d-2e61-5bd8-c24a53a1cf1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/e864cf5d-3a2c-312a-8cce-9ab80740020d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/9d575896-b19f-a3b5-6f7d-4fd6a7a7e55e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/c6a9bf2e-29e0-8129-22ba-cd078da09699.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/2c018f05-8b7a-f3c7-ca54-a4ba83177e48.png)
こんな感じのページです。

## ReRankモデルの設定
```
from llama_index.postprocessor.cohere_rerank import CohereRerank

cohere_rerank = CohereRerank(
    model='rerank-multilingual-v3.0',
    api_key=<COHERE_API_KEY>
)
query_engine = index.as_query_engine(node_postprocessors=[cohere_rerank])
```
ReRankモデルは質問に合わせてテキストの重要度を再度順位付けしなおしている。

## 質問
```py
from llama_index.core import PromptTemplate
qa_prompt_tmpl_str = (
                    "以下は「推したいむ」というWebサービスです\n"
                    "---------------------\n"
                    "{context_str}\n"
                    "---------------------\n"
                    "あなたは新規のWebサービスのユーザーを増やすのが得意なマーケティングのプロです。\n"
                    "Query: {query_str}\n"
                    "Answer: "
)
qa_prompt_tmpl = PromptTemplate(qa_prompt_tmpl_str)
query_engine.update_prompts(
    {"response_synthesizer:text_qa_template": qa_prompt_tmpl}
)
response = query_engine.query("このWebサービスにアーリーアダプターを呼び込むためのマーケティングのアイディアを出してください。")
print(response)
```
ここでいい感じのプロンプトを入力していきます。
今回はリリース直後のWebサービスのマーケティング戦略を知りたいので、
マーケティングのプロとして、アーリーアダプター（初期導入層）を取り込むためのアイディアを出してもらいました。

# 出力結果

```
Webサービス「推したいむ」にアーリーアダプターを呼び込むためのマーケティング戦略をご提案します。

**ターゲット層の特定とリーチ**

「推したいむ」の主なターゲット層は、熱心なファン活動を行う「推し活」をしているユーザーであると考えられます。これらのユーザー層にリーチするために、以下の施策が考えられます。

- SNSキャンペーンの実施： Twitter や Instagram などのSNS上で、「#推したいむ」や「#推し活」などのハッシュタグを使った投稿キャンペーンの実施。投稿したユーザーの中から抽選でグッズをプレゼントするなど、インセンティブを提供することで、サービスの認知度向上と利用促進を図る。
- 影響力のあるインフルエンサーや有名人の活用： 熱心なファンを持つアイドルやアーティスト、YouTuber などのインフルエンサーとコラボレーションを行い、彼らのファンを「推したいむ」に呼び込む。
- ファンコミュニティへの参入： 既存のファンコミュニティや掲示板、SNSグループなどに参入し、「推したいむ」の利便性や魅力を伝える。口コミを通じて、ファンの間でサービスの認知度を高める。

**機能の強調**

「推したいむ」の特徴や利点を強調し、競合サービスとの差別化を図ります。

- 「推し」を管理するカレンダーアプリとしての利便性を強調： コンサートやグッズ販売、テレビ出演など、様々な「推し」関連イベントをカレンダーで一元管理できる点をアピール。月間や週間での表示に加え、一覧表示も可能で、ユーザーの「推し活」をサポートできることを強調する。
- ファン同士の繋がりを促進： 「推し」やイベントをフォローすることで、同じ「推し」を持つファン同士で繋がることができる点を強調。ファンコミュニティの場としても活用できることをアピールする。
- 多様な「推し」に対応： 複数の「推し」を登録できるため、箱推しやDD など、様々なファン活動に対応できることをアピール。

**利用者の声を活用**

実際に「推したいむ」を利用しているユーザーの声やレビューをSNS やWeb サイト上で紹介することで、サービスの信頼性と魅力を高めます。利用者の声を通じて、サービスの利便性やファン活動が充実した様子などを伝えます。

**継続的なアップデートとサポート**

ユーザーの声に耳を傾け、継続的なアップデートとサポートを提供することで、サービスの改善と成長をアピールします。ユーザーからのフィードバックを積極的に取り入れ、機能追加や改善を行います。また、ユーザーがサービスをより深く理解し、活用できるよう、チュートリアルや FAQ などのサポート体制も強化します。

以上のマーケティング戦略を通じて、「推したいむ」にアーリーアダプターを呼び込み、サービスの認知度向上と利用者数の増加を目指します。
```

しっかりとサービスの内容を理解していていい感じのアドバイスをくれています。
いい結果なのではないのでしょうか。

# 最後に
今回はURLからWebページ読み込んでRAGを使いましたが、
他にもPDF・CSV・画像などさまざまな外部情報を利用することができます。
またCommand R+は日本語にも強いので、日本語の情報を読み込ませて日本語で聞けるのは非常に便利ですし、Command R+の利用料金はChatGPT4よりもお手頃です。

Command R+と推したいむをぜひ試してみてください。

# 参考
https://lightning.ai/lightning-ai/studios/rag-using-cohere-command-r?section=featured&tab=files&layout=column&path=cloudspaces%2F01hty58kqp2w9tvjgjhtq323d0&y=9&x=0

https://qiita.com/itokazu/items/2b519ef301fdf1430486#3-3-2-data-science-service-%E7%B7%A8