基于本地部署deepseek实现网页端问答

本地部署deepseek

1,首先下载本地大语言模型运行平台Ollama。
首先我们需要安装Ollama,它可以在本地运行和管理大模型。
到Ollama官网 https://ollama.com,点击下载,然后选择适合自己系统的版本,这里选择Windows:
在这里插入图片描述

2,根据自己的硬件,选择不同量级的deepseek模型,通过相应的命令进行下载安装,安装成功后,可以实现在终端使用。
在这里插入图片描述
下载完成之后,就可以和DeepSeek对话了:
在这里插入图片描述
在终端命令行窗口下对话,不美观,我们需要一个美观的图文交互界面。
3,最后为了优化体验,借助第三方平台Cherry Studio实现窗口式的对话。

在这里插入图片描述

为了更灵活地集成deepseek,下文尝试使用Java实现前后端交互的方式使用本地部署的deepseek。

基于本地部署deepseek,Java前后端开发,实现网页deepseek问答

本地部署deepseek的API地址是http://localhost:11434/v1/chat/completions

前端:
定义了一个异步函数 sendQuestion,用于处理用户在聊天输入框中输入问题并发送给后端服务器:

try {
    const response = await fetch('/ds/chat', {  //fetch('/ds/chat', ...) 是一个 JavaScript 的内置函数,用于发起一个 HTTP 请求。
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ question: question })
    });

fetch(‘/ds/chat’, …) 是一个 JavaScript 的内置函数,用于发起一个 HTTP 请求。

  • /ds/chat 是请求的 URL,即后端服务器处理聊天请求的接口。
  • method: ‘POST’ 指定请求方法为 POST,通常用于向服务器提交数据。
  • headers: { ‘Content-Type’: ‘application/json’ } 设置请求头,表明请求体的格式是 JSON。
  • body: JSON.stringify({ question: question }) 将包含用户问题的对象转换为 JSON 字符串,并作为请求体发送给服务器。
  • await 关键字暂停函数的执行,直到 fetch 请求完成并返回响应。

后端:
使用的是 Spring Boot 作为后端框架,并且前端通过 fetch 以 JSON 格式发送包含用户问题的请求体,在控制层接收这个 JSON 数据可以按照以下步骤进行:

  1. 定义请求实体类
    首先,你需要定义一个 Java 类来映射前端发送的 JSON 数据。这个类中的属性名要和前端 JSON 对象的键名保持一致。
  2. 在控制层接收 JSON 数据
    接下来,在控制层的方法中使用 @RequestBody 注解来接收前端发送的 JSON 数据,并将其自动转换为 QuestionRequest 对象。
  3. 后端处理数据
    首先提取问题文本,构建一个请求体,发送到deepseek的本地API地址,接着处理该API的响应,如果请求成功且响应体不为空,会从响应体中提取出机器人的回答,并返回到前端。
  4. 后端返回数据
    后端通过 ResponseEntity 对象返回数据给前端,返回的数据是一个字符串,即机器人的回答
    前端:
    前端使用await response.text()来获取后端返回的数据,然后对返回的数据进行一定的处理,最后将机器人的回答显示在聊天窗口中。
    在这里插入图片描述
### 部署DeepSeek并结合RAG实现问答对话 #### 1. 安装依赖库 为了在本地环境中部署DeepSeek并与RAG结合,首先需要安装必要的Python包。可以通过pip来完成这一操作。 ```bash pip install deepseek rag-transformers elasticsearch langchain ``` #### 2. 设置Elasticsearch环境 根据提供的配置信息[^4],需确保已正确设置了Elasticsearch实例,并指定了相应的URL地址以及索引名称用于存储文档数据。 ```python import os elasticsearch_url = "http://localhost:9200" INDEX_NAME = 'docwrite' FILE_SAVE_PATH = os.path.join(os.path.dirname(__file__), "upload_file") os.makedirs(FILE_SAVE_PATH, exist_ok=True) ``` #### 3. 初始化DeepSeek模型 加载预训练好的DeepSeek模型,这里假设使用的是类似于Llama-3这样的大型语言模型作为基础架构[^1]。 ```python from transformers import AutoModelForSeq2SeqLM, AutoTokenizer model_name_or_path = "meta-llama/Llama-3" # 假设这是DeepSeek所使用的具体版本 tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path) ``` #### 4. 构建检索增强型生成器(Retrieval-Augmented Generator) 通过集成LangChain框架可以更方便地构建基于上下文理解的回答系统[^2]。下面是一个简单的例子展示如何创建一个能够从外部知识源获取信息的支持类: ```python class RagGenerator: def __init__(self, model, tokenizer): self.model = model self.tokenizer = tokenizer def generate(self, query, context=None): inputs = self.tokenizer([query], return_tensors="pt", truncation=True, padding=True) if context is not None: contexts_input_ids = [] for doc in context['documents']: encoded_doc = self.tokenizer.encode(doc.page_content, add_special_tokens=False) contexts_input_ids.extend(encoded_doc[:512]) input_dict = { **inputs, "context": torch.tensor(contexts_input_ids).unsqueeze(0), } else: input_dict = inputs outputs = self.model.generate(**input_dict) response_text = self.tokenizer.decode(outputs[0], skip_special_tokens=True) return {"answer": response_text} ``` #### 5. 实现问答交互逻辑 最后一步就是编写实际运行时的代码片段,它负责接收用户的输入并将查询发送给之前定义的服务端点;同时也会调用搜索引擎API去查找最相关的几篇文档摘要供后续处理阶段参考。 ```python def run_qa_conversation(): while True: user_query = input("请输入您的问题 (或按 q 键退出): ") if user_query.lower() == 'q': break from elasticsearch import Elasticsearch es_client = Elasticsearch(elasticsearch_url) search_results = es_client.search(index=INDEX_NAME, body={"size": 5, "query": {"match": {"content": user_query}}}) documents = [{"page_content": hit["_source"]["content"]} for hit in search_results["hits"]["hits"]] rag_generator = RagGenerator(model=model, tokenizer=tokenizer) result = rag_generator.generate(user_query, {"documents": documents}) print(f"\n回答:\n{result['answer']}\n") if __name__ == "__main__": run_qa_conversation() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦笑的背后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值