《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现

news2025/4/27 22:44:29

基于RAG向量数据库的知识库AI问答助手设计与实现

引言

随着大语言模型(LLM)技术的快速发展,构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手,该系统能够整合两部分知识语料:网站博客(存储在SQLite数据库中)和后台配置的知识博客URL链接内容(通过爬虫获取)。系统采用RAG(检索增强生成)技术,在用户提问时能够从两部分知识库中检索相关信息并生成高质量回答。

RAG技术概述

RAG(检索增强生成)是一种结合了检索系统和生成模型的技术,它首先从大型文档集合中检索相关信息,然后使用这些信息来生成最终答案。RAG的核心思想是"检索+生成":前者主要利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回的知识合理利用,生成目标答案[1]。
RAG架构通常使用转换器实现,包含编码器和解码器两部分。当用户提出问题时,输入文本被"编码"为捕获单词含义的向量,而向量被"解码"到我们的文档内容中[2]。

在这里插入图片描述

系统架构设计

整体架构

基于用户需求,我们设计了一个完整的AI问答助手系统架构,主要包含以下几个部分:

  1. 前端Web应用:基于FLASK开发,提供用户交互界面
  2. 向量数据库:使用Milvus存储和检索向量表示的知识
  3. 大模型底座:使用本地OLLAMA运行大模型
  4. 知识处理组件:处理SQLite数据库中的博客和URL链接内容
  5. RAG组件:实现检索和生成功能
    整体技术细节为:
  6. 嵌入模型使用Sentence Transformers
  7. 本地使用OLLAMA部署大模型
  8. 使用Milvus作为向量数据库
  9. 使用LangChain作为框架集成各组件

技术选型

Milvus向量数据库

Milvus是一个专为处理和搜索大量向量数据而设计的强大向量数据库。它以高性能和可扩展性著称,非常适合机器学习、深度学习、相似性搜索任务和推荐系统[5]。Milvus的主要功能包括:

  1. 高性能向量检索能力,支持百亿级别的向量索引
  2. 多种搜索方式(top-K & Range ANN搜索、稀疏和稠密向量搜索、多向量搜索、Grouping搜索)
  3. 提供元数据过滤功能
  4. 支持多租户架构
  5. 支持数据分区分片、数据持久化、增量数据摄取
  6. 支持标量向量混合查询和time travel功能
    Milvus被广泛应用于智能客服、推荐系统、NLP服务、计算机视觉等领域,能够为大模型提供强大的知识库支持[6]。
Ollama本地大模型

Ollama是一个开源平台,可简化大型语言模型(LLM)的本地运行和定制。它提供了用户友好的无云体验,无需高级技术技能即可轻松实现模型部署[10]。Ollama的主要特点包括:

  1. 本地部署:不依赖云端服务,用户可以在自己的设备上运行模型
  2. 简化模型管理:提供便捷的模型管理功能
  3. 丰富的预建模型库:支持多种主流模型
  4. 跨平台支持:可在不同操作系统上运行
  5. 灵活的自定义选项:允许用户根据需求调整模型
    Ollama通过提供便捷的模型管理、丰富的预建模型库、跨平台支持以及灵活的自定义选项,使得开发者和研究人员能够轻松使用大型语言模型[15]。
LangChain框架

LangChain是一个专门为LLM应用设计的框架,它允许开发人员将不同的组件像链一样串在一起,以围绕LLM创建更高级的应用。LangChain提供了一系列模块,这些模块是任何LLM应用的基础[49]。
LangChain的核心思想是开发人员可以将不同的组件像链一样串在一起,以围绕LLM创建更高级的示例。LangChain提供了一系列模块,这些模块是作为任何LLM应用的基础[49]。

系统流程设计

系统的主要流程包括:

  1. 知识库构建
    • 从SQLite数据库中读取博客内容
    • 爬取后台配置的URL链接内容
    • 使用文档加载器和拆分器处理文本内容
    • 使用嵌入模型生成向量表示
    • 将向量和元数据存储到Milvus数据库中
  2. 用户提问处理
    • 接收用户提问
    • 使用相同的嵌入模型生成提问向量
    • 从Milvus中检索相关知识
    • 使用大模型和检索到的知识生成回答
  3. 大模型推理
    • 使用OLLAMA运行大模型
    • 通过LangChain的ChatModel接口与大模型交互
    • 生成最终回答

