一分鐘帶你上手Python調(diào)用DeepSeek的API
前言
最近DeepSeek非?;?,作為一枚對(duì)前言技術(shù)非常關(guān)注的程序員來(lái)說(shuō),自然都想對(duì)接DeepSeek的API來(lái)體驗(yàn)一把。
目前DeepSeek對(duì)接API是收費(fèi)的,需要充值獲取Tokens,在對(duì)話和推理過(guò)程會(huì)消耗token。
免費(fèi)體驗(yàn)
截至2025年2月8日注冊(cè)都還會(huì)贈(zèng)送10元,一個(gè)月有效期,相當(dāng)于有一個(gè)免費(fèi)體驗(yàn)期,10元夠發(fā)起很多次對(duì)話了。
具體能夠發(fā)起多少次對(duì)話,我們不妨就基于這個(gè)問(wèn)題,讓DeepSeek給我們解答下。
根據(jù)ds給出得答案,10元大概能夠調(diào)用1到5千次,那位小伙伴解答下是否正確。
API-Key申請(qǐng)
申請(qǐng)非常簡(jiǎn)單,直接在首頁(yè)點(diǎn)擊進(jìn)入【API開(kāi)發(fā)平臺(tái)】>【API keys】>【創(chuàng)建API key】>【輸入一個(gè)名稱】,創(chuàng)建完成后,還可以修改名稱,以及刪除。
首次調(diào)用API
拿到API-Key之后,可以點(diǎn)擊接口文檔,使用首次調(diào)用API-Python例子開(kāi)始嘗試調(diào)用返回內(nèi)容。
# Please install OpenAI SDK first: `pip3 install openai` from openai import OpenAI client = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com") response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "You are a helpful assistant"}, {"role": "user", "content": "Hello"}, ], stream=False ) print(response.choices[0].message.content)
為什么deepseek是安裝openAI SDK
這個(gè)有點(diǎn)意思,博主搜了下,得到回答是:DeepSeek使用OpenAI的SDK和API主要是因?yàn)镺penAI的大模型在業(yè)界具有領(lǐng)先地位,其標(biāo)準(zhǔn)和規(guī)范被廣泛接受和使用。
基本概念
最小單元
Token 是模型用來(lái)表示自然語(yǔ)言文本的的最小單位,可以是一個(gè)詞、一個(gè)數(shù)字或一個(gè)標(biāo)點(diǎn)符號(hào)等。
DS將根據(jù)模型輸入和輸出的總 token 數(shù)進(jìn)行計(jì)量計(jì)費(fèi)。
推理模型
deepseek-reasoner 是 DeepSeek 推出的推理模型。在輸出最終回答之前,模型會(huì)先輸出一段思維鏈內(nèi)容,以提升最終答案的準(zhǔn)確性。我們的 API 向用戶開(kāi)放 deepseek-reasoner 思維鏈的內(nèi)容,以供用戶查看、展示、蒸餾使用。
在每一輪對(duì)話過(guò)程中,模型會(huì)輸出思維鏈內(nèi)容(reasoning_content)和最終回答(content)。在下一輪對(duì)話中,之前輪輸出的思維鏈內(nèi)容不會(huì)被拼接到上下文中,如下圖所示:
智能體
創(chuàng)建過(guò)AI應(yīng)用和智能體的小伙伴都知道,都是基于界面可視化頁(yè)面進(jìn)行創(chuàng)建和使用。
對(duì)于API,實(shí)際上在代碼層面進(jìn)行智能體創(chuàng)建,基礎(chǔ)的元素包括chat的人設(shè)(提示詞Prompt)和用戶提問(wèn)兩部分。
代碼層對(duì)話
下面就創(chuàng)建一個(gè)《李白》智能體進(jìn)行對(duì)話。
角色設(shè)定
先給智能體進(jìn)行角色定位,就是給智能體加上提示詞Prompt。
當(dāng)然你也可以根據(jù)創(chuàng)建智能體一樣進(jìn)行詳細(xì)設(shè)定,這里博主就簡(jiǎn)單一句話給智能體進(jìn)行綁定。
一般角色設(shè)定的提示詞是不會(huì)變的,只會(huì)在調(diào)優(yōu)或者未能達(dá)到自己滿意情況下進(jìn)行提示詞調(diào)整。
你是一位唐朝大詩(shī)人李白,你只能回答李白相關(guān)的問(wèn)題,超出李白范圍的友好提示。
用戶對(duì)話
這里就是界面輸入框用戶輸入的內(nèi)容。
自定義界面
基于上面兩個(gè)關(guān)鍵參數(shù),就能夠定制屬于自己的一個(gè)智能體對(duì)話界面。
前提需要封裝好一個(gè)api接口方法,傳遞用戶提問(wèn)的參數(shù),最后返回DeepSeek響應(yīng)的內(nèi)容。
后端API
將上面代碼設(shè)置成路由,可進(jìn)行Get請(qǐng)求的API接口。
溫馨提示:輸出內(nèi)容記得Unicode轉(zhuǎn)義,同時(shí)記得設(shè)置可跨域-flask_cors。
主要依賴Flask進(jìn)行路由設(shè)置,需要先安裝。
from flask import Flask, request, jsonify from flask_cors import CORS from openai import OpenAI import json app = Flask(__name__) cors = CORS(app) # 這將允許所有域的跨域請(qǐng)求 # 配置OpenAI客戶端 openai_client = OpenAI(api_key="你的deepseek的key", base_url="https://api.deepseek.com") # 系統(tǒng)提示(用于OpenAI API交互) system_prompt = "你是一位唐朝大詩(shī)人李白,你只能回答李白相關(guān)的問(wèn)題,超出李白范圍的友好提示。" # 用戶內(nèi)容(這里可以固定,也可以從GET請(qǐng)求的參數(shù)中獲取,但為了簡(jiǎn)化,我們固定它) # 注意:在實(shí)際應(yīng)用中,用戶內(nèi)容應(yīng)該從請(qǐng)求參數(shù)中安全地獲取和處理 # user_content = "輸出一首關(guān)于月亮的李白風(fēng)格的詩(shī)" @app.route('/generate_text/<user_content>', methods=['GET']) def generate_text(user_content): try: # 與OpenAI API交互,生成文本 response = openai_client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_content}, ], stream=False ) # 從響應(yīng)中提取生成的文本(這里假設(shè)響應(yīng)結(jié)構(gòu)是已知的) generated_text = response.choices[0].message.content # 默認(rèn)輸出的是編碼值:\u300a\u6708\u4e0b\u72ec\u914c\u300b # 返回生成的文本作為API的響應(yīng) #return jsonify(json.loads(json.dumps({"generated_text": generated_text}))) return jsonify({"generated_text": generated_text}) except Exception as e: # 在出現(xiàn)異常時(shí)返回錯(cuò)誤信息 return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(debug=True)
前端代碼
同樣是使用DeepSeek進(jìn)行代碼生成,直接生成一個(gè)對(duì)話vue3前端界面,需要進(jìn)行多輪對(duì)話進(jìn)行調(diào)整滿意的vue代碼。
然后進(jìn)行api接口調(diào)用測(cè)試效果。
<template> <div class="chat-interface"> <el-card shadow="hover"> <div class="chat-history"> <div v-for="(message, index) in messages" :key="index" class="chat-message"> <div :class="{'message-user': message.type === 'user', 'message-bot': message.type === 'bot'}"> <span class="avatar" :style="{ backgroundColor: message.type === 'user' ? '#409EFF' : '#F56C6C' }"> {{ message.type === 'user' ? '我' : '李白' }} </span> <div class="content"> {{ message.content }} </div> </div> </div> </div> <div class="input-area"> <el-input v-model="userInput" placeholder="輸入你的問(wèn)題" class="input-box" clearable></el-input> <el-button type="primary" @click="sendMessage" :loading="loadingFlag">發(fā)送</el-button> </div> </el-card> </div> </template> <script setup lang="ts" name="batchPortfolio"> import { ref } from 'vue'; import axios from 'axios'; const loadingFlag=ref(false) const userInput = ref(''); const messages: { type: 'user' | 'bot'; content: string }[]= ref([]); const sendMessage = async () => { if (userInput.value.trim()) { messages.value.push({ type: 'user', content: `${userInput.value}` }); loadingFlag.value=true; const response = await axios.get(`http://127.0.0.1:5000/generate_text/${userInput.value}`); loadingFlag.value=false; // 機(jī)器人回復(fù) setTimeout(() => { messages.value.push({ type: 'bot', content: `${response.data.generated_text}` }); }, 100); // // 模擬機(jī)器人回復(fù) // setTimeout(() => { // messages.value.push({ type: 'bot', content: `機(jī)器人回復(fù): ${userInput.value.split(' ').join(' ')} 的回復(fù)` }); // }, 1000); userInput.value = ''; } }; </script> <style scoped lang="scss"> .chat-interface { max-width: 600px; margin: 0 auto; padding: 20px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); border-radius: 8px; background-color: #fff; } .chat-history { padding: 16px; overflow-y: auto; max-height: 400px; border-bottom: 1px solid #ebeef5; } .chat-message { margin-bottom: 16px; align-items: center; } .message-user { display: flex; align-items: center; justify-content: flex-end; line-height: 40px; text-align: center; color: #fff; } .message-bot { display: flex; align-items: center; line-height: 40px; text-align: center; color: #fff; } .avatar { width: 40px; height: 40px; border-radius: 50%; margin-right: 12px; } .message-user .avatar { background-color: #409EFF; } .message-bot .avatar { background-color: #F56C6C; } .content { max-width: calc(100% - 52px); /* 40px avatar + 12px margin */ padding: 8px 16px; border-radius: 4px; background-color: #f0f0f0; color: #333; } .message-bot .content { background-color: #fff3e0; justify-content: flex-start; } .message-user .content { background-color: #e6f7ff; } .input-area { display: flex; padding: 16px; border-top: 1px solid #ebeef5; } .input-box { flex: 1; border-radius: 4px; } .el-button { margin-left: 12px; } </style>
總結(jié)
DeepSeek的API對(duì)接,絕對(duì)是博主目前對(duì)接最快的一個(gè),非常簡(jiǎn)潔清晰,沒(méi)有那么多花里胡哨的東西和文檔,從創(chuàng)建api-key到直接調(diào)用api和返回?cái)?shù)據(jù)不到一分鐘就搞定。
當(dāng)然,后續(xù)生成vue對(duì)話界面肯定需要自己花點(diǎn)時(shí)間多輪對(duì)話生成,以及python封裝成路由訪問(wèn)的api。同樣也是可以使用DS完成。
到此這篇關(guān)于一分鐘帶你上手Python調(diào)用DeepSeek的API的文章就介紹到這了,更多相關(guān)Python調(diào)用DeepSeek API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python批量導(dǎo)出mysql數(shù)據(jù)庫(kù)表結(jié)構(gòu)的操作實(shí)例
這篇文章主要給大家介紹了關(guān)于利用Python批量導(dǎo)出mysql數(shù)據(jù)庫(kù)表結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-08-08使用50行Python代碼從零開(kāi)始實(shí)現(xiàn)一個(gè)AI平衡小游戲
本文會(huì)為大家展示機(jī)器學(xué)習(xí)專家 Mike Shi 如何用 50 行 Python 代碼創(chuàng)建一個(gè) AI,使用增強(qiáng)學(xué)習(xí)技術(shù),玩耍一個(gè)保持桿子平衡的小游戲。本文給大家?guī)?lái)實(shí)現(xiàn)思路及簡(jiǎn)單代碼,感興趣的朋友跟隨小編一起看看吧2018-11-11Python中的os.path路徑模塊中的操作方法總結(jié)
os.path模塊主要集成了針對(duì)路徑文件夾的操作功能,這里我們就來(lái)看一下Python中的os.path路徑模塊中的操作方法總結(jié),需要的朋友可以參考下2016-07-07Python3基礎(chǔ)之list列表實(shí)例解析
這篇文章主要介紹了Python3的list列表用法,這是Python3數(shù)據(jù)類型中非常常見(jiàn)的應(yīng)用,需要的朋友可以參考下2014-08-08