Spiga

分类为项目实战的文章

Net企业级AI项目3:构建企业知识库

2025-12-20 10:26:27

摘要:一、理论基础 1. RAG 概述 RAG:检索增强生成技术,我们先用一个例子来介绍一下什么是检索增强生成。 想象一下,你是一个很聪明的小学生,但你的知识都记在脑子里。如果老师问你一个很难的问题,比如:“恐龙是怎么消失的?”。你可能记得一些,但不完整。 这时候老师说:“来,我们开卷考!你可以去书架上查百科全书,然后再回答。” RAG 就是这样: 你有大脑(AI 的记忆)→ 你本来就知道很多事。 但遇到不知道的问题→ 你先跑去“书库”(数据库、网络等)快速查找相关的资料。 把查到的资料和你原来的知识合在一起,用你自己的话给出一个更好的答案。 所以,RAG 就是:先查资料,再结合自己的知识回答问题。这样就不会瞎编,答案更准确、更新鲜!是不是很像写作业时“先翻书,再总结”呢? 企业应用使用大模型时,至少会遇到下面2个问题: 大模型一旦训练结束,它就不会在知道结束时间之后发生的事了,也就是它有时效性缺失 另外,通用的大模型是使用公共数据来训练的,它没有企业私有的数据,也就是私有领域空白 为了解决上面2类问题,我们可以使用 RAG 技术,为模型提供一个图书馆,也就是通常说的企业知识库。 2. RAG 工作流程 在让 LLM 回答问题之前,先去外部知识库中检索相关的信息,然后将检索到的信息作为参考资料喂给LLM,让它基于资料生成答案。RAG 分为2个阶段: 索引阶段:后台异步运行的数据处理流程,将文本转换为向量,构建语义索引。 检索与生成阶段:能够在线实时响应用户请求的流程 ETL(提取、转换、加载)流: 加载:格式解析、编码标准化、元数据提取; 分割:LLM的上下文窗口有限,所以需要递归字符分割,分割可能造成语义不完整,所以在分割的2段语句通常会添加重叠窗口; 嵌入:人类语言翻译成机器语言,使用嵌入模型,将文本转换为高维向量,即高维的语义空间,后续可以使用余弦相似度 -1 ~ 1进行检索; 存储:将文本块内容、向量数据、元数据,持久化存储到向量数据库。 3. 嵌入模型选型 我们把文本转换成高维向量时,需要使用嵌入模型,那如何选择嵌入模型呢? 我们先看一下都有哪些选择: 闭源厂商云端模型 API: 优势:接入成本低、弹性扩展 劣势:数据隐私风险、长期成本不可控、网络延迟 开源模型本地私有化: 优势:绝对的数据安全、零增量成本、高性能与低延迟 劣…… 阅读全文

Net企业级AI项目2:企业助理智能体

2025-12-13 15:44:39

摘要:上一篇我们已经搭建好了 AI 应用的基础设施,今天我们开始创建企业助理智能体。 一、AI 网关集成 Agent 框架 关于 MAF 部分的内容,可以查看 Agent 智能体 ,我们这里直接上代码。 我们在 Qjy.AICopilot.AiGatewayService 项目添加一个 Agents 文件夹。 1. 创建聊天智能体 由于我们是一个多模型聊天应用,聊天模型数据是从数据库动态加载的。因而我们首先要创建一个工厂类,用来根据数据库中的数据来动态创建 Agent。 public class ChatAgentFactory(IServiceProvider serviceProvider) { public ChatClientAgent CreateAgentAsync(LanguageModel model, ConversationTemplate template) { using var scope = serviceProvider.CreateScope(); var httpClientFactory = scope.ServiceProvider.GetRequiredServiceIHttpClientFactory(); // 创建专属 HttpClient 对象 var httpClient = httpClientFactory.CreateClient(OpenAI); var chatClientBuilder = new OpenAIClient( new ApiKeyCredential(model.ApiKey ?? string.Empty), new OpenAIClientOptions { Endpoint = new Uri(model.BaseUrl), // 接管 OpenAI 的底层传输 Transport = new HttpClientPipelineTransport(httpClien…… 阅读全文

Net企业级AI项目1:项目基础搭建

2025-12-06 15:47:26

摘要:前面我做了一个使用 LangChain 做的 AI 通用聊天平台的示例,接下来我们回到 .NET 环境,完成一个企业级的 .NET+AI 的项目。目标是为企业通电,完成一个可扩展、可私有化部署的 AI 应用。让企业能用自然语音操作内部其他系统(ERP/CRM/OA)、获取知识、分析报告。 一、项目分析 1. 背景 我们需要完成一个AI企业助理系统,在现有的系统之上,覆盖一层“智能化层”,完成: 智能体和工具调用:赋予 AI 行动能力。 检索增强生成,企业知识中枢:赋予 AI 记忆和知识能力 AI数据分析,一句话生成可视化报表:赋予 AI 分析能力,如 NL2SQL 2. 需求分析 通过背景分析,我们梳理一下大致需要完成的功能: 智能助理(Agent):AI 交互入口(大脑) 对话与上下文管理:支持多轮上下文 意图识别:准确分析用户的输入,判断命令意图 工具调用:调用通过 MCP 接入的外部插件 富响应生成:响应不能局限于纯文本,包含表格、图表 企业知识中枢(RAG):处理非结构化知识(记忆) 文档处理流程:支持多种文档格式上传,实现自动解析、自动分块、向量化计算(嵌入)、向量存储 检索与回答:支持语义搜索,结合LLM生成精准、有来源依据的问答 企业级特性:权限控制、数据时效性 数据报表分析(NL2SQL):处理结构化数据(分析) NL2SQL引擎:自然语言翻译成 SQL 查询 多数据源支持 自动化分析与可视化:自动生成可视化图表,利用LLM总结图表中的趋势 报告导出 MCP 接入管理(Tools):负责连接外部系统(行动) 服务发现与管理:实现 MCP 服务的注册,注册到AI的能力库 调试与权限:确保操作安全 3. 技术选型 后端框架:ASP.NET Core(.NET 10) AI 框架:Semantic Kernerl(SK)、Agent Framework 知识库:向量数据库(Qdrant)+关系型数据库(PostgreSQL + pgvector) 大模型:兼容 OpenAI 接口、支持私有化部署 安全方案:Jwt + RABC 开发方式:云原生开发 .NET Aspire 部署方案:容器化部署 4. 开发流程 搭建环境与项目骨架 实现核心服务(认证 + AI 网关) 构建知识中枢(RAG …… 阅读全文

通用AI聊天平台实现4:扩展MCP工具

2025-08-02 10:05:58

摘要:一、MCP概述 MCP(Model Context Protocol)是由Anthropic于2024年底提出并开源的一种协议,旨在为AI系统(如AI编程助手、Agent等)提供安全、标准化的数据访问方式。它采用客户端-服务器架构,使AI工具(如Claude Desktop、IDE插件等)能够通过MCP客户端与MCP服务端交互,访问本地或远程数据源。 1. 基本流程 AI大模型---通过函数调用---函数列表---发送给大模型---判断调用函数+生成调用参数---应用将结果返回给大模型 函数调用---交互模式---调用规范 2. MCP的意义 日常开发中由于接口碎片化,我们可能需要开发搜索、SQL数据库、API调用工具等等。 有了MCP,我们可以将 工具开发,封装成MCP服务器 AI应用开发,连接MCP服务器 数据处理与隐私安全,MCP服务器可以在本地进程中运行,对接本地设备的私有数据 服务集成与扩展效率 MCP服务器可以方便集成 MCP服务器可以复用,配置即接入 AI应用只需要实现一次MCP接入,就拥有了与所有MCP服务器通信的能力 应用场景 企业办公场景 个人AI助手场景 总之:MCP就是AI应用与外部的工具。 3. 基础概念 MCP 是客户端-服务端架构,一个 Host 可以连接多个 MCP Server。 MCP Hosts(宿主程序):如Claude Desktop、IDE等,通过MCP访问数据。 MCP Clients(客户端):与服务器建立1:1连接,处理通信。 MCP Servers(服务端):轻量级程序,提供标准化的数据或工具访问能力。 Local Data Sources(本地数据源):如文件、数据库等,由MCP服务端安全访问。 Remote Services(远程服务):如API、云服务等,MCP服务端可代理访问。 6. 协议层与传输层 协议层:负责消息封装(framing)、请求/响应关联、高级通信模式管理。 传输层:支持两种通信方式 Stdio传输(标准输入/输出):适用于本地进程间通信。 HTTP + SSE传输: 服务端→客户端:Server-Sent Events(SSE) 客户端→服务端:HTTP POST 适用于远程网络通信。 所有传输均采用JSON-RPC 2.0进行消息交换…… 阅读全文

通用AI聊天平台实现3:扩展RAG知识库

2025-07-26 10:38:01

摘要:一、实现多格式文档解析器 1. 通用文档解析接口 我们先在ai文件夹创建一个名为parsers的pathon包,用来实现多格式文档解析器。 接着我们先定义一个解析器接口 # app/ai/parsers/base.py from abc import ABC, abstractmethod from typing import List, Dict, Any from pydantic import BaseModel class DocumentChunk(BaseModel): 文档块 content: str metadata: Dict[str, Any] chunk_index: int class DocumentParser(ABC): 文档解析器抽象基类 @abstractmethod def parse(self, file_path: str, file_content: bytes) - List[DocumentChunk]: 解析文档并返回文档块列表 pass DocumentChunk是文档解析器返回类型。 DocumentParser是抽象基类,通过继承ABC来定义。 2. 实现文本解析器 # app/ai/parsers/txt_parser.py from typing import List from langchain_text_splitters import RecursiveCharacterTextSplitter from app.ai.parsers.base import DocumentParser, DocumentChunk class TextParser(DocumentParser): 文本文件解析器 def __init__(self, chunk_size: int = 1000, chunk_overlap: int = 200): 初始化文本解析器 Args: chunk_size: 文档块大小 chunk_overlap: 文档块重叠大小 …… 阅读全文

通用AI聊天平台实现2:实现AI聊天服务

2025-07-19 16:51:06

摘要:上一篇我们已经实现了该项目的一些非AI功能的基础服务,如提供商、角色、会话等,本篇内容开始来实现AI部分的服务开发。 首先来实现一个AI聊天服务,然后在这些基础上将我们的AI聊天服务实现支持上传知识库。 一、实现AI聊天服务 AI聊天服务的功能很简单:就是通过我们提供的AI角色的信息, 对话的历史记录,已经用户发送过来的最新的信息,与大语言模型进行交互,生成回复内容。 AI聊天服务通过LangChain来实现。 1. 安装LangChain环境 uv add langchain langchain-openai 2. 实现AI聊天服务类 # app/ai/chat.py from typing import List,AsyncGenerator from langchain_core.messages import HumanMessage, AIMessage from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from app.data.models import Role from app.schemas.message import MessageBase, MessageRole class AIChatService: def __init__(self, role: Role): # 创建ChatOpenAI实例 llm = ChatOpenAI( base_url=role.provider.endpoint, api_key=role.provider.api_key, model=role.provider.model, temperature=role.temperature, streaming=True ) # 构建Prompt模板 promp…… 阅读全文

通用AI聊天平台实现1:基础服务与API

2025-07-12 23:14:04

摘要:一、项目介绍 1. 项目目标 Python + 面向单一用户 + 私有化部署 + 通用AI聊天平台 通过Web界面轻松交互 管理多个自定义AI角色 拥有会话管理能力 自由接入并切换语言模型(兼容OpenAl接口规范) 构建私有化知识库 扩展外部工具:集成MCP服务器 2. 功能性需求 多角色管理功能 对话管理功能 模型管理功能 RAG功能 前端界面(会话、知识库、模型设置、角色设置) MCP 服务器接入 3. 技术选型 包与项目管理工具:NuGet+ dotnet cli == uv 后端API框架与服务器:ASP.NET Core Web APl(Kestrel) == FastAPl + Uvicorn 数据模型与验证:数据注解/FluentValidation == Pydantic ORM + 数据迁移:EF Core == SQLAlchemy + Alembic 前端UI框架:Blazor Server == Gradio 元数据库(关系):PgSQL 向量数据库:Chroma 嵌入生成服务:云端向量服务 + 本地开源向量模型 AI组件:SK == LangChain 4. 项目架构 该项目采用分层架构(因为是第一个实例项目,没有采用领域驱动设计) 二、项目初始化 安装UV # https://docs.astral.sh/uv/getting-started/installation/#__tabbed_1_2 pip install uv # uv的依赖环境恢复可以使用 uv sync 创建UV项目 项目初始化 创建app和ui文件夹,按下面目录结构分别创建Python软件包和文件: app |--ai |--api |--data |--|--models |--schemas |--service |--.env |--config.py |--main.py ui 安装 fastapi uv add fastapi 安装 uvicorn uv add uvicorn 创建HelloWorld API # app/api/hello.py # 从 fastapi 库中导入 APIRouter 类,用于创建路由模块 from fastapi import APIRouter # 创建一个 …… 阅读全文

Docker Swarm部署2

2024-09-21 21:03:17

摘要:一、安装Harbor 1. Harbor介绍 Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。 Project Harbor是一个开源的受信任的云本地注册表项目,用于存储、标记和扫描上下文。 Harbor扩展了开源Docker发行版,增加了用户通常需要的功能,如安全、身份和管理。 Harbor支持高级特性,如用户管理、访问控制、活动监视和实例之间的复制。 2. 功能 多租户内容签名和验证 安全性与漏洞分析 审计日志记录 身份集成和基于角色的访问控制 实例间的镜像复制 可扩展的API和图形UI 国际化(目前为英文和中文) 3. docker compose Harbor在物理机上部署是非常难的,而为了简化Harbor的应用,Harbor官方直接把Harbor做成了在容器中运行的应用,而且这个容器在Harbor中依赖类似redis、mysql、pgsql等很多存储系统,所以它需要编排很多容器协同起来工作,因此VMWare Harbor在部署和使用时,需要借助于Docker的单机编排工具(Docker compose)来实现。 Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,我们可以使用YAML文件来配置应用程序的服务。然后,只需要一个命令,就可以从配置中创建并启动所有服务。 4. 部署 需要提前安装好docker 提前下载好安装包:Release v2.13.2 · goharbor/harbor · GitHub 安装docker-compose DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/download/v2.39.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose docker comp…… 阅读全文

Docker Swarm集群1

2024-09-07 18:36:18

摘要:最近公司有个.net项目需要集群部署,由于不打算使用K8S,计划用docker swarm来搭建整个集群环境。 所以计划用2篇文章,记录一下docker swarm部署的整个过程。 文章使用的环境是本地虚拟机环境,生产环境大同小异。 文中用的到资料下载:docker-swarm.zip 一、安装 Docker 对于 Ubuntu/Debian 系统: # 查看 ip ip a 使用工具测试链接,如putty # 1. 更新软件包索引 sudo apt-get update # 2. 安装依赖包 sudo apt-get install ca-certificates curl gnupg lsb-release # 3. 添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 4. 设置稳定版仓库 echo deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 5. 安装 Docker 引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 检查 Docker 版本 docker --version 对于 CentOS/RHEL 系统: # 安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加 Docker 仓库 sudo yum-config-manager --add-r…… 阅读全文

Dapr 完全离线安装方案

2024-09-01 23:15:28

摘要:Dapr 完全离线安装方案 以下是完整的 Dapr 离线安装指南,无需任何网络连接即可完成全部安装过程: 准备工作(在可联网的机器上) 1. 下载所有必需文件 # 创建离线安装目录 mkdir dapr-offline cd dapr-offline # 下载 Dapr CLI wget https://github.com/dapr/cli/releases/download/v1.15.0/dapr_linux_amd64.tar.gz # 下载 Dapr 运行时 wget https://github.com/dapr/dapr/releases/download/v1.15.5/daprd_linux_amd64.tar.gz # 下载 Dashboard wget https://github.com/dapr/dashboard/releases/download/v0.15.0/dashboard_linux_amd64.tar.gz # 下载默认配置文件 wget https://raw.githubusercontent.com/dapr/dapr/master/daprd-system/config.yaml 2. 下载 Docker 镜像并保存 # 拉取所需镜像 docker pull daprio/dapr:1.15.5 docker pull daprio/placement:1.15.5 docker pull daprio/sentry:1.15.5 docker pull daprio/dashboard:0.15.0 docker pull redis:6-alpine docker pull openzipkin/zipkin:latest # 保存镜像为 tar 文件 docker save -o dapr-1.15.5.tar daprio/dapr:1.15.5 docker save -o placement-1.15.5.tar daprio/placement:1.15.5 docker save -o sentry-1.15.5.tar daprio/sentry:1.15.5 docker save -o dashboard-0.15.0.tar daprio/dashboard:0.15.0 d…… 阅读全文