系统组件实现

知识库构建

1. 从SQLite数据库读取博客内容

首先需要从SQLite数据库中读取博客内容。可以使用Python的sqlite3模块来实现:

import sqlite3
from typing import List, Dict
def fetch_blog_content(db_path: str) -> List[Dict[str, str]]:
    """从SQLite数据库中读取博客内容"""
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    # 假设博客表名为blogs,包含id、title、content等字段
    cursor.execute("SELECT id, title, content FROM blogs")
    rows = cursor.fetchall()
    
    blogs = []
    for row in rows:
        blog = {
            "id": row[0],
            "title": row[1],
            "content": row[2]
        }
        blogs.append(blog)
    
    conn.close()
    return blogs
2. 爬取后台配置的URL链接内容

需要爬取后台配置的URL链接内容。可以使用Python的requests和BeautifulSoup库来实现:

import requests
from bs4 import BeautifulSoup
from typing import List, Dict
def crawl_url_content(urls: List[str]) -> List[Dict[str, str]]:
    """爬取指定URL的内容"""
    crawled_content = []
    
    for url in urls:
        try:
            response = requests.get(url)
            response.raise_for_status()
            
            soup = BeautifulSoup(response.text, 'html.parser')
            # 假设我们只关心正文内容
            content = soup.get_text()
            
            crawled_content.append({
                "url": url,
                "content": content
            })
        except Exception as e:
            print(f"Error crawling {url}: {e}")
    
    return crawled_content
3. 文档加载和拆分

使用LangChain的文档加载器和拆分器来处理文本内容。对于结构化数据(如博客),可以使用Pydantic加载器;对于非结构化数据(如网页内容),可以使用Text加载器。然后使用RecursiveCharacterTextSplitter将文本拆分为适当的块大小:

from langchain.document_loaders import Pydantic, Text
from langchain.text_splitter import RecursiveCharacterTextSplitter
from typing import List, Dict, Any
def process_documents(documents: List[Dict[str, str]]) -> List[Dict[str, Any]]:
    """处理文档内容,包括加载和拆分"""
    processed_docs = []
    
    for doc in documents:
        # 根据文档类型选择合适的加载器
        if "blog" in doc:  # 假设我们用"blog"标记博客内容
            loader = Pydantic(BlogDocument)
        else:
            loader = Text()
        
        # 加载文档
        loaded_doc = loader.load(doc)
        
        # 使用递归字符拆分器拆分文本
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200
        )
        
        splits = text_splitter.split_documents([loaded_doc])
        
        for split in splits:
            processed_docs.append({
                "content": split.page_content,
                "metadata": split.metadata
            })
    
    return processed_docs
4. 向量化和存储到Milvus

使用嵌入模型(如Sentence Transformers)将文本内容转换为向量,并存储到Milvus数据库中:

from sentence_transformers import SentenceTransformer
import numpy as np
from milvus import Milvus
def embed_and_store_to_milvus(documents: List[Dict[str, str]], 
                             milvus_host: str, 
                             milvus_port: int, 
                             collection_name: str):
    """将文档内容嵌入向量并存储到Milvus"""
    # 加载嵌入模型
    model = SentenceTransformer('all-MiniLM-L6-v2')
    
    # 连接到Milvus
    milvus = Milvus(host=milvus_host, port=milvus_port)
    
    # 检查集合是否存在,如果不存在则创建
    if collection_name not in milvus.list_collections():
        milvus.create_collection(collection_name, 
                                 dim=model.get_sentence_embedding_dimension(),
                                 index_params={'index_type': 'IVF_FLAT',
                                              'params': {'nlist': 100},
                                              'metric_type': 'L2'})
    
    # 准备向量和元数据
    embeddings = []
    metadatas = []
    
    for doc in documents:
        # 生成嵌入向量
        embedding = model.encode(doc["content"]).astype(np.float32).tolist()
        embeddings.append(embedding)
        
        # 准备元数据
        metadata = {"source": doc["source"], 
                    "chunk": doc["chunk"]}
        metadatas.append(metadata)
    
    # 插入到Milvus
    status, ids = milvus.insert(collection_name=collection_name,
                                records=embeddings,
                                metadatas=metadatas)
    
    if status.OK():
        print(f"Successfully inserted {len(ids)} documents into Milvus collection {collection_name}")
    else:
        print(f"Error inserting documents into Milvus: {status}")

用户提问处理

1. 提问向量化

使用相同的嵌入模型将用户提问转换为向量:

from sentence_transformers import SentenceTransformer
import numpy as np
def vectorize_query(query: str, model: SentenceTransformer) -> List[float]:
    """将用户提问向量化"""
    query_vector = model.encode(query).astype(np.float32).tolist()
    return query_vector
2. 从Milvus中检索相关知识

使用Milvus从向量数据库中检索最相关的知识:

from milvus import Milvus
def retrieve_from_milvus(query_vector: List[float],
                        milvus_host: str,
                        milvus_port: int,
                        collection_name: str,
                        top_k: int = 5) -> List[Dict[str, Any]]:
    """从Milvus中检索相关知识"""
    # 连接到Milvus
    milvus = Milvus(host=milvus_host, port=milvus_port)
    
    # 检索
    status, results = milvus.search(
        collection_name=collection_name,
        query_records=[query_vector],
        top_k=top_k,
        params={'nprobe': 10}
    )
    
    if status.OK():
        # 解析结果
        retrieved_docs = []
        for result in results[0]:
            doc = {
                "content": result.id,  # 假设id存储了内容
                "score": result.distance,
                "metadata": result.metadata
            }
            retrieved_docs.append(doc)
        
        return retrieved_docs
    else:
        print(f"Error retrieving from Milvus: {status}")
        return []
3. 使用大模型生成回答

使用OLLAMA运行大模型,并使用检索到的知识生成回答:

import requests
from typing import Dict, Any
def query_ollama_model(query: str,
                      context: str,
                      model_name: str,
                      ollama_host: str,
                      ollama_port: int) -> str:
    """使用OLLAMA查询大模型"""
    prompt = f"根据以下上下文回答问题:\n\n{context}\n\n问题:{query}\n\n回答:"
    
    endpoint = f"http://{ollama_host}:{ollama_port}/api/generate"
    
    payload = {
        "model": model_name,
        "prompt": prompt,
        "stream": False
    }
    
    response = requests.post(endpoint, json=payload)
    
    if response.status_code == 200:
        return response.json()["response"]
    else:
        print(f"Error querying Ollama model: {response.status_code} {response.text}")
        return "无法生成回答,请稍后再试。"

系统集成

将各个组件集成到一个完整的FLASK应用中:

from flask import Flask, request, jsonify
import sqlite3
import requests
from bs4 import BeautifulSoup
from sentence_transformers import SentenceTransformer
import numpy as np
from milvus import Milvus
app = Flask(__name__)
# 配置参数
SQLITE_DB_PATH = "path/to/blog.db"
MILVUS_HOST = "localhost"
MILVUS_PORT = 19530
MILVUS_COLLECTION_NAME = "knowledge_base"
OLLAMA_HOST = "localhost"
OLLAMA_PORT = 11434
MODEL_NAME = "deepseek"
# 初始化Milvus连接
milvus = Milvus(host=MILVUS_HOST, port=MILVUS_PORT)
# 初始化嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
@app.route("/build-kb", methods=["POST"])
def build_knowledge_base():
    """构建知识库"""
    # 从SQLite中读取博客内容
    blogs = fetch_blog_content(SQLITE_DB_PATH)
    
    # 爬取URL内容
    urls = request.json.get("urls", [])
    url_content = crawl_url_content(urls)
    
    # 处理文档
    documents = process_documents(blogs + url_content)
    
    # 向量化并存储到Milvus
    embed_and_store_to_milvus(documents, 
                             MILVUS_HOST, 
                             MILVUS_PORT, 
                             MILVUS_COLLECTION_NAME)
    
    return jsonify({"status": "success", 
                    "message": "知识库构建完成"}), 200
