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

核心概念
Perplexity API 的核心工作流程如下:
- 发送请求:你向 Perplexity 的 API 端点发送一个 HTTP POST 请求。
- 请求体:请求体是一个 JSON 对象,其中包含你的问题(
query)和一些可选的参数,比如模型、搜索焦点、来源过滤等。 - 接收响应:API 返回一个 JSON 响应,其中包含 AI 生成的答案、引用的来源链接以及相关的元数据。
- 处理结果:在你的 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 安装:

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}")
代码解析
-
配置:
PERPLEXITY_API_KEY: 请务必修改这里为你自己的密钥。API_URL: 这是 Perplexity API 的固定地址。query: 你想问的问题,可以随时修改。
-
构建请求载荷 (
payload):- 这是一个 Python 字典,它会被转换成 JSON 格式发送给服务器。
model: 指定要使用的模型,Perplexity 会不断更新其模型列表,你可以查看他们的官方文档了解可用的模型。messages: 这是一个消息列表,是现代 AI API 的标准格式,我们只包含了一条用户消息。search_focus: 这是一个非常实用的参数,web会进行常规网络搜索,academic会侧重于学术资源,recent会查找最新的信息。stream: 设为False时,API 会等待完整生成答案后一次性返回,设为True时,API 会像聊天一样逐字返回结果,这需要更复杂的处理逻辑。
-
设置请求头 (
headers):
(图片来源网络,侵删)Authorization: 这是身份验证的关键。Bearer是一种标准的认证方案,后面跟着你的 API 密钥。Content-Type: 告诉服务器我们发送的是 JSON 数据。
-
发送请求 (
requests.post):- 我们向
API_URL发送一个 POST 请求,并附带上我们构建的headers和payload。json.dumps(payload)将 Python 字典转换为 JSON 字符串。
- 我们向
-
处理响应:
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,核心要点是:
- 获取并安全保管 API 密钥。
- 构建正确的 JSON 请求体,特别是
messages和模型参数。 - 设置正确的
Authorization请求头。 - 解析返回的 JSON 数据,并从
choices和citations字段中提取所需信息。
现在你可以开始构建自己的智能问答、研究助手或任何需要实时信息检索能力的 Python 应用了!
