PythonからPerplexicaのAPIをたたいてAI検索を利用する

PythonからPerplexica(PerplexityのOSSクローン)のAPIをたたいて利用できるまでのログ

Perplexica(GUI)を使えるようにする

以下の記事に記載の手順でブラウザ(GUI)上でPerplexicaを使えるようにしておく。

meganedesu.com

以下は、実際に使ってみたた様子なので、参考になる。

meganedesu.com

Pythonの実行環境(Jupyter Notebook)を用意する

こちらもすでに作成した過去記事が参考になる。Python環境の準備という欄を参考にすればよい。

meganedesu.com

今回使用するモデルの用意

今回は、「Llama-3-ELYZA-JP-8B」というモデルを使用する。

www.chowagiken.co.jp

別にこのモデルでなければいけない理由はないので、ほかに使用したいモデルがあって、すでにダウンロード済みであれば、この箇所はスキップでよい。

ホスト上で以下のコマンドを実行して、モデルをダウンロードできる。

docker exec -it ollama ollama pull hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF

実際にAPIを叩く

PerplexicaのAPIに関する情報は検索してもあまり見つからない。一応Perplexityに聞いてみたけれど、回答は頓珍漢なものしか返ってこない。

ということで、唯一のまとまな情報である、以下の公式ドキュメントを参考に実行するほかない。

github.com

settingsの情報を参考に、chatModel, embeddingModelを設定する。

失敗したバージョン

設定したpayloadをpostでリクエストするコードを実行する。

import requests
import json

url = "http://host.docker.internal:3001/api/search"

headers = {
    "Content-Type": "application/json",
}

payload = {
    "chatModel": {
        "provider": "Ollama",
        "model": "hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:latest"
    },
    "embeddingModel": {
        "provider": "Ollama",
        "model": "hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:latest"
    },
    "optimizationMode": "speed",
    "focusMode": "webSearch",
    "query": "石破首相とトランプ大統領の会談日時は?",
}

response = requests.post(url, headers=headers, json=payload)

if response.status_code == 200:
    print(response.json())
else:
    print(f"Error: {response.status_code}")
    print(response.text)

結果は失敗

Error: 400
{"message":"Invalid model selected"}

ちゃんと正しいモデルを選択したはずなのに、モデルがinvalidと言われてしまっている。なぜだろう?

と思って、公式ドキュメントを見ると、以下の記述がある。

Request Parameters

chatModel (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at http://localhost:3001/api/models. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini").

    provider: Specifies the provider for the chat model (e.g., openai, ollama).
    model: The specific model from the chosen provider (e.g., gpt-4o-mini).
    Optional fields for custom OpenAI configuration:
        customOpenAIBaseURL: If you’re using a custom OpenAI instance, provide the base URL.
        customOpenAIKey: The API key for a custom OpenAI instance.

ollamaを指定する際に、先頭文字が小文字でollamaとなっている。まさか、これが原因じゃないだろうと思いつつ、一応小文字に変更してみる。 変更箇所は、chatModelとembeddingModelのproviderという箇所。

成功バージョン

変更して、以下のコードを実行する。

import requests
import json

url = "http://host.docker.internal:3001/api/search"

headers = {
    "Content-Type": "application/json",
}

payload = {
    "chatModel": {
        "provider": "ollama",
        "model": "hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:latest",
        
    },
    "embeddingModel": {
        "provider": "ollama",
        "model": "hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:latest",
        
    },
    "optimizationMode": "balanced",
    "focusMode": "webSearch",
    "query": "石破首相とトランプ大統領の会談日時は?",
}

response = requests.post(url, headers=headers, json=payload)

if response.status_code == 200:
    print(response.json())
else:
    print(f"Error: {response.status_code}")
    print(response.text)

結果(長いので一部抜粋)

Based on the provided context, 石破首相とトランプ大統領の会談日時は以下の通りです。\n\n- 2月7日\n\nこの日、石破総理大臣はアメリカのトランプ大統領との初めての日米首脳会談に臨みました。

ちゃんと返答もあるし、内容も合っている。成功した!!!