@app.route("/query", methods=["POST"])
def query_knowledge_base():
    """查询知识库"""
    query = request.json.get("query", "")
    
    if not query:
        return jsonify({"status": "error", 
                        "message": "查询不能为空"}), 400
    
    # 向量化查询
    query_vector = vectorize_query(query, model)
    
    # 从Milvus中检索
    retrieved_docs = retrieve_from_milvus(query_vector,
                                        MILVUS_HOST,
                                        MILVUS_PORT,
                                        MILVUS_COLLECTION_NAME,
                                        top_k=5)
    
    if not retrieved_docs:
        return jsonify({"status": "error", 
                        "message": "未找到相关知识"}), 404
    
    # 组合上下文
    context = "\n".join([doc["content"] for doc in retrieved_docs])
    
    # 使用大模型生成回答
    answer = query_ollama_model(query, context, MODEL_NAME, OLLAMA_HOST, OLLAMA_PORT)
    
    return jsonify({
        "status": "success",
        "answer": answer,
        "sources": [doc["metadata"] for doc in retrieved_docs]
    }), 200
if __name__ == "__main__":
    app.run(debug=True)

系统部署方案

环境要求

  1. 硬件要求
    • CPU:支持AVX2指令集
    • 内存:至少16GB RAM
    • 存储:足够存储知识库和模型参数
    • GPU:可选,用于加速大模型推理
  2. 软件要求
    • 操作系统:Linux/Windows/macOS(推荐Linux)
    • Python:3.8或更高版本
    • 依赖库:Milvus、OLLAMA、LangChain等

安装步骤

  1. 安装Milvus
    • 下载并安装Milvus:curl -L https://github.com/milvus-io/milvus/releases/download/v2.5.1/milvus-2.5.1-linux-amd64.tar.gz | tar xz
    • 启动Milvus:bin/milvus_server start
  2. 安装OLLAMA
    • 下载并安装OLLAMA:curl -L https://github.com/ollama/ollama/releases/download/v1.3.0/ollama_1.3.0_Linux_x86_64.tar.gz | tar xz
    • 启动OLLAMA:./ollama serve
  3. 安装Python依赖
    pip install flask requests beautifulsoup4 sentence-transformers numpy milvus-langchain-connector
    

配置步骤

  1. 配置Milvus
    • 确保Milvus服务已启动并监听在默认端口(19530)
    • 创建知识库集合(如果尚不存在)
  2. 配置OLLAMA
    • 确保OLLAMA服务已启动并监听在默认端口(11434)
    • 下载并加载所需模型:ollama pull deepseek
  3. 配置FLASK应用
    • 设置SQLite数据库路径
    • 设置Milvus连接参数
    • 设置OLLAMA连接参数
    • 设置默认模型名称

运行和测试

  1. 构建知识库
    • 从SQLite数据库中读取博客内容
    • 爬取后台配置的URL链接内容
    • 处理文档并存储到Milvus
  2. 进行问答测试
    • 发送用户提问
    • 系统从Milvus中检索相关知识
    • 使用大模型生成回答

系统优化与扩展

性能优化

  1. 向量索引优化
    • 调整IVF_FLAT索引的nlist参数
    • 考虑使用更高效的索引类型,如HNSW
    • 为不同类型的文档使用不同的索引策略
  2. 模型优化
    • 选择合适的嵌入模型(如all-MiniLM-L6-v2或更大模型)
    • 调整大模型的参数(如temperature、top_p等)
    • 考虑使用量化技术减少模型大小和推理时间
  3. 文档处理优化
    • 调整文本拆分的chunk_size和chunk_overlap
    • 使用更智能的文档重要性评估方法
    • 考虑使用多语言处理技术

功能扩展

  1. 支持更多知识源
    • 添加PDF、PPT、DOCX等文件格式的支持
    • 集成企业内部知识管理系统
    • 支持实时数据源的自动更新
  2. 增强用户体验
    • 提供更友好的Web界面
    • 添加语音交互功能
    • 实现多轮对话上下文记忆
  3. 监控和分析
    • 添加API调用日志记录
    • 实现性能监控和分析
    • 提供知识库使用统计报告

结论

