首页 杂七杂八 正文
  • 本文约4373字,阅读需22分钟
  • 60
  • 0

Windows环境部署deepseek及API接口调用

 

一、下载ollama:https://ollama.com/download、并安装

微信图片_20250312095647.png

二、安装完成后,打开命令提示符窗口(win+R---》输入cmd回车),输入ollama - v,查看是否安装成功

微信截图_20250312095850.png

三、输入 ollama run + 模型名称,然后按回车键开始下载模型,具体使用哪个模型可以参考下图(记得双击运行ollama程序)

//deepseek模型,其他模型可直接访问:https://ollama.com/search搜索
ollama run deepseek-r1:1.5b
ollama run deepseek-r1:7b
ollama run deepseek-r1:8b
ollama run deepseek-r1:14b
ollama run deepseek-r1:32b
ollama run deepseek-r1:70b
ollama run deepseek-r1:617b

gBTRCU-20250206.png

模型下载完后,打开新的CMD窗口,输入命令并按回车键,下载nomic-embed-text嵌入式模型(此模型将在后续数据投喂中使用)

如果需要删除模型,请输入命令 ollama rm + 模型名称,例如:ollama rm deepseek-r1:14b

四、至此已经可以通过API调用了,以下是API调用示例:

<template>
    <el-card class="chat-container">
      <div class="chat-messages" ref="messageArea">
        <div 
          v-for="(msg, index) in messageList" 
          :key="index"
          :class="['message-item', msg.sender === 'user' ? 'user' : 'assistant']"
        >
            <img style="width:50px !important;height:50px;" :src="msg.sender == 'assistant' ? 'https://img1.baidu.com/it/u=728383910,3448060628&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=800' : 'https://iknow-pic.cdn.bcebos.com/d0c8a786c9177f3ea9e6159362cf3bc79e3d565a'" class="avatar" />
            <vue-markdown  class="message-content" :source="msg.content"></vue-markdown>
            <vue-markdown  class="message-content" :source="outputText" v-if="outputText && msg.sender=='assistant' && index == messageList.length-1 "></vue-markdown>
        </div>
      </div>
      <div style="position: absolute;bottom: 55px;width: 700px;">
        <el-input 
            v-model="inputMessage" 
            placeholder="输入消息..." 
            @keyup.enter.native="sendMessage"
            class="input-box"
        >
            <el-button slot="append" @click="sendMessage" :disabled="sendLoading">发送</el-button>
        </el-input>
      </div>
    </el-card>
