Windows环境部署deepseek及API接口调用
一、下载ollama:https://ollama.com/download、并安装
二、安装完成后,打开命令提示符窗口(win+R---》输入cmd回车),输入ollama - v,查看是否安装成功
三、输入 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
模型下载完后,打开新的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>
效果就是这样的
扩展:
一、安装AnythingLLM:https://anythingllm.com/desktop
安装完成后点击设置,在其中可以设置模型、界面显示语言等选项
在 Embedder首选项 界面,选择嵌入引擎提供商为 Ollama,在 Ollama Embedding Mode 中选择 nomic-embed-text,然后点击 保存更改。
点击 工作区设置,在 聊天设置 界面:
❶ 将 工作区LLM提供商 选择为 Ollama,
❷ 将 工作区聊天模型 选择为 deepseek-r1,
❸ 然后点击 Update workspace agent 更新工作区代理。
点击 工作区设置,在 聊天设置 界面:
❶ 将 工作区LLM提供商 选择为 Ollama,
❷ 将 工作区聊天模型 选择为 deepseek-r1,
❸ 然后点击 Update workspace agent 更新工作区代理。
在 代理配置 界面,将 工作区代理LLM提供商 选择为 Ollama,将 工作区代理模型 选择为 deepseek-r1,点击 Update workspace agent 更新工作区代理。
喂数据(训练AI):在工作区界面,点击【上传】。
点击 Upload,选择需要上传的文件(支持 PDF、TXT、Word、Excel、PPT 等常见文档格式)。勾选需要上传的文件。点击 Move to Workspace 将文件移动到工作区
然后进行对话就会根据投喂的数据进行回答了
如果需要通过API接口请求返回投喂的相关数据信息的话就得换成AnythingLLM的接口了
点击设置找到API密钥,生成新API密钥,然后点击阅读API文档,根据文档选择自己需要的API就行了