本报告详细介绍了如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手。该系统通过RAG技术整合了两部分知识语料:网站博客(存储在SQLite数据库中)和后台配置的知识博客URL链接内容(通过爬虫获取)。系统主要由前端Web应用、向量数据库Milvus、本地大模型OLLAMA和知识处理组件组成,使用LangChain作为框架集成各组件。
通过本设计方案,企业可以构建一个高效、安全、可定制的AI问答系统,能够快速响应用户问题并提供基于本地知识库的支持。随着技术的不断发展,该系统可以通过多种方式进行优化和扩展,以满足更复杂的应用需求。

参考资料

[1] 一文读懂:大模型RAG(检索增强生成)含高级方法 - 知乎专栏. https://zhuanlan.zhihu.com/p/675509396.
[2] 15-检索增强生成(RAG) 和向量数据库 - 飞书文档. https://docs.feishu.cn/article/wiki/OinzwWLXGi2cQUkiNYjceAVunVg.
[5] 高性能向量数据库,为规模而构建 - Milvus. https://milvus.io/zh.
[6] 向量数据库Milvus_功能优势 - 金山云. https://www.ksyun.com/nv/product/Milvus.html.
[10] 使用Milvus 和Ollama 构建RAG. https://milvus.io/docs/zh/build_RAG_with_milvus_and_ollama.md.
[15] Ollama本地部署大模型及应用原创 - CSDN博客. https://blog.csdn.net/qq_43548590/article/details/142546580.
[49] 使用OpenAI、LangChain 和LlamaIndex 构建Knowledge. https://developer.aliyun.com/article/1394419.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BeeWorks Meet:私有化部署视频会议的高效选择

在数字化时代,视频会议已成为企业沟通协作的重要工具。然而,对于金融、政务、医疗等对数据安全和隐私保护要求极高的行业来说,传统的公有云视频会议解决方案往往难以满足其严格的安全标准。此时,BeeWorks Meet 私有化部署视频会议…

IPv6 技术细节 | 源 IP 地址选择 / Anycast / 地址自动配置 / 地址聚类分配

注:本文为 “IPv6 技术细节” 相关文章合集。 部分文章中提到的其他文章,一并引入。 略作重排,未整理去重。 如有内容异常,请看原文。 闲谈 IPv6 - 典型特征的一些技术细节 iteye_21199 于 2012-11-10 20:54:00 发布 0. 巨大的…

【工具】使用 MCP Inspector 调试服务的完全指南

Model Context Protocol (MCP) Inspector 是一个交互式开发工具,专为测试和调试 MCP 服务器而设计。本文将详细介绍如何使用 Inspector 工具有效地调试和测试 MCP 服务。 1. MCP Inspector 简介 MCP Inspector 提供了直观的界面,让开发者能够&#xff…

【音视频】AVIO输入模式

