どのようにお手伝いできますか?

ご用件を簡単にお知らせください。メールで返信します。

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
トップページへ

Smart Answer:サイト内検索のAI回答

Smart Answerの埋め込み:suche.js、マークアップ内のボックス、サーバー生成の検索ページ用公開HTTPインターフェース、Server-Sent Eventsの回答ストリーム、CSS変数、チャットへの引き継ぎ。

Smart Answerは、サイト内検索の結果の上または下に、訪問者の質問への短い回答を表示します。ナレッジベースの出典付きでストリーミングし、次の質問用のフィールドもあります。Smart Answerは独立したサービスで、チャットアシスタントと同じナレッジベースを使います。アカウントのプロジェクト → サイト内検索のSmart Answerで有効化し、外観を設定します。

suche.jsで埋め込む

ページにチャットローダーがあれば、1行で済みます。

<script src="https://cdn.reactive.chat/suche.js" async></script>

チャットウィジェットがなければ、サイトキーを渡します。

<script src="https://cdn.reactive.chat/suche.js" data-site-key="SITE_KEY" async></script>

スクリプトは、ページの検索欄(対象はアカウントのCSSセレクターで指定)に接続し、送信または入力の停止を待ち、設定位置(対象要素の前、後、内部)のボックスに回答を表示します。既定では、質問と見なせる入力だけに回答します。

scriptタグの属性:

スクリプトはCookieを設定せず、sessionStorageだけに保存します。CSPではscript-src https://cdn.reactive.chat とconnect-src https://ws.reactive.chat が必要です(セキュリティとCSP)。

チャットへの引き継ぎ

訪問者がボックスで追加質問をすると、追加質問の設定に応じて、チャットウィジェットで会話を続けるか(ReactiveChat('continueConversation', id, text)またはReactiveChat('startConversation', text))、同じボックスで回答します。ページにチャットウィジェットがなければ、追加質問は常にボックス内に残ります。

スタイル

ボックス(.rc-ai)には独自のCSSがあり、ページのリセットスタイルから保護されています。詳細度が最も低い変数で調整できます。

.rc-ai {
  --rc-ai-akzent: #0a7cff;
  --rc-ai-hg: var(--karte, #fff);
  --rc-ai-text: #1d1d1f;
  --rc-ai-rand: #e3e3e8;
  --rc-ai-radius: 10px;
  --rc-ai-schrift: inherit;
  --rc-ai-abstand: 20px;
  --rc-ai-schriftgroesse: 16px;
  --rc-ai-zeilenhoehe: 1.6;
}

アカウントのカスタムCSSフィールドで、.rc-ai .rc-ai__teil { … }を使い個別の部分を変更します。例:.rc-ai .rc-ai__hinweis { display: none; }。保護レイヤーは、ページの#idや!importantを含むルールからは保護しません。

HTTPインターフェース

サーバー生成の検索ページや独自の画面向けに、認証もCookieも不要な公開インターフェースがあります。アドレスはhttps://ws.reactive.chat/api/suche/SITE_KEY.

全エンドポイント共通:

GET /api/suche/SITE_KEY?locale=de – 設定、CSS、空のボックステンプレート(Cache-Control: public, max-age=60):

POST /api/suche/SITE_KEY – 質問用のボックスの完成したHTML。本文は最大4 KBです。

curl -s -X POST "https://ws.reactive.chat/api/suche/SITE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"How long does shipping take?","locale":"en"}'

POST /api/suche/SITE_KEY/antwort – Server-Sent Eventsストリームで回答本体を返します。本文は最大8 KBです。

{"q":"How long does shipping take?","locale":"en",
 "visitor_id":"v_…",
 "ctx":{"url":"https://shop.example/search","title":"Search"},
 "folge":false,
 "vorher":[{"q":"…","a":"…"}]}

応答はtext/event-streamです。

event: status
data: {"stufe":"denkt"}

event: text
data: {"text":"Shipping usually takes"}

event: fertig
data: {"text":"Shipping usually takes 2–3 working days.","quellen":[{"titel":"Shipping","url":"https://shop.example/shipping"}],"fortsetzung":{"art":"faden","id":"01J…"}}

fertigまたはfehlerの後、ストリームは終了します。開始前のエラーも、fehler1つだけのストリームで返します(HTTP 404、429、400、413、503、200)。45秒間テキストがない、または90秒で終了しない場合は、fehler zeitが続きます。接続を閉じると回答を中断します。経路上のプロキシは、ストリームをバッファリングせずに通す必要があります。

// read the stream in the browser (EventSource cannot POST)
const r = await fetch('https://ws.reactive.chat/api/suche/SITE_KEY/antwort', {
  method: 'POST', headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ q: frage, locale: 'en' }), credentials: 'omit'
});
const leser = r.body.getReader(); const dec = new TextDecoder(); let puffer = '';
for (;;) {
  const { value, done } = await leser.read(); if (done) break;
  puffer += dec.decode(value, { stream: true });
  let i; while ((i = puffer.indexOf('\n\n')) >= 0) {
    const block = puffer.slice(0, i); puffer = puffer.slice(i + 2);
    const ev = /^event: (.*)$/m.exec(block), da = /^data: (.*)$/m.exec(block);
    if (ev && da) zeige(ev[1], JSON.parse(da[1]));
  }
}

次:プライバシーの連携

最終更新: