杰瑞科技汇

perplexity实现python

Perplexity 提供了一个基于 REST API 的服务,允许你将他们的核心搜索和问答功能集成到自己的应用程序中,我们将使用 Python 的 requests 库来实现这一点。

perplexity实现python-图1
(图片来源网络,侵删)

核心概念

Perplexity API 的核心工作流程如下:

  1. 发送请求:你向 Perplexity 的 API 端点发送一个 HTTP POST 请求。
  2. 请求体:请求体是一个 JSON 对象,其中包含你的问题(query)和一些可选的参数,比如模型、搜索焦点、来源过滤等。
  3. 接收响应:API 返回一个 JSON 响应,其中包含 AI 生成的答案、引用的来源链接以及相关的元数据。
  4. 处理结果:在你的 Python 代码中解析这个 JSON 响应,提取出你需要的信息。

第 1 步:准备工作

在开始编写代码之前,你需要完成以下准备工作:

获取 API 密钥

这是与 Perplexity API 通信所必需的。

  • 访问 Perplexity AI 官网
  • 登录你的账户。
  • 进入 Settings (设置) 页面。
  • 在左侧菜单中找到 API Keys (API 密钥) 选项。
  • 点击 Create a new API key (创建新的 API 密钥)。
  • 为你的密钥命名(my-python-app),然后点击 Create
  • 重要:系统会显示你的 API 密钥,请立即复制并安全地保存它,因为你之后将无法再次看到完整的密钥。

安装 requests

requests 是一个简洁且强大的 Python HTTP 库,非常适合调用 REST API,如果你的环境中没有安装,可以通过 pip 安装:

perplexity实现python-图2
(图片来源网络,侵删)
pip install requests

第 2 步:编写 Python 代码

下面是一个完整的 Python 脚本示例,演示了如何调用 Perplexity API 并打印返回的答案和引用。

import requests
import json
# --- 配置 ---
# 1. 将 'YOUR_PERPLEXITY_API_KEY' 替换为你自己真实的 API 密钥
PERPLEXITY_API_KEY = "YOUR_PERPLEXITY_API_KEY" 
# 2. Perplexity API 的端点
API_URL = "https://api.perplexity.ai/chat/completions"
# 3. 你想问的问题
query = "什么是人工智能?请用简单的语言解释。"
# --- 构建请求载荷 ---
# 这是发送给 API 的数据,必须是 JSON 格式
payload = {
    "model": "llama-3.1-sonar-small-128k-online",  # 你可以选择的模型,"sonar" 或 "llama" 系列模型
    "messages": [
        {
            "role": "user",  # 角色是 "user"
            "content": query  # 内容是我们的问题
        }
    ],
    "max_tokens": 500,  # 可选:限制生成内容的长度
    "temperature": 0.2,  # 可选:控制回答的随机性,0.0-1.0,越低越确定
    "top_p": 0.9,       # 可选:控制词汇采样的多样性
    "search_focus": "web",  # 可选: "web" (默认, 使用网络搜索), "academic" (学术搜索), "recent" (最新信息)
    "return_images": False, # 可选: 是否返回图片
    "return_related_questions": False, # 可选: 是否返回相关问题
    "stream": False,    # 可选: 是否使用流式响应 (这里我们设为 False,一次性获取全部结果)
    "frequency_penalty": 1, # 可选: 防止重复
    "presence_penalty": 1  # 可选: 鼓励谈论新话题
}
# --- 设置请求头 ---
# 请求头包含 API 密钥和内容类型
headers = {
    "Authorization": f"Bearer {PERPLEXITY_API_KEY}",
    "Content-Type": "application/json"
}
# --- 发送请求并处理响应 ---
try:
    print(f"正在向 Perplexity API 发送问题: \"{query}\"...")
    # 使用 requests.post() 发送 POST 请求
    response = requests.post(API_URL, headers=headers, data=json.dumps(payload))
    # 检查请求是否成功 (HTTP 状态码 200)
    response.raise_for_status() 
    # 解析 JSON 响应
    response_data = response.json()
    # --- 提取并打印结果 ---
    # 答案通常在 "choices" 列表的第一个元素的 "message" 的 "content" 字段中
    answer = response_data['choices'][0]['message']['content']
    print("\n--- AI 生成的答案 ---")
    print(answer)
    # 引用的来源在 "citations" 字段中
    citations = response_data.get("citations", [])
    if citations:
        print("\n--- 引用的来源 ---")
        for i, citation in enumerate(citations):
            # URL 可能在 'metadata' 中,也可能直接是 'url'
            url = citation.get('metadata', {}).get('url', citation.get('url'))
            if url:
                print(f"[{i+1}] {url}")
except requests.exceptions.HTTPError as http_err:
    print(f"HTTP 错误发生: {http_err}")
    print(f"响应内容: {response.text}") # 打印详细的错误信息
except Exception as err:
    print(f"其他错误发生: {err}")

