使用AI構(gòu)建全棧簡(jiǎn)歷篩選應(yīng)用
DeepSeek開(kāi)源AI模型的發(fā)布在技術(shù)界引起了很多興奮。它允許開(kāi)發(fā)人員完全在本地構(gòu)建應(yīng)用程序,而無(wú)需連接到在線AI模型(例如Claude,Chatgpt等)。開(kāi)源模型在構(gòu)建與生成AI集成的企業(yè)應(yīng)用程序時(shí)為新機(jī)會(huì)打開(kāi)了大門(mén)。
在本文中,您將學(xué)習(xí)如何在個(gè)人機(jī)器上本地運(yùn)行這樣的模型,并構(gòu)建全棧React和Nodejs驅(qū)動(dòng)的應(yīng)用程序,而不僅僅是另一個(gè)聊天機(jī)器人。您將能夠使用此應(yīng)用程序來(lái)更快地分析簡(jiǎn)歷并做出更明智的招聘決定。在構(gòu)建應(yīng)用程序之前,重要的是要了解開(kāi)源LLM的好處。
開(kāi)源大語(yǔ)模型的好處
開(kāi)源模型與使用專(zhuān)有模型相對(duì)于使用專(zhuān)有模型提供了一些關(guān)鍵好處:
具有成本效益且無(wú)許可證
開(kāi)源LLM具有成本效益,不需要特殊許可。例如,截至撰寫(xiě)本文的日期,OpenAI的O1的成本為每百萬(wàn)美元的產(chǎn)出代幣,開(kāi)源DeepSeek R1的價(jià)格為2.19美元。
可自定義且可調(diào)
開(kāi)源模型可以輕松地進(jìn)行微調(diào)以滿足獨(dú)特的業(yè)務(wù)案例 - 允許構(gòu)建更多特定于領(lǐng)域的用例。這導(dǎo)致企業(yè)應(yīng)用程序中的優(yōu)化性能。
增強(qiáng)數(shù)據(jù)安全性和隱私
開(kāi)源使應(yīng)用程序更加安全,因?yàn)閷氋F的個(gè)人數(shù)據(jù)不需要上傳到第三方服務(wù)器,并且只能停留在本地機(jī)器或公司網(wǎng)絡(luò)上僅留在本地機(jī)器或公司網(wǎng)絡(luò)中。這提供了很高的數(shù)據(jù)安全性。此外,可以對(duì)開(kāi)源模型進(jìn)行微調(diào)以刪除所有數(shù)據(jù)偏差。
社區(qū)驅(qū)動(dòng),沒(méi)有供應(yīng)商鎖定
開(kāi)源模型享有巨大的社區(qū)支持,并受益于功能開(kāi)發(fā)的快速發(fā)展。另一方面,使用屬性模型使應(yīng)用程序供應(yīng)商鎖定并依賴(lài)供應(yīng)商公司提供功能更新。
借助此信息,您可以使用DeepSeek R1開(kāi)源模型,Node.js和React構(gòu)建一個(gè)真實(shí)的應(yīng)用程序。
項(xiàng)目和建筑概述
您將構(gòu)建簡(jiǎn)歷分析儀的應(yīng)用程序 - 它將幫助您了解上傳簡(jiǎn)歷的好處和缺點(diǎn)。 DeepSeek R1 LLM將分析上傳的簡(jiǎn)歷并提供反饋。您可以通過(guò)下面的插圖了解應(yīng)用程序的體系結(jié)構(gòu)。
建筑圖
基于React的用戶界面使用REST API與基于NODEJS的后端進(jìn)行通信。然后,Nodejs后端將用戶請(qǐng)求發(fā)送到使用Ollama托管的DeepSeek R1。整個(gè)技術(shù)堆棧可以在單臺(tái)計(jì)算機(jī)上運(yùn)行,就像您在整個(gè)文章中所做的那樣,也可以在更復(fù)雜的用例中托管多個(gè)容器。
先決條件
· 要運(yùn)行該項(xiàng)目,您將需要一臺(tái)具有一些計(jì)算功率的計(jì)算機(jī),最好是具有NVIDIA圖形卡的計(jì)算機(jī)。該項(xiàng)目已在NVIDIA 4090RTX基于Windows Machine和M2 MacBook Pro上開(kāi)發(fā)和測(cè)試。
· 您需要在計(jì)算機(jī)上安裝NodeJ。該項(xiàng)目已建立在Nodejs版本22.3.0上。您可以使用命令驗(yàn)證nodejs安裝node -v。
· 您還需要您選擇的編輯來(lái)完成代碼。 構(gòu)建應(yīng)用程序時(shí)已經(jīng)使用了Visual Studio代碼,通常建議使用。
在本地設(shè)置并運(yùn)行DeepSeek
要在本地運(yùn)行DeepSeek R1,請(qǐng)按照以下步驟操作:
1。從其官方網(wǎng)站安裝Ollama 。
2。安裝完成后,您將能夠使用ollama run計(jì)算機(jī)終端中的命令運(yùn)行模型。
3。運(yùn)行您選擇的DeepSeek模型。本教程是使用DeepSeek R1 8-Billon參數(shù)模型構(gòu)建的。您可以使用命令來(lái)運(yùn)行它ollama run deepseek-r1:8b。
4。如果您的規(guī)范計(jì)算機(jī)比前提條件部分中提到的機(jī)器較低,則7b和1.5b參數(shù)模型也將起作用,但是生成的輸出質(zhì)量可能較低。
5。模型可能需要花費(fèi)一些時(shí)間才能下載,因?yàn)樗鼈冃枰螺d。模型運(yùn)行后,您應(yīng)該能夠在終端中提出一個(gè)問(wèn)題并獲取輸出。您可以參考下面的插圖,以查看行動(dòng)中的DeepSeek R1 8B模型。
Ollama DeepSeek R1
6。DeepSeekR1是一種推理模型,因此,它在給出可以產(chǎn)生的第一個(gè)答案之前就考慮了。正如上面插圖中強(qiáng)調(diào)的那樣,它在給我們提示的答案之前就在思考??梢栽跇?biāo)簽中看到這種想法 。
克隆和運(yùn)行nodejs后端
Ollama服務(wù)也可以通過(guò)API訪問(wèn)。您將利用此API并構(gòu)建基于Nodejs的后端層。該層將從用戶中取上上載的PDF并從中提取文本。文本提取后,后端將通過(guò)Ollama API將文本饋送到DeepSeek R1模型,并恢復(fù)響應(yīng)。此響應(yīng)將發(fā)送給客戶端以顯示給用戶。
1。使用此URL從GitHub克隆后端項(xiàng)目。理想情況下,您應(yīng)該分配項(xiàng)目,然后克隆自己的本地副本。
2??寺『螅\(yùn)行項(xiàng)目,請(qǐng)使用CD轉(zhuǎn)到項(xiàng)目根目錄deepseek-ollama-backend。
3。一旦進(jìn)入項(xiàng)目根,就通過(guò)給出npm install命令來(lái)安裝依賴(lài)項(xiàng)。安裝完成后,可以使用命令運(yùn)行項(xiàng)目npm start。項(xiàng)目的核心是app.js 文件。檢查下面提供的代碼。
const express = require('express');
const multer = require('multer');
const pdfParse = require('pdf-parse');
const axios = require('axios');
const fs = require('fs');
const cors = require('cors');
const app = express();
app.use(cors());
app.use(express.json());
const upload = multer({
dest: 'uploads/',
fileFilter: (req, file, cb) => {
file.mimetype === 'application/pdf' ? cb(null, true) : cb(new Error('Only PDF files are allowed!'));
}
}).single('pdfFile');
app.post('/analyze-pdf', (req, res) => {
upload(req, res, async function(err) {
if (err) {
return res.status(400).json({ error: 'Upload error', details: err.message });
}
try {
if (!req.file) {
return res.status(400).json({ error: 'No PDF file uploaded' });
}
const dataBuffer = fs.readFileSync(req.file.path);
const data = await pdfParse(dataBuffer);
const pdfText = data.text;
fs.unlinkSync(req.file.path);
const response = await axios.post('http://127.0.0.1:11434/api/generate', {
model: "deepseek-r1:8b",
prompt: `Analyze this resume. Resume text is between two --- given ahead: ---${pdfText}---`,
stream: false
});
res.json({ success: true, message: 'Successfully connected to Ollama', ollamaResponse: response.data });
} catch (error) {
if (req.file && fs.existsSync(req.file.path)) {
fs.unlinkSync(req.file.path);
}
res.status(500).json({ error: 'Error processing PDF', details: error.message });
}
});
});
if (!fs.existsSync('uploads')) {
fs.mkdirSync('uploads');
}
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
4。客戶通過(guò)調(diào)用/analyze-pdf類(lèi)型的API端點(diǎn)與后端進(jìn)行交互POST??蛻舳藢⒂脩魟h除的PDF文件作為有效載荷發(fā)送給此API。
5。服務(wù)器將該文件uploads臨時(shí)存儲(chǔ)在目錄中,并將文本提取在文件中。
6。然后使用Ollama的Localhost API端點(diǎn)提示DeepSeek R1 。
7。DeepSeek R1分析了簡(jiǎn)歷的內(nèi)容并提供了反饋。然后,使用此分析使用該服務(wù)器對(duì)客戶端響應(yīng)res.json()。
克隆和運(yùn)行React用戶界面
該項(xiàng)目的用戶界面將允許用戶上傳簡(jiǎn)歷,將此簡(jiǎn)歷發(fā)送到后端,然后將DeepSeek R1簡(jiǎn)歷分析的結(jié)果顯示給用戶。它還將顯示內(nèi)部思想鏈或?qū)eepSeek R1的思考。
1。要開(kāi)始,分叉然后從此Github URL中克隆該項(xiàng)目。如果您不打算進(jìn)行許多自定義,則可以簡(jiǎn)單地克隆它。
2。克隆項(xiàng)目后,使用命令轉(zhuǎn)到根項(xiàng)目目錄cd deepseek-ollama-frontend。
3。在項(xiàng)目根部?jī)?nèi),使用npm install命令安裝必要的依賴(lài)項(xiàng)。安裝完成后,使用命令啟動(dòng)項(xiàng)目npm run dev。
4。此React應(yīng)用的主要組成部分是重新分析儀。在您選擇的編輯中打開(kāi)它并進(jìn)行分析。
5。此組件提供了一個(gè)輸入字段供用戶上傳文件。
6。上傳的文件使用API端點(diǎn)發(fā)送到服務(wù)器。
7.服務(wù)器的響應(yīng)分為兩個(gè)部分的內(nèi)部思考和模型的實(shí)際響應(yīng)。
8。該AnalysisSection組件顯示模型的響應(yīng)以及包含ExpandableSection組件,該組件用于顯示DeepSeek R1的內(nèi)部思維。
9。導(dǎo)航到瀏覽器中的URL加載應(yīng)用程序。上傳您的簡(jiǎn)歷(或任何樣本簡(jiǎn)歷),并觀察DeepSeek R1收到的分析。
結(jié)論
DeepSeek R1提供了一個(gè)獨(dú)特的機(jī)會(huì),可以在內(nèi)部完全 構(gòu)建Genai-Power應(yīng)用程序,并根據(jù)您的需求對(duì)其進(jìn)行自定義。
在本文中,您了解了使用開(kāi)源Genai模型的好處。此外,您已經(jīng)使用DeepSeek R1,Node.js和React設(shè)置了一個(gè)真實(shí)的應(yīng)用程序。此設(shè)置使您可以使用AI完全離線執(zhí)行簡(jiǎn)歷分析。您可以使用此工具在您的組織中雇用SMART,我建議您繼續(xù)基于本文獲得的知識(shí)并探索更多用例和應(yīng)用程序。