内存IO模式 AVIOContext *avio_alloc_context( unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t (*seek)(…

Uniapp:scroll-view(区域滑动视图)

目录 一、基本概述二、属性说明三、基本使用3.1 纵向滚动3.2 横向滚动一、基本概述 scroll-view,可滚动视图区域。用于区域滚动。 二、属性说明 属性名类型默认值说明平台差异说明scroll-xBooleanfalse允许横向滚动scroll-yBooleanfalse允许纵向滚动三、基本使用 3.1 纵向滚…

单精度浮点运算/定点运算下 MATLAB (VS) VIVADO

VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真,对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件,提供以下核心功能: 嵌入式提问:对选中的文本内容进行AI分析,通过侧边栏聊天界面与AI交互,实现多轮对话、问题解答或代码生成。对话式提问:独…

【MySQL数据库入门到精通-07 函数-字符串函数、数值函数、日期函数和流程函数】

文章目录 一、字符串函数1. MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。下面是字符串函数常见的函数,见下表。2.具体代码实现3.结果 二、数值函数1.知识点2.具体代码实现3.结果 三、日期函数1.知识点2.具体代码实现3.结…

Python图像处理——基于Retinex算法的低光照图像增强系统

1.项目内容 (1)算法介绍 ①MSRCR (Multi-Scale Retinex with Color Restoration) MSRCR 是多尺度 Retinex 算法(MSR)的扩展版,引入了色彩恢复机制以进一步提升图像增强质量。MSR 能有效地压缩图像动态范围&#xff…

如何在JDK17项目中改成1.8

1.调整 Spring Boot 版本 由于 Spring Boot 3.x 最低要求 JDK 17&#xff0c;所以如果要使用 JDK 8&#xff0c;需要把 spring-boot-starter-parent 的版本降低到 2.7.x 系列&#xff0c;这个系列是支持 JDK 8 的。示例如下&#xff1a; <parent><groupId>org.sp…

【不同名字的yolo的yaml文件名是什么意思】

以下是这些 YOLO 系列配置文件的详细解析&#xff0c;按版本和功能分类说明&#xff1a; 一、YOLOv3 系列 文件名核心特性适用场景yolov3.yaml原始 YOLOv3 结构&#xff0c;3 尺度预测&#xff08;13x13,26x26,52x52&#xff09;通用目标检测yolov3-spp.yaml增加 SPP&#xff…

Zephyr kernel Build System (CMake)介绍

目录 概述 1. 结构介绍 2 构建和配置阶段 2.1 配置阶段 2.2 Cmake编译 3 Zephy项目目录结构 3.1 文件架构 3.2 文件content 概述 本文主要介绍Zephyr kernel Build System CMake的功能&#xff0c;以及使用该工具构建项目&#xff0c;并详细介绍了每个目录以及目录下文…

相对论大师-记录型正负性质BFS/图论-链表/数据结构

看到这一题我的第一个思路就是双向bfs 起点是a&#xff0c;终点还是a&#xff0c;但是flag是相反的&#xff08;“越”的方向&#xff09; tip1.可以用字典vis来存储flag 刚开始初始化时vissta,visend一个对应0、1 要求两个队列相…

Jenkins流水线管理工具

文章目录 前言&#xff1a; DevOps时代的自动化核心 —Jenkins一、Jenkins是什么&#xff1f;二、Linux安装Jenkinswar包方式安装依赖环境下载 Jenkins WAR 包启动 Jenkins 服务启动日志验证配置插件镜像源 docker镜像方式安装依赖环境拉取 Jenkins 镜像运行 Jenkins 容器获取初…

嵌入式开发:基础知识介绍

一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的&#xff0c;通过相互作用和内在指标评价的&#xff0c;嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异&#xff0c;一般可将嵌入式系统分为&#xff1a;芯片级&#xff08;MCU、SoC&am…

el-table中el-input的autofocus无法自动聚焦的解决方案

需求 有一个表格展示了一些进度信息&#xff0c;进度信息可以修改&#xff0c;需要点击进度信息旁边的编辑按钮时&#xff0c;把进度变为输入框且自动聚焦&#xff0c;当鼠标失去焦点时自动请求更新接口。 注&#xff1a;本例以vue2 element UI为例 分析 这个需求看着挺简单…

一文了解智慧教育顶刊TLT的研究热点

本文聚焦于IEEE Transactions on Learning Technologies&#xff08;TLT&#xff09;期刊&#xff0c;通过图文结合的方式&#xff0c;梳理了2025年第18卷的研究热点&#xff0c;帮助读者把握教育技术与人工智能交叉领域的研究进展&#xff0c;深入了解智能学习系统、自适应学习…

统计术语学习

基期、现期 作为对比参照的时期称为基期&#xff0c;而相对于基期的称为现期。 描述具体数值时我们称之为基期量和现期量。 【例 1】2017 年比 2016 年第三产业 GDP 增长 6.8%&#xff0c; &#xff08;2016&#xff09;为基期&#xff0c;&#xff08;2017&#xff09; 为现…

飞机会员日

各航空公司会员日日期 主要航空公司会员日整理如下&#xff08;数据截至2025年3月最新信息&#xff09;&#xff1a;‌ 1 2 ‌中国国际航空&#xff08;国航&#xff09;‌ 每月"同月同日"&#xff08;如1月1日、2月2日类推&#xff09; ‌中国南方航空&#xff08…

论分布式事务及其解决方案 架构师论文范文(考试笔记)

请围绕“论分布式事务及其解决方案”论题&#xff0c;依次从以下三个方面进行论述。 1、概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2、请介绍4种分布式事务的解决方案及简单说明。 3、具体阐述你参与的软件项目是如何做到分布式事务的&#xff0c;过程中…