成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何運(yùn)用DeepSeek R1構(gòu)建一款全棧簡(jiǎn)歷篩選應(yīng)用

譯文 精選
人工智能
在本文中,我們將學(xué)習(xí)如何在個(gè)人設(shè)備上本地運(yùn)行開(kāi)源模型,進(jìn)而構(gòu)建一款由React和NodeJS驅(qū)動(dòng)的全棧應(yīng)用程序。它能幫助大家快速分析簡(jiǎn)歷內(nèi)容,并做出明智的招聘決策。在構(gòu)建之前,我們先聊聊開(kāi)源大模型的優(yōu)勢(shì)所在。

譯者 | 核子可樂(lè)

審校 | 重樓

在本文中,我們將共同了解如何使用DeepSeek R1大模型構(gòu)建智能簡(jiǎn)歷分析應(yīng)用,節(jié)約運(yùn)營(yíng)成本。

DeepSeek開(kāi)源大模型的發(fā)布已經(jīng)在技術(shù)社區(qū)引發(fā)巨大轟動(dòng)。如今,開(kāi)發(fā)者們無(wú)需接入Claude、ChatGPT等在線(xiàn)AI模型,即可輕松實(shí)現(xiàn)本地應(yīng)用程序構(gòu)建。換言之,開(kāi)源大模型準(zhǔn)入門(mén)檻的持續(xù)降低,為企業(yè)應(yīng)用程序與生成式AI的集成打通了機(jī)會(huì)之橋。

在本文中,我們將學(xué)習(xí)如何在個(gè)人設(shè)備上本地運(yùn)行開(kāi)源模型,進(jìn)而構(gòu)建一款由React和NodeJS驅(qū)動(dòng)的全棧應(yīng)用程序。它能幫助大家快速分析簡(jiǎn)歷內(nèi)容,并做出明智的招聘決策。在構(gòu)建之前,我們先聊聊開(kāi)源大模型的優(yōu)勢(shì)所在。

開(kāi)源大語(yǔ)言模型的優(yōu)勢(shì)

與專(zhuān)有模型相比,開(kāi)源大模型擁有以下幾個(gè)關(guān)鍵優(yōu)勢(shì):

經(jīng)濟(jì)高效且無(wú)需許可證

開(kāi)源大模型極具成本效益,無(wú)需特殊許可證。截至本文撰稿時(shí),OpenAI o1的每百萬(wàn)輸出token成本為60美元,而開(kāi)源DeepSeek R1的成本僅為2.19美元。

可定制、可微調(diào)

開(kāi)源大模型可輕松進(jìn)行微調(diào)以滿(mǎn)足獨(dú)特的業(yè)務(wù)需求,在更多特定領(lǐng)域支撐業(yè)務(wù)用例。

增強(qiáng)數(shù)據(jù)安全性與隱私性

寶貴的個(gè)人數(shù)據(jù)無(wú)需被上傳至第三方服務(wù)器,而僅保留在本地設(shè)備或企業(yè)網(wǎng)絡(luò)之內(nèi),因此應(yīng)用程序更加安全。此外,開(kāi)源模型還可進(jìn)行微調(diào)以消除數(shù)據(jù)偏差。

社區(qū)驅(qū)動(dòng),擺脫供應(yīng)商鎖定

開(kāi)源模型享有廣泛的社區(qū)支持,受益于快速功能開(kāi)發(fā),也避免了專(zhuān)有模型受供應(yīng)商鎖定、且高度依賴(lài)供應(yīng)商提供功能更新的弊端。

在了解上述背景信息后,下面直奔主題,了解如何使用DeepSeek R1開(kāi)源模型、Node.js和React構(gòu)建應(yīng)用程序。

項(xiàng)目與架構(gòu)概述

我們的目標(biāo)是構(gòu)建一款簡(jiǎn)歷分析器應(yīng)用,快速把握上傳簡(jiǎn)歷中的基本信息與申請(qǐng)者的優(yōu)缺點(diǎn)。DeepSeek R1大模型負(fù)責(zé)分析上傳的簡(jiǎn)歷并提供反饋。大家可通過(guò)下圖了解這款應(yīng)用的基本架構(gòu):

