Python实现DeepSeek API调用指南
1 获取API
获得deepseek开放平台的API https://platform.deepseek.com/api_keys
点击创建API key
2 调用方法
方法一:采用openai的调用方法
pip install openai
需要openai 的包
调用的代码框架
from openai import OpenAI
import os
client=OpenAI(
api_key='自己的API key',
base_url='https://api.deepseek.com'
)
response = client.chat.completions.create(
messages=[
{'role':'system','content':'你是一个历史的专家'},
{'role':'user','content':'李世民为何攻打隋朝?'}
],
model='deepseek-chat',
max_tokens=1024,
temperature=0.7,
stream=False
)
print(response.choices[0].message.content)
output:李世民攻打隋朝的原因主要是隋朝末年的政治腐败和社会动荡。隋炀帝杨广的暴政导致了民不聊生,农民起义频繁爆发,社会秩序严重混乱。李世民作为唐朝的开国皇帝李渊的次子,看到了隋朝的衰败和民众的不满,决定起兵反抗隋朝的统治。他联合其他反隋势力,最终推翻了隋朝,建立了唐朝。李世民的行动不仅是为了推翻暴政,也是为了恢复社会秩序和民众的福祉,这为他后来成为一代明君奠定了基础。
方法二:采用类似爬虫的方法
使用requests包来调用,类似于爬虫的方法
# 1)设置URL和API key
url="https://api.deepseek.com"
API_KEY="自己的API key"
# 2)设置请求头
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
#3)构建请求体
req = json.dumps({
"messages":[
{'role':'system','content':'你是一个历史的专家'},
{'role':'user','content':"李世民为何攻打隋朝?"}
],
"model": "deepseek-chat",
"temperature": 0.7,
"max_tokens": 1024,
"top_p": 1,
"frequency_penalty": 0,
"presence_penalty": 0,
"response_format": {
"type": "text"
},
"stream": False,
"strem_options":None,
"stop":["\n\n"],
"top_p":1,
"tools":None,
"tool_choice":None,
"logprobs":None,
"top_logprobs":None
})
# 4) 发送请求并处理响应
response=requests.request("POST",f"{url}/chat/completions",headers=headers,data=req)
answer=response.json()["choices"][0]["message"]["content"]
print(answer)
2)中的请求头参数
3)中构建了请求体,将其转换成JSON格式,其字段的含义:
messages:包含历史对话和当前用户输入的信息,系统消息(你是一个历史的专家)和用户消息(李世民为何攻打隋朝?),有不同的角色标志
model:指定的模型名称,deepseek-chat就是其中的一个模型
temperature: 控制生成内容的随机性。值越大,生成内容越随机;值越小,生成内容越确定。取值范围为 0 到 2。默认值为 1。如果需要更确定的回答,可以设置为 0.7;如果需要更多创意,可以设置为 1.2。
max_tokens:限制生成文本的最大长度,控制生成文本的最大长度(以 token 为单位)。1 个 token 大约等于 1 个英文单词或 2 个中文字符。根据需求调整。如果需要长文本,可以设置为 4096;如果只需要简短回答,可以设置为 100 到 500。
top_p:控制生成内容的多样性。top_p 是一种采样策略,值越小,生成内容越集中;值越大,生成内容越多样。取值范围为 0 到 1。默认值为 1。如果需要更集中的回答,可以设置为 0.9。
frequency_penalty:控制重复内容的惩罚力度,值越大模型越倾向于生成不重复的内容,取值范围-2.0到2.0,默认值为0,适用于大多数场景,如需减少重复,可以设置为 0.5 到 1.0
presence_penalty:控制生成内容中新主题的引入。值越大,模型越倾向于引入新主题。取值范围为 -2.0 到 2.0。默认值为 0,适用于大多数场景。如果需要更多新主题,可以设置为 0.5 到 1.0。
”response_format“: {“type”: “text”}:指定返回内容的格式。type 可以是 text 或 json,分别表示返回纯文本或 JSON 格式的数据。默认值为 text,适用于大多数场景。如果需要结构化数据,可以设置为 json。
stream:是否启用流式传输。如果设置为 True,API 会以流式方式返回数据,适用于需要实时显示生成内容的场景。默认值为 False。如果需要实时显示,可以设置为 True。
stop:定义停止生成文本的条件。可以是一个字符串或字符串列表。当生成的文本包含这些字符串时,停止生成。默认值为 None,表示不设置停止条件。如果需要控制生成长度,可以设置为 [“\n”]。
tools:指定使用的工具或插件。DeepSeek 可能支持一些外部工具或插件,可以通过这个字段指定。默认值为 None。如果有特殊需求,可以参考官方文档。
tool_choice:指定是否强制使用工具。如果设置为 “auto”,模型会自动选择是否使用工具。默认值为 “none”。
logprobs:是否返回生成内容的概率信息。如果设置为 True,API 会返回每个 token 的概率。默认值为 False。
top_logprobs: 返回概率最高的 token 数量。如果 logprobs 为 True,可以通过这个字段指定返回多少个概率最高的 token。默认值为 None。如果需要详细分析,可以设置为 3 到 5。
4)中发送到http POST请求deepseek API,并处理返回响应
3 简单的多轮对话
多轮对话相当于在单轮对话的基础上,将之前几轮的对话都作为当前轮的message输入
例如,针对上述的对话
第一轮:
from openai import OpenAI
import os
client=OpenAI(
api_key='自己的API key',
base_url='https://api.deepseek.com'
)
messages=[
{'role':'system','content':'你是一个历史的专家'},
{'role':'user','content':'李世民为何攻打隋朝?'}
]
response = client.chat.completions.create(
model='deepseek-chat',
messages=messages,
max_tokens=1024,
temperature=0.7,
stream=False
)
answer = response.choices[0].message
print(f"Message Round1:{messages}")
第二轮:
将第一轮的answer作为第二轮的message输入到模型当中
messages.append(answer)
messages2= {'role':'user','content':'打赢了没有?'}
messages.append(messages2)
response = client.chat.completions.create(
model='deepseek-chat',
messages=messages,
max_tokens=1024,
temperature=0.7,
stream=False
)
answer2 = response.choices[0].message
print(f"Message Round2:{messages}")
多轮对话依次类推,可以写个循环来设定问题轮次。
作者:garfield_sun06