PythonでPerplexity API叩いてみた

こんにちは。AIツールの情報を集めているときに、大量のツール名リストからツールの詳細を取得するためにPerplexity APIを使ってみました。

# APIキーの取得
参照：[公式ドキュメント](https://docs.perplexity.ai/guides/getting-started "Getting Started")

まず普通に[Perplexity](https://www.perplexity.ai/)にログインしたら、歯車のアイコンを押して設定を開くとAPIのリンクがヘッダーに表示されます。
そこからクレジットを追加するとAPIキーが発行できるようになります。クレジットの追加が最低３ドルからだったので３ドル追加しました。

# APIを叩いてみる
コードの書き方はOpenAIのAPIとかなり似ていました。実際openAIクライアントをインポートしています。互換性があるみたいです。
>The API is conveniently OpenAI client-compatible for easy integration with existing applications. -Perplexity API Document

```python
from openai import OpenAI

YOUR_API_KEY = "INSERT API KEY HERE"

messages = [
    {
        "role": "system",
        "content": (
            "You are an artificial intelligence assistant and you need to "
            "engage in a helpful, detailed, polite conversation with a user."
        ),
    },
    {
        "role": "user",
        "content": (
            "How many stars are in the universe?"
        ),
    },
]

client = OpenAI(api_key=YOUR_API_KEY, base_url="https://api.perplexity.ai")

# chat completion without streaming
response = client.chat.completions.create(
    model="llama-3.1-sonar-large-128k-online",
    messages=messages,
)
print(response)

# chat completion with streaming
response_stream = client.chat.completions.create(
    model="llama-3.1-sonar-large-128k-online",
    messages=messages,
    stream=True,
)
for response in response_stream:
    print(response)
```

リアルタイムでレスポンスが欲しい場合はstreamingの書き方でできるみたいです。私はwithout streamingで使いました。

レスポンスの構造はこうなっています。
```json
{
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "model": "llama-3.1-sonar-small-128k-online",
  "object": "chat.completion",
  "created": 1724369245,
  "choices": [
    {
      "index": 0,
      "finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": "The number of stars in the Milky Way galaxy is estimated to be between 100 billion and 400 billion stars. The most recent estimates from the Gaia mission suggest that there are approximately 100 to 400 billion stars in the Milky Way, with significant uncertainties remaining due to the difficulty in detecting faint red dwarfs and brown dwarfs."
      },
      "delta": {
        "role": "assistant",
        "content": ""
      }
    }
  ],
  "usage": {
    "prompt_tokens": 14,
    "completion_tokens": 70,
    "total_tokens": 84
  }
}
```

回答のみを取得したい場合はこれで取得できました。
```python
        response = client.chat.completions.create(
            model=MODEL_NAME,
            messages=messages,
        )
        
        # レスポンスから回答を抽出
        answer = response.choices[0].message.content
        return answer
```

# モデルの種類
現在7つのモデルがあり、それぞれの用途についてPerplexity本人に聞いてみました。
>### Perplexity AIの各モデルの主な用途は以下のとおりです:
>* #### llama-3.1-sonar-small-128k-online / llama-3.1-sonar-large-128k-online / llama-3.1-sonar-huge-128k-online:
>        -リアルタイムのウェブ検索と情報収集
>        -最新の情報が必要な質問への回答
>        -長文の処理や複雑な質問への対応（128kトークンの長いコンテキスト）

>* #### llama-3.1-sonar-small-128k-chat / llama-3.1-sonar-large-128k-chat:
>        -オフラインでの会話型AI応用
>        -長時間の対話や複雑なタスク（128kトークンのコンテキスト）
>        -プライバシーが重要な場面での使用
        
>* #### llama-3.1-8b-instruct:
>        -軽量で高速な応答が必要な場合
>        -リソースが限られた環境での使用
>        -基本的な指示に従うタスク
        
>* #### llama-3.1-70b-instruct:
>        -より高度で複雑なタスク
>        -詳細な指示や多段階の処理が必要な場合
>        -専門的な知識を要する質問への対応

利用料金についてはここから確認できます。[Pricing](https://docs.perplexity.ai/guides/pricing)

# 使ってみた感想
今回はなるべく新鮮な情報が欲しかったのでPerplexityのAPIを使いました。モデルはllama-3.1-sonar-huge-128k-onlineを使ったからか、情報精度は高かったですが、プロンプトを理解する能力はChatGPTにはかなり劣ります。的外れな回答をすることも多々あったので、ところどころ回答を自分で修正する必要がありました。私は『マークダウン形式で返さないで』などをプロンプトに加えていたのですが、その辺りの処理はうまくできませんでした。あくまで、情報の精度を求めて、短く検索エンジンのようなプロンプトにするのがいいと思います。