</template>
<script>
import VueMarkdown from 'vue-markdown'
export default {
    components: {
        VueMarkdown
    },
    data() {
        return {
            messageList: [
                { sender: 'assistant', content: '您好,有什么可以帮您?' }
            ],
            inputMessage: '',
            sendLoading: false,
            streamContent:'',
            outputText:''
        }
    },
    updated() {
        this.$nextTick(() => {
            const container = this.$refs.messageArea;
            container.scrollTop = container.scrollHeight;
        });
    },
    methods: {
        //流式
        async sendMessage() {  
            this.outputText = ''
            let cont = this.inputMessage
            let timeStamp  = new Date().getTime()
            this.messageList.push({ sender: 'user', content: this.inputMessage,timeStamp: timeStamp });
            this.messageList.push({ sender: 'assistant', content: '思考中...',timeStamp: timeStamp });
            this.inputMessage = '';
            this.sendLoading = true;
            const controller = new AbortController();  
            const response = await fetch('http://localhost:11434/api/chat', {  
                method: 'POST',  
                headers: { 'Content-Type': 'application/json'},  
                body: JSON.stringify({  
                    model: 'deepseek-r1:7b',//模型名称
                    // prompt: cont, 
                    messages:[{role:'user',content:cont}], 
                    history:this.messageList,
                    stream: true  
                })  
            });  

            if (!response.ok) {this.$message.error('网络错误'); return};  

            const reader = response.body.getReader();  
            const decoder = new TextDecoder('utf-8');  
            let buffer = '';  

            let ind = this.messageList.findIndex(da=>da.timeStamp==timeStamp && da.sender=='assistant')
            if(ind > -1){
                this.messageList[ind].content = ''
            }
            while (true) {  
                const { done, value } = await reader.read(); 
                if (done) {
                    break;  
                }  
                let res = JSON.parse(decoder.decode(value, { stream: true }))
                console.log(res)
                // this.outputText += res.response.replace('<think>','').replace('</think>','');  
                this.outputText += res.message.content.replace('<think>','').replace('</think>','');  
            }
            this.$nextTick(()=>{
                let ind = this.messageList.findIndex(da=>da.timeStamp==timeStamp && da.sender=='assistant')
                if(ind > -1){
                    this.messageList.splice(ind,1)
                }
                this.messageList.push({ sender: 'assistant', content: this.outputText.replace('<think>\n\n</think>\n\n', '')});
                this.outputText = '';
                this.sendLoading = false;
            })
        },
        sendMessage1() { //非流式
            if (this.inputMessage.trim()) {
                let cont = this.inputMessage
                let timeStamp  = new Date().getTime()
                this.messageList.push({ sender: 'user', content: this.inputMessage,timeStamp: timeStamp });
                this.messageList.push({ sender: 'assistant', content: '思考中...',timeStamp: timeStamp });
                this.inputMessage = '';
                this.sendLoading = true;
                fetch('http://localhost:11434/api/generate', {  
                    method: 'POST',  
                    headers: { 'Content-Type': 'application/json' ,'Authorization': 'WBGH39E-8MVM6GF-MFX6YSD-AKEMX9Q'},  
                    body: JSON.stringify({  
                        model: 'deepseek-r1:1.5b',  
                        prompt: cont,  
                        stream: false  
                    })  
                }).then(response => {  
                    this.sendLoading = false;
                    if(response.status == 200){
                        response.json().then(res => {
                            let indx = this.messageList.findIndex(dat=>dat.timeStamp == timeStamp && dat.sender == 'assistant')
                            if(indx > -1){
                                this.messageList.splice(indx,1)
                            }
                            this.messageList.push({ sender: 'assistant', content: res.response.replace('<think>\n\n</think>\n\n', ''), timeStamp: timeStamp});
                        })
                    }
                })
            }
        }
    }
}
</script>
<style scoped>
/* 容器样式 */
.chat-container {
  width: 750px;
  height: 600px;
  margin: 20px auto;
  .chat-messages {
    height: calc(100% - 60px);
    overflow-y: auto;
    padding: 10px;
    height: 540px;overflow: auto;
  }
}

/* 消息项布局 */
.message-item {
  display: flex;
  margin: 10px 0;
  &.user {
    flex-direction: row-reverse;
    .message-content { background: #409EFF; color: white; }
  }
  &.assistant {
    .message-content { background: #f0f2f5; }
  }
  .avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    margin: 0 10px;
  }
  .message-content {
    max-width: 80%;
    padding: 0px 5px;
    border-radius: 4px;
    overflow: auto;
  }
}
.input-box {
  margin-top: 10px;
}
</style>

效果就是这样的

微信图片_20250312101517.png

扩展:

一、安装AnythingLLM:https://anythingllm.com/desktop

安装完成后点击设置,在其中可以设置模型、界面显示语言等选项

1.png

2.png

在 Embedder首选项 界面,选择嵌入引擎提供商为 Ollama,在 Ollama Embedding Mode 中选择 nomic-embed-text,然后点击 保存更改。

3.png

点击 工作区设置,在 聊天设置 界面:

❶ 将 工作区LLM提供商 选择为 Ollama,

❷ 将 工作区聊天模型 选择为 deepseek-r1,

❸ 然后点击 Update workspace agent 更新工作区代理。

4.png

5.png

点击 工作区设置,在 聊天设置 界面:

❶ 将 工作区LLM提供商 选择为 Ollama,

❷ 将 工作区聊天模型 选择为 deepseek-r1,

❸ 然后点击 Update workspace agent 更新工作区代理。

6.png

在 代理配置 界面,将 工作区代理LLM提供商 选择为 Ollama,将 工作区代理模型 选择为 deepseek-r1,点击 Update workspace agent 更新工作区代理。

7.png

喂数据(训练AI):在工作区界面,点击【上传】。

8.png

点击 Upload,选择需要上传的文件(支持 PDF、TXT、Word、Excel、PPT 等常见文档格式)。勾选需要上传的文件。点击 Move to Workspace 将文件移动到工作区

9.png

然后进行对话就会根据投喂的数据进行回答了

如果需要通过API接口请求返回投喂的相关数据信息的话就得换成AnythingLLM的接口了

点击设置找到API密钥,生成新API密钥,然后点击阅读API文档,根据文档选择自己需要的API就行了

10.png

11.png

标签:deepseek
评论
更换验证码