当前位置: 首页 > article >正文

DeepSeek+RAG局域网部署

已经有很多平台集成RAG模式,dify,cherrystudio等,这里通过AI辅助,用DS的API实现一个简单的RAG部署。框架主要技术栈是Chroma,langchain,streamlit,答案流式输出,并且对答案加上索引。支持doc,docx,pdf,txt。

RAG

import os
import streamlit as st
import chromadb
import fitz  # PyMuPDF
import pypandoc  # DOC解析
from docx import Document
from typing import List, Dict, Any, Generator
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain.llms import BaseLLM
from pydantic import Field, BaseModel
from openai import OpenAI
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_core.outputs import LLMResult, Generation
import shutil
import re
from tenacity import retry, wait_exponential, stop_after_attempt# 每次运行会将chroma_db删除,就要重新构建知识库。
# shutil.rmtree("./chroma_db", ignore_errors=True)# 自定义支持流式输出的DeepSeek LLM类
class DeepSeekLLM(BaseLLM, BaseModel):api_key: str = Field(..., description="DeepSeek API密钥")base_url: str = Field(..., description="API基础地址")@retry(wait=wait_exponential(multiplier=1, min=4, max=10), stop=stop_after_attempt(3))def _stream_call(self, prompt: str, stop: List[str] = None) -> Generator[str, None, None]:client = OpenAI(api_key=self.api_key, base_url=self.base_url)response = client.chat.completions.create(model="deepseek-reasoner",messages=[{"role": "system", "content": "你是各领域资深专家"},{"role": "user", "content": prompt},],temperature=0.3,stream=True  # 启用流式输出)for chunk in response:if chunk.choices and chunk.choices[0].delta.content:yield chunk.choices[0].delta.contentdef _call(self, prompt: str, stop: List[str] = None) -> str:return "".join(self._stream_call(prompt, stop))def _generate(self, prompts: List[str], stop: List[str] = None) -> LLMResult:generations = []for prompt in prompts:stream_output = list(self._stream_call(prompt, stop))generations.append([Generation(text="".join(stream_output))])return LLMResult(generations=generations)@propertydef _llm_type(self) -> str:return "deepseek-legal-llm"@propertydef _identifying_params(self) -> Dict[str, Any]:return {"api_key": self.api_key, "base_url": self.base_url}# 配置中文小模型(约300MB)
embeddings_bge = HuggingFaceEmbeddings(model_name="./bge-large-zh-v1.5"# model_kwargs={#     'device': 'cpu'  # 强制使用CPU,避免CUDA依赖# }
)
test_embedding = embeddings_bge.embed_query("测试")
if not test_embedding or len(test_embedding) == 0:st.error("Embedding 生成失败,请检查本地模型路径是否正确!")raise RuntimeError("Embedding 生成失败")# API配置
DEEPSEEK_API_KEY = "你的密钥"
DEEPSEEK_BASE_URL = "https://api.deepseek.com"# 初始化组件
deepseek_llm = DeepSeekLLM(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL)# 文档处理函数
@st.cache_data # 在文件上传逻辑添加缓存(避免重复处理)
def process_document(file) -> str:"""支持PDF/DOC/DOCX/TXT的解析"""if file.name.endswith(".pdf"):with fitz.open(stream=file.read()) as doc:return "\n".join([page.get_text() for page in doc])elif file.name.endswith(".docx"):return "\n".join([p.text for p in Document(file).paragraphs])elif file.name.endswith(".doc"):return pypandoc.convert_text(file.read(), 'plain', format='doc')elif file.name.endswith(".txt"):return file.read().decode()return ""# RAG处理流程
# 修改后的流式RAG处理流程
def build_streaming_retrieval_chain():vectorstore = Chroma(collection_name="legal_docs",embedding_function=embeddings_bge,persist_directory="./chroma_db")return RetrievalQA.from_chain_type(llm=deepseek_llm,chain_type="stuff",retriever=vectorstore.as_retriever(ssearch_kwargs={"k": 3,"filter": {"metadata_field": {"$gte": 0.7}}}), # 返回Top3且相似度>0.7return_source_documents=True)# Streamlit界面
st.title("DeepSeek-RAG系统")# 文件上传处理
uploaded_files = st.file_uploader("上传文件",type=["pdf", "doc", "docx", "txt"],accept_multiple_files=True)
if uploaded_files:text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)# 使用LangChain的Chroma添加文档vectorstore = Chroma(collection_name="legal_docs",embedding_function=embeddings_bge,persist_directory="./chroma_db")# if vectorstore._collection.count() == 0:#     st.warning("警告:Chroma 数据库为空,可能未成功加载任何数据")for file in uploaded_files:text = process_document(file)if not text.strip():  # 检查解析后文本是否为空st.error(f"文件 {file.name} 解析失败,跳过")continuechunks = text_splitter.split_text(text)if not chunks:  # 确保 chunks 不是空列表st.error(f"文件 {file.name} 无法进行文本切分,跳过")continuemetadatas = [{"source": file.name} for _ in chunks]  # 让每个 chunk 记录来源文件名vectorstore.add_texts(texts=chunks, metadatas=metadatas)  # 添加文本和元数据st.success(f"已成功加载{len(uploaded_files)}份文件")if query := st.text_input("请输入问题:"):# 初始化流式输出容器answer_container = st.empty()full_answer = ""source_docs = []# 创建QA链qa_chain = build_streaming_retrieval_chain()try:# 执行查询并获取流式响应result = qa_chain.invoke({"query": query})source_docs = result['source_documents']# 流式输出处理for token in deepseek_llm._stream_call(result['result']):full_answer += token# 实时更新显示(带光标效果)answer_container.markdown(f"**答案**:{full_answer}▌")# 最终显示完整答案answer_container.markdown(f"**答案**:{full_answer}")except Exception as e:st.error(f"生成中断: {str(e)}")full_answer += "\n\n(输出因错误中断)"answer_container.markdown(f"**答案**:{full_answer}")# 处理引用标注(修改后的版本)if full_answer and source_docs:doc_references = {}doc_counter = 1for doc in source_docs:source = doc.metadata.get('source', '未知来源')if source not in doc_references:doc_references[source] = str(doc_counter)doc_counter += 1# 智能分段与标注逻辑segmentation_patterns = [r'\n{2,}',r'\n(?=\d+[\.、])',r'\n(?=[•\-*□▶])',r'(?<=。|!|?)\s+(?=.)']split_regex = re.compile('|'.join(segmentation_patterns))paragraphs = [p.strip() for p in split_regex.split(full_answer) if p.strip()]formatted_paragraphs = []sorted_citation = "".join(f"[{num}]" for num insorted(doc_references.values(), key=lambda x: int(x)))for para in paragraphs:if re.search(r'[。!?]$', para) or '。' in para:formatted_para = para + f" {sorted_citation}"else:formatted_para = paraformatted_paragraphs.append(formatted_para)# 更新显示带引用的答案formatted_answer = '\n\n'.join(formatted_paragraphs)answer_container.markdown(f"**答案**:{formatted_answer}")# 显示来源文档st.subheader("依据文件")for source, num in sorted(doc_references.items(), key=lambda x: int(x[1])):st.markdown(f"[{num}] {source}")

相关文章:

DeepSeek+RAG局域网部署

已经有很多平台集成RAG模式&#xff0c;dify&#xff0c;cherrystudio等&#xff0c;这里通过AI辅助&#xff0c;用DS的API实现一个简单的RAG部署。框架主要技术栈是Chroma,langchain,streamlit&#xff0c;答案流式输出&#xff0c;并且对答案加上索引。支持doc,docx,pdf,txt。…...

JavaScript快速入门之函数

引言 总所周知&#xff0c;JavaScript是一个很随便的语言&#xff0c;因此&#xff0c;在学习它的语法的时候&#xff0c;我是和Java语法对比着学的&#xff0c;可能会有些绕 函数 方法&#xff1a;对象&#xff08;属性&#xff0c;方法&#xff09; 函数&#xff1a;放在对…...

Java中synchronized 和 Lock

1. synchronized 关键字 工作原理 对象锁&#xff1a;在Java中&#xff0c;每个对象都有一个与之关联的监视器锁&#xff08;monitor lock&#xff09;。当一个线程尝试进入由 synchronized 保护的代码块或方法时&#xff0c;它必须首先获取该对象的监视器锁。如果锁已经被其…...

Linux系统-ls命令

一、ls命令的定义 Linux ls命令&#xff08;英文全拼&#xff1a;list directory contents&#xff09;用于显示指定工作目录下之内容&#xff08;列出目前工作目录所含的文件及子目录)。 二、ls命令的语法 ls [选项] [目录或文件名] ls [-alrtAFR] [name...] 三、参数[选项…...

个人学习编程(3-24) 数据结构

括号的匹配&#xff1a; if((s[i]) && now() || (s[i]] && now[)){ #include <bits/stdc.h>using namespace std;int main() {char s[300];scanf("%s",&s);int i;int len strlen(s);stack <char> st;for (i 0; i < len; i){if(…...

.NET开源的智能体相关项目推荐

一、AntSK 由AIDotNet团队开发的人工智能知识库与智能体框架&#xff0c;支持多模型集成和离线部署能力。 核心能力&#xff1a; • 支持OpenAI、Azure OpenAI、星火、阿里灵积等主流大模型&#xff0c;以及20余种国产数据库&#xff08;如达梦&#xff09; • 内置语义内核&a…...

面试八股文--框架篇(SSM)

一、Spring框架 1、什么是spring Spring框架是一个开源的Java平台应用程序框架&#xff0c;由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型&#xff0c;用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入&#xff08;DI&#xf…...

跨语言语言模型预训练

摘要 最近的研究表明&#xff0c;生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中&#xff0c;我们将这一方法扩展到多种语言&#xff0c;并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型&#xff08;XLM&#xff09;的方法&#xff1a;一种…...

[识记]Mysql8 远程授权

今天在测试docker时&#xff0c;因更换为Mysql8&#xff0c;使用SQL方式实现远程授权&#xff0c;其方式方法同于Mysql&#xff0c;但语句稍有不同&#xff0c;仅供参考。 登录mysql mysql -u root -p 输入密码: [请依据交互输入你的mysql密码]切换数据库 use mysql;选择需要…...

Nodejs上传文件的问题

操作系统&#xff1a;window和linux都会遇到 软件环境&#xff1a;v20.10.0的Nodejs 1、前端代码如下&#xff1a; 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下&#xff1a; 3、用页面上传文件 查看具体报错原因&#xff1a; TypeError: sourc…...

无人机螺旋桨平衡标准

螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音&#xff0c;并加速关键部件的磨损&#xff0c;从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架&#xff0c;定义了可接受的不平衡…...

Qt开发:双缓冲机制

文章目录 什么是双缓冲机制&#xff1f;Qt 中的双缓冲实现方式 什么是双缓冲机制&#xff1f; 双缓冲&#xff08;Double Buffering&#xff09; 是一种减少屏幕绘制闪烁的技术&#xff0c;广泛用于图形渲染和游戏开发。 它的基本原理是&#xff1a; 先在后台缓冲区&#xff0…...

HandyJSON原理

HandyJSON 的优势 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …...

SpringBoot+策略模式+枚举类,使用配置文件改进,优雅消除if-else,完全符合OOP原则

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...

[力扣每日一练]关于MySQL和pandas的正则表达式应用

一&#xff1a;题目要求 表&#xff1a;Users-------------------------- | Column Name | Type | -------------------------- | user_id | int | | email | varchar | -------------------------- (user_id) 是这张表的唯一主键。 每一行包含用…...

每日免费分享之精品wordpress主题系列~DAY16

主题介绍&#xff1a; 今日在网上寻找wordpress主题的时候逛到了大叔的网站&#xff0c;赶脚这个主题蛮不错的&#xff0c;于是百度一下&#xff0c;果然&#xff0c;这个主题很受欢迎。作为主题下载站追梦者也不甘落后&#xff0c;马上就发布出来了&#xff0c;希望对你们有用…...

OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程&#xff0c;隐藏了许多底层细节…...

MySQL 用户权限与安全管理

MySQL 用户权限与安全管理 在数据库系统中&#xff0c;用户权限与安全管理是保障数据安全性、完整性和隐私性的核心机制。MySQL 提供了丰富的权限管理功能&#xff0c;可以精细地控制用户对数据库、表以及其他数据库对象的访问权限&#xff0c;同时也支持各种安全管理策略来防…...

dify + deepseek /qwen + win +xinference 等完成知识库建设

Dify.AI The Innovation Engine for Generative AI Applications 简介&#xff1a;Dify是一个用于构建人工智能应用程序的开源平台。我们将后端即服务和LLMOps相结合&#xff0c;简化了生成式人工智能解决方案的开发&#xff0c;使开发人员和非技术创新者都可以使用。CPU>…...

模数转换电路(A/D转换器)

A/D转换&#xff0c;是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多&#xff0c;按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量&#xff0c;后者是先将模拟电压量转换成一个中间量&#xff0c;再将中间量转换成数字量。 …...

算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码

一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...

OpenAI深夜直播「偷袭」谷歌!GPT-4o原生图像生成:奥特曼带梗图,AGI战场再燃战火

引言&#xff1a;AI战场的「闪电战」 当谷歌刚刚发布「地表最强」Gemini 2.5 Pro时&#xff0c;OpenAI立即以一场深夜直播「闪电反击」——GPT-4o的原生图像生成功能正式上线&#xff01;从自拍变梗图到相对论漫画&#xff0c;奥特曼&#xff08;OpenAI团队&#xff09;用一连…...

【深度学习】Cross-Attention(交叉注意力)机制详解与应用

Cross-Attention&#xff08;交叉注意力&#xff09;机制详解与应用 文章目录 Cross-Attention&#xff08;交叉注意力&#xff09;机制详解与应用引言什么是Cross-Attention&#xff1f;Cross-Attention的数学表示Cross-Attention与Self-Attention的区别Cross-Attention的应用…...

《大语言模型赋能证券业开发安全:海云安技术方案在上交所专刊发表》

近日&#xff0c;海云安《大语言模型在证券业开发安全领域的探索与实践》技术方案经过上海证券交易所&#xff08;以下简称”上交所“&#xff09;行业专家评审后正式收录于《交易技术前沿——网络安全专刊&#xff08;2025年第1期 总第61期&#xff09;》。 证券信息技术研究…...

光流 | 基于光流的人体异常行为检测算法原理,公式,算法改进,matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人体异常行为检测 一、算法原理与数学模型1. 核心原理2. 关键公式二、算…...

【蓝桥杯】单片机设计与开发,中断系统,外部中断(下)

一、例程一&#xff1a;外部中断执行函数 #include<stc15.h>void main(void) {P20XA0;P00X00;P20X80;P00XFF;IT00;//设置外部中断0&#xff1b;上升沿下降沿均可//IT01;//设置外部中断0&#xff1b;仅下降沿EX01;//允许中断0申请中断EA 1;//打开CPU总中断while(1); }voi…...

【测试工具】如何使用 burp pro 自定义一个拦截器插件

在 Burp Suite 中&#xff0c;你可以使用 Burp Extender 编写自定义拦截器插件&#xff0c;以拦截并修改 HTTP 请求或响应。Burp Suite 支持 Java 和 Python (Jython) 作为扩展开发语言。以下是一个完整的流程&#xff0c;介绍如何创建一个 Burp 插件来拦截请求并进行自定义处理…...

MySQL、创建数据库、表、SQL 函数:数学函数、字符串函数、日期函数、聚合函数

DAY18.1 Java核心基础 MySQL 创建数据库 数据库是一个服务&#xff0c;实际开发需要根据具体的项目创建对应的数据库实例 create database mytest1 default character set utf8 collate utf8_general_ci; create database mytest2 default character set utf8 collate utf8…...

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面 今天写一下使用nodejs作为服务端&#xff0c;vue作为客户端&#xff0c;mysql的数据库&#xff0c;对接deepseek的全过程&#xff0c;要实现一个很简单的效果就是&#xff0c;可以自由的询问&#xff0c;然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…...

23种设计模式-策略(Strategy)设计模式

策略设计模式 &#x1f6a9;什么是策略设计模式&#xff1f;&#x1f6a9;策略设计模式的特点&#x1f6a9;策略设计模式的结构&#x1f6a9;策略设计模式的优缺点&#x1f6a9;策略设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是策略设计模式…...