Squadbase

セールスコーチAIチャット

Streamlit Streamlit

概要

プロジェクトのコードベースに格納したマークダウンファイルの内容と、CRM (Attio) から取り込んだ商談議事録をコンテクストとして参照し、セールスパーソンのお悩みに回答するコーチングチャットボットです。このアプリはStreamlitで作られています。

コンテクストを正しく与えることで、自分たちのニーズに合ったチャットボットに育てることができます。

カスタマイズ

マークダウンファイルの運用

以下のように、/knowledgeディレクトリ内のマークダウンファイルを読み込んでいます。

@st.cache_resource(show_spinner=False)
def load_all_markdown() -> str:
    """Recursively read all *.md files under the knowledge directory and concatenate them."""
    md_files = sorted(KNOWLEDGE_DIR.rglob("*.md"))
    if not md_files:
        return "# Knowledge base is empty!"

    contents = []
    for path in md_files:
        contents.append(f"<!-- {path.relative_to(KNOWLEDGE_DIR)} -->\n")
        contents.append(path.read_text(encoding="utf-8"))
        contents.append("\n\n")
    return "".join(contents)

SYSTEM_PROMPT = load_all_markdown()

マークダウンファイルを編集・追加して、コンテクストをカスタマイズしてください!

実際の運用の際には、定期的にマークダウンファイルをアップデートすることでチャット全体の挙動をカスタマイズすることができます。

CRMとのデータ接続

このサンプルではAttioのAPIを用いて、Noteのデータを取り込んでいます。これにより、直近の商談の内容を考慮に入れて回答を作ってくれます。

@st.cache_data(ttl=300)   # 5-minute cache
def fetch_notes(page_size: int = 20) -> pd.DataFrame:
    url = f"{ATTIO_API_BASE}/notes"
    params = {"limit": page_size}
    all_rows = []

    while True:
        response = requests.get(
            url,
            headers={
                "Authorization": f"Bearer {attio_api_key}",
                "Content-Type": "application/json"
            },
            params=params,
            timeout=30
        )
        response.raise_for_status()  # Raise exception for 4xx/5xx responses
        payload = response.json()    # {"data":[…], "next_cursor": "...", "has_more": true}
        all_rows.extend(payload["data"])

        # --- Pagination ---
        if payload.get("has_more") and payload.get("next_cursor"):
            params["page[after]"] = payload["next_cursor"]
        else:
            break

Pythonコードから取得できるデータであればなんでも連携できるので、SalesforceやZendeskなどのCRMとのデータ連携を実現するには、この部分を書き換えてください。