代码解析

  1. 配置:

    • PERPLEXITY_API_KEY: 请务必修改这里为你自己的密钥。
    • API_URL: 这是 Perplexity API 的固定地址。
    • query: 你想问的问题,可以随时修改。
  2. 构建请求载荷 (payload):

    • 这是一个 Python 字典,它会被转换成 JSON 格式发送给服务器。
    • model: 指定要使用的模型,Perplexity 会不断更新其模型列表,你可以查看他们的官方文档了解可用的模型。
    • messages: 这是一个消息列表,是现代 AI API 的标准格式,我们只包含了一条用户消息。
    • search_focus: 这是一个非常实用的参数,web 会进行常规网络搜索,academic 会侧重于学术资源,recent 会查找最新的信息。
    • stream: 设为 False 时,API 会等待完整生成答案后一次性返回,设为 True 时,API 会像聊天一样逐字返回结果,这需要更复杂的处理逻辑。
  3. 设置请求头 (headers):

    perplexity实现python-图3
    (图片来源网络,侵删)
    • Authorization: 这是身份验证的关键。Bearer 是一种标准的认证方案,后面跟着你的 API 密钥。
    • Content-Type: 告诉服务器我们发送的是 JSON 数据。
  4. 发送请求 (requests.post):

    • 我们向 API_URL 发送一个 POST 请求,并附带上我们构建的 headerspayloadjson.dumps(payload) 将 Python 字典转换为 JSON 字符串。
  5. 处理响应:

    • response.raise_for_status(): 这是一个很好的实践,如果请求失败(API 密钥错误或服务器内部错误),它会抛出 HTTPError 异常。
    • response.json(): 将服务器返回的 JSON 文本解析成 Python 字典,方便我们访问其中的数据。
    • 提取答案: 答案被嵌套在多层结构中:response_data['choices'][0]['message']['content']
    • 提取引用: 引用信息存储在 response_data['citations'] 列表中,每个引用都是一个包含元数据的字典。

第 3 步:进阶用法(封装成函数)

为了方便重用,我们可以将上述逻辑封装成一个函数。

import requests
import json
# --- 配置 (与上面相同) ---
PERPLEXITY_API_KEY = "YOUR_PERPLEXITY_API_KEY"
API_URL = "https://api.perplexity.ai/chat/completions"
def ask_perplexity(query: str, model: str = "llama-3.1-sonar-small-128k-online", search_focus: str = "web"):
    """
    调用 Perplexity API 并返回答案和引用。
    :param query: 用户的问题
    :param model: 使用的模型名称
    :param search_focus: 搜索焦点 ("web", "academic", "recent")
    :return: 一个包含 'answer' 和 'citations' 的字典,如果出错则返回 None
    """
    payload = {
        "model": model,
        "messages": [
            {"role": "user", "content": query}
        ],
        "max_tokens": 1000,
        "temperature": 0.2,
        "top_p": 0.9,
        "search_focus": search_focus,
        "return_images": False,
        "return_related_questions": False,
        "stream": False,
        "frequency_penalty": 1,
        "presence_penalty": 1
    }
    headers = {
        "Authorization": f"Bearer {PERPLEXITY_API_KEY}",
        "Content-Type": "application/json"
    }
    try:
        response = requests.post(API_URL, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        response_data = response.json()
        answer = response_data['choices'][0]['message']['content']
        citations = response_data.get("citations", [])
        return {
            "answer": answer,
            "citations": citations
        }
    except requests.exceptions.RequestException as e:
        print(f"请求 Perplexity API 时出错: {e}")
        return None
# --- 使用封装好的函数 ---
if __name__ == "__main__":
    # 第一次提问
    question1 = "解释一下量子计算的基本原理。"
    result1 = ask_perplexity(question1, search_focus="academic")
    if result1:
        print(f"问题: {question1}")
        print(f"\n答案: {result1['answer']}")
        if result1['citations']:
            print("\n引用来源:")
            for i, citation in enumerate(result1['citations']):
                url = citation.get('metadata', {}).get('url')
                if url:
                    print(f"- {url}")
    print("\n" + "="*50 + "\n")
    # 第二次提问
    question2 = "最近发生了什么重要的科技新闻?"
    result2 = ask_perplexity(question2, search_focus="recent")
    if result2:
        print(f"问题: {question2}")
        print(f"\n答案: {result2['answer']}")
        if result2['citations']:
            print("\n引用来源:")
            for i, citation in enumerate(result2['citations']):
                url = citation.get('metadata', {}).get('url')
                if url:
                    print(f"- {url}")

这个封装后的版本更加清晰和模块化,你可以轻松地在项目的任何地方调用 ask_perplexity 函数来获取信息。

通过以上步骤,你已经成功地学会了如何使用 Python 和 requests 库来调用 Perplexity API,核心要点是:

  1. 获取并安全保管 API 密钥
  2. 构建正确的 JSON 请求体,特别是 messages 和模型参数。
  3. 设置正确的 Authorization 请求头
  4. 解析返回的 JSON 数据,并从 choicescitations 字段中提取所需信息。

现在你可以开始构建自己的智能问答、研究助手或任何需要实时信息检索能力的 Python 应用了!

分享:
扫描分享到社交APP
上一篇
下一篇