架構(gòu)示意圖

用戶(hù)界面由React開(kāi)發(fā),通過(guò)REST API與基于NodeJS的后端進(jìn)行通信。之后,NodeJS后端將用戶(hù)請(qǐng)求發(fā)送至由Ollama托管的DeepSeek R1。整個(gè)技術(shù)棧可在單一設(shè)備上運(yùn)行,亦可跨多個(gè)容器托管以支持更復(fù)雜的用例。

前期準(zhǔn)備

  • 要運(yùn)行此項(xiàng)目,你需要一臺(tái)具備一定性能的設(shè)備,最好搭載英偉達(dá)獨(dú)立顯卡。此項(xiàng)目已在配備英偉達(dá)4090RTX的Windows設(shè)備和M2 MacBook Pro上通過(guò)開(kāi)發(fā)測(cè)試。
  • 你還需要在設(shè)備上安裝NodeJS。本項(xiàng)目使用NodeJS 22.3.0版本,你可使用node -v 命令驗(yàn)證NodeJS的安裝情況。
  • 你還需要選定一款編輯器以處理代碼。本示例中使用Visual Studio Code,推薦你使用同款工具。

在本地設(shè)置并運(yùn)行DeepSeek

要在本地運(yùn)行DeepSeek R1,請(qǐng)遵循以下步驟:

  • 從官方網(wǎng)站處(https://ollama.com/)安裝Ollama。
  • 安裝完成后,即可使用設(shè)備終端上的 ollama run 命令運(yùn)行模型。
  • 運(yùn)行你選定的DeepSeek模型。本教程中使用DeepSeek R1 8B參數(shù)模型。你可使用 ollama run deepseek-r1:8b命令運(yùn)行該模型。
  • 如果你的硬件規(guī)格低于前期準(zhǔn)備部分的最低配置,亦可嘗試運(yùn)行7B及1.5B參數(shù)模型,但輸出質(zhì)量可能受到影響。
  • 模型首次運(yùn)行可能須耗費(fèi)一定時(shí)間,特別是下載過(guò)程。模型運(yùn)行之后,你可直接在終端中向其提問(wèn)并獲取輸出。你可參考下圖查看DeepSeek R1 8B模型的實(shí)際運(yùn)行情況。

Ollama DeepSeek R1

  • DeepSeek R1是一款推理模型,因此會(huì)先進(jìn)行思考、而后開(kāi)始生成答案。如上圖所示,它在給出答案前會(huì)列出思考過(guò)程,具體細(xì)節(jié)請(qǐng)參閱 <think> </think>標(biāo)簽。

克隆并運(yùn)行NodeJS后端

Ollama服務(wù)也可通過(guò)API訪(fǎng)問(wèn)。你可使用此API并構(gòu)建基于NodeJS的后端層,由該層獲取用戶(hù)上傳的PDF文件并從中提取文本內(nèi)容。提取完成后,后端將通過(guò)Ollama API將文本導(dǎo)入DeepSeek R1模型以獲取響應(yīng)。最終響應(yīng)結(jié)果將發(fā)送至客戶(hù)端并展示給用戶(hù)。

  • 使用此URL從GitHub克隆后端項(xiàng)目。這里推薦大家分叉該項(xiàng)目,而后克隆出自己的本地副本。
  • 克隆后,要運(yùn)行此項(xiàng)目,請(qǐng)使用cd deepseek-ollama-backend轉(zhuǎn)至項(xiàng)目根目錄。
  • 在根目錄內(nèi),使用npm install命令安裝依賴(lài)項(xiàng)。安裝完成后,即可使用npm start 命令運(yùn)行本項(xiàng)目。項(xiàng)目核心為app.js文件,其代碼內(nèi)容如下所示:
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}`);
});
  • 客戶(hù)端通過(guò)調(diào)用/analyze-pdfAPI端點(diǎn)與后端交互,此端點(diǎn)為POST類(lèi)型。客戶(hù)端將用戶(hù)上傳的pdf文件作為有效載荷發(fā)送至該API。
  • 服務(wù)器將此文件臨時(shí)存儲(chǔ)在uploads目錄中,并提取文件中的文本。
  • 服務(wù)器隨后使用Oolama的hocalhost API端點(diǎn)向DeepSeek R1傳遞提示詞。
  • DeepSeek R1分析簡(jiǎn)歷內(nèi)容并提供反饋,而后由服務(wù)器使用 res.json().將分析結(jié)果響應(yīng)給客戶(hù)端。

克隆并運(yùn)行React用戶(hù)界面

通過(guò)項(xiàng)目的用戶(hù)界面上傳簡(jiǎn)歷,即可將內(nèi)容發(fā)送至后端,而后向用戶(hù)展示DeepSeek R1的分析結(jié)果。其中還將包含DeepSeek R1的思考過(guò)程,即內(nèi)部思維鏈。

  • 首先,通過(guò)此GitHub URL分叉并克隆本項(xiàng)目。如果各位沒(méi)有定制需求,也可直接克隆。
  • 克隆完成后,使用命令 cd deepseek-ollama-frontend轉(zhuǎn)至項(xiàng)目根目錄。
  • 在根目錄下,使用npm install 命令安裝必要依賴(lài)項(xiàng)。安裝完成后,使用npm run dev命令啟動(dòng)本項(xiàng)目。
  • 示例React應(yīng)用的main組件為ResumeAnalyzer,你可在選定的編輯器中打開(kāi)并進(jìn)行分析。
import './ResumeAnalyzer.css';
import React, { useState } from 'react';
import { Upload, Loader2 } from 'lucide-react';
import AnalysisSection from './AnalysisSection';

const ResumeAnalyzer = () => {
  const [file, setFile] = useState(null);
  const [loading, setLoading] = useState(false);
  const [feedback, setFeedback] = useState(null);
  const [error, setError] = useState(null);

  const handleFileChange = (event) => {
    const selectedFile = event.target.files?.[0];
    if (selectedFile && selectedFile.type === 'application/pdf') {
      setFile(selectedFile);
      setError(null);
    } else {
      setError('Please upload a PDF file');
      setFile(null);
    }
  };

  const analyzePDF = async () => {
    if (!file) return;

    setLoading(true);
    setError(null);

    try {
      const formData = new FormData();
      formData.append('pdfFile', file);

      const response = await fetch('http://localhost:3000/analyze-pdf', {
        method: 'POST',
        body: formData,
      });

      if (!response.ok) {
        const errorData = await response.json();
        throw new Error(errorData.details || 'Failed to analyze PDF');
      }

      const data = await response.json();
      setFeedback(data);
    } catch (err) {
      setError(err.message || 'An error occurred');
    } finally {
      setLoading(false);
    }
  };

  return (
    <div className="max-w-4xl mx-auto p-4">
      <div className="bg-gray-50 rounded-lg shadow-lg p-6">
        <h1 className="text-3xl font-bold mb-6 text-gray-800">Resume Analyzer</h1>

        <div className="bg-white rounded-lg shadow-sm p-8">
          <div className="border-2 border-dashed border-gray-300 rounded-lg p-8 text-center">
            <Upload className="w-12 h-12 text-gray-400 mx-auto mb-4" />
            <input
              type="file"
              accept=".pdf"
              onChange={handleFileChange}
              className="hidden"
              id="file-upload"
            />
            <label
              htmlFor="file-upload"
              className="cursor-pointer text-blue-600 hover:text-blue-800 font-medium"
            >
              Upload Resume (PDF)
            </label>
            {file && (
              <p className="mt-2 text-sm text-gray-600">
                Selected: {file.name}
              </p>
            )}
          </div>
        </div>

        {error && (
          <div className="mt-4 p-4 bg-red-50 text-red-700 rounded-lg border border-red-200">
            {error}
          </div>
        )}

        <button
          onClick={analyzePDF}
          disabled={!file || loading}
          className="mt-6 w-full bg-blue-600 text-white py-3 px-4 rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center font-medium transition-colors"
        >
          {loading ? (
            <>
              <Loader2 className="mr-2 h-5 w-5 animate-spin" />
              Analyzing Resume...
            </>
          ) : (
            'Analyze Resume'
          )}
        </button>

        {feedback && !loading && (
          <div className="mt-8">
            <h2 className="text-2xl font-bold mb-6 text-gray-800">Analysis Results</h2>
            {feedback.ollamaResponse && 
              <AnalysisSection ollamaResponse={feedback.ollamaResponse} />
            }
          </div>
        )}
      </div>
    </div>
  );
};

export default ResumeAnalyzer;
  • 此組件負(fù)責(zé)為用戶(hù)提供輸入字段以上傳文件。
  • 使用API端點(diǎn)將上傳的文件發(fā)送至服務(wù)器。
  • 服務(wù)器的響應(yīng)結(jié)果分為兩部分——模型的內(nèi)部思維鏈與模型的實(shí)際響應(yīng)內(nèi)容。
  • 其中 AnalysisSection 組件用于顯示DeepSeek R1的實(shí)際響應(yīng)結(jié)果,ExpandableSection組件則用于顯示模型的內(nèi)部思維過(guò)程。

在瀏覽器中導(dǎo)航至URL以加載示例應(yīng)用。之后即可上傳任意簡(jiǎn)歷并觀察DeepSeek R1生成的分析結(jié)果。

Resume Analyzer截屏

總結(jié)

DeepSeek R1讓我們擁有了以純本地方式構(gòu)建生成式AI驅(qū)動(dòng)應(yīng)用的能力,并可根據(jù)實(shí)際需求進(jìn)行靈活自定義。

在本文中,我們使用DeepSeek R1、Node.js與React構(gòu)建起一款具備實(shí)用價(jià)值的應(yīng)用程序,可完全離線(xiàn)使用并依托AI實(shí)現(xiàn)簡(jiǎn)歷分析。歡迎大家按照本文分享的流程探索更多用例和設(shè)計(jì)思路。

原文標(biāo)題:Building a Full-Stack Resume Screening Application With AI,作者:Anujkumarsinh Donvir

責(zé)任編輯:姜華 來(lái)源: 51CTO內(nèi)容精選
相關(guān)推薦

2025-01-27 12:30:07

2025-02-20 15:32:28

2025-02-25 08:20:50

AI程序員DeepSeek

2025-02-08 11:31:17

DeepseekR1模型

2025-02-12 12:12:59

2025-02-11 08:35:30

2025-02-07 13:10:06

2025-03-11 02:00:00

AI工具Token-AI

2025-02-03 06:00:00

2025-02-17 08:37:00

模型DeepSeekAI

2025-02-10 11:27:37

2025-03-31 08:00:00

AI模型測(cè)評(píng)

2025-02-06 09:28:00

2025-02-03 12:07:52

2025-02-17 07:35:00

DeepSeek模型數(shù)據(jù)

2025-02-03 00:00:55

DeepSeekRAG系統(tǒng)

2025-03-06 10:14:39

2022-02-12 00:00:00

架構(gòu)

2025-01-16 14:11:55

開(kāi)發(fā)框架LikeAdmin

2025-02-27 00:00:05

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一区二区三区在线观看 | 国产精品黄视频 | 国产欧美精品一区二区色综合 | 精品久久一区二区 | 色橹橹欧美在线观看视频高清 | 久久婷婷国产麻豆91 | www.欧美视频 | 久久精品国产精品青草 | 神马久久久久久久久久 | 四虎在线视频 | 黄色免费av | 国产成人精品一区二 | 日韩综合色| 精品视频一区二区三区在线观看 | 久草网站 | 久久av综合 | www国产成人免费观看视频,深夜成人网 | 免费观看www7722午夜电影 | 91在线网| 国产一区二区精品 | 国产精品一区一区 | 91影院在线观看 | 九九九国产 | 成人午夜黄色 | 午夜小电影 | 精品伦精品一区二区三区视频 | 九九综合 | 一区二区三区四区不卡 | 91大片 | 99精品久久久久久中文字幕 | 在线日韩 | 欧美视频在线看 | 亚洲一一在线 | 9久9久 | 国产日韩精品在线 | 欧美综合一区 | 国产欧美精品一区二区三区 | 九九伦理电影 | 亚洲精品久久久一区二区三区 | 日本三级做a全过程在线观看 | 久久99精品国产 |