文章系统介绍了语言嵌入模型(包括度量学习、BERT NSP和Sentence-BERT)、向量数据库技术(如KD-Tree、LSH、IVF和HNSW算法)以及检索增强生成(RAG)的基本概念和实现流程。通过详细讲解从文本嵌入到向量检索,再到大模型生成增强的全过程,帮助读者理解如何构建高效的RAG系统,提升大模型的知识准确性和回答可靠性。

1 、语言嵌入模型(Sentence Embedding)

语言嵌入模型(Sentence Embedding Model)是自然语言处理(NLP)中的一种重要技术,它将句子或短文本映射为固定长度的稠密向量(即嵌入向量),并使得语义相似的句子在向量空间中距离更近。这些向量能够捕捉句子的语义信息,便于后续的机器学习任务。

1.1 度量学习

度量学习也被称为相似度学习,可以把它看作是“学习如何衡量相似性” 的科学,其核心目标是学习出一个度量样本间距离的函数空间,使得在该函数空间中,相似样本之间得特征向量距离小,而不相似样本之间得距离大。

应用领域:度量学习在计算机视觉、文本分析等领域有着广泛得应用。例如,在计算机视觉中,它可以用于图像检索、分类、人脸识别等任务;在文本分析领域,度量学习在处理高维数据时尤其有效,有助于更好地进行文本分类和聚类。

方法分类:度量学习地方法可以大致分为基于监督学习和基于非监督学习两类。基于监督学习地方法通常利用标注数据进行训练,学习出能够反映样本间相似度的度量函数;而基于非监督学习的方法则主要依赖于数据的内在结构进行度量学习。

基本原理:度量学习的基本原理是根据不同的任务需求,自主学习出针对特定任务的度量距离函数。这个函数能够反映样本间的相似度,使得相似样本在特征空间中的距离较近,而不相似样本的距离较远。

1.2 BERT NSP

BERT NSP,全称 Next Sentence Prediction,即 下一句预测,是BERT原始论文中提出的两个预训练任务之一(另一个是MLM,掩码语言模型)。它的设计初衷是为了让模型理解两个句子之间的关系,这对于许多下游任务(如问答、自然语言推理)至关重要。简单来说,给定两个句子A和B,模型需要判断B是否是A的下一句。

在BERT的NSP训练中,模型需要预测两个句子是否是连续的。为了实现这一点,BERT模型利用其隐藏状态,将第一个句子的隐藏状态和第二个句子的前两个词的隐藏状态作为输入,生成一个表示两个句子关系的向量。然后,定义了一个二元分类器,使用这个向量来判断两个句子是否连续。

在训练过程中,模型通过最大化分类器的正确率来学习。具体来说,模型从训练语料库中获取连续片段来创建正样本,通过将来自不同文档的句段匹配对来创建负样本。正样本和负样本以相同的概率(各自0.5)采样。这样,模型能够学习到句子间的逻辑和语义联系,提升其在NLP任务中的性能。

1.3 Sentence-BERT

Sentence-BERT:是一种基于BERT模型的句子嵌入方法。SBERT通过对BERT模型进行微调,利用连体(Siamese)和三连体(Triplet)网络结构训练,使得模型能够生成句子级别的向量表示,从而有效度量句子之间的相似度。

训练数据:由两个句子构成 前后两句话 问题与答案 同话题的内容 ……

数据准备:首先,需要准备用于训练的数据集。这些数据集通常包含成对的句子,以及这些句子之间的相似度或相关度标签。这些数据对可以是人工标注的,也可以是基于某种启发式方法自动生成的。

微调:SBERT的训练过程实际上是对预训练模型进行微调(fine-tuning)的过程。微调是通过调整模型的参数来优化特定任务上的性能。在SBERT的情况下,这个特定任务就是生成适合句子相似度计算的句向量。

网络结构:SBERT使用连体和三连体网络结构来推导出语义上有意义的句子嵌入。连体网络结构涉及将两个句子分别输入到相同的模型中,并生成它们的向量表示。然后,这些向量表示被用于计算句子之间的相似度。而三连体网路i结构则涉及三个句子:一个正例(与第一个句子相似的句子)和一个负例(与第一个句子不相似的句子),用于优化相似度计算。

损失函数:在训练过程中,SBERT使用余弦相似度损失函数来优化模型。这意味着模型会尝试着生成使得相似句子之间的余弦相似度高,而不相似句子之间的余弦相似度低的句向量。

2、 向量数据库(Vector Database)

2.1 向量数据库原理

向量数据库:向量数据库是一种专门用于存储和查询向量的数据库,其存储的向量主要来自于对文本、语音、图像、视频等数据的向量化处理。这种数据库能够高效地处理非结构化数据,并且在机器学习和深度学习中,数据通常以向量形式表示,因此向量数据库在这些有领域具有广泛的应用。

向量数据库核心优势在于其能够支持高效的相似性搜索,快速找到最相似的向量。这使得它在人脸识别、图像搜索、推荐系统等需要相似性匹配的应用中发挥着重要作用。同时,向量数据库还支持高纬度的向量数据,可以存储和查询大规模的向量数据,并且具有可扩展性强、支持复杂查询和高并发等优点。

总的来说,向量数据库作为一种新型的数据库类型,在人工智能、机器学习等领域具有广泛的应用前景。随着技术的不断发展,向量数据库的性能和功能也将得到进一步提升和优化。

(1)近邻检索(Nearest Neighbor Search)

近邻检索:Nearest Neighbor Search(NNS)的核心任务是在给定的数据集合中找到与特定给定点最接近(或最相似)的点。在机器学习和数据挖掘领域,最近邻搜索北广泛应用在客户分析、文本聚类、商品推荐、模糊查询等多种场景中。

近邻检索的核心任务是在给定的数据集合中找到与特定给定点最接近(或最相似)的点。在机器学习和数据挖掘领域,最近邻搜索被广泛应用在客户分析、文本聚类、商品推荐、模糊查询等多种场景中。

这种搜索方法的实质是根据数据的相似性,从数据库中寻找与目标数据最相似的项目。而数据之间的相似性,通常被量化为它们在特定空间上的距离,距离越近则意味着相似性越高。比如,当我们想要找到离特定点A最近的K个点时,这就构成了K最近邻搜索(K-NN)。

为了提高搜索效率,一些近似最近邻(ANN)算法被开发出来。这些算法可能会牺牲一些精度,但它们的运行效率更高,可以扩展到大型数据集,同时保持良好的性能。在许多情况下,近似的最近邻与确切的近邻在效果上相差无几,尤其是在距离测量能够准确捕捉用户需求的情况下。

(2)KD-Tree

KD-Tree是一种用于对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。通过构建KD-Tree,可以大大缩小最近邻搜索的范围,从而提高搜索效率。

KD-Tree的基本思想是对K维空间进行划分,并在每个节点上存储一个分割超平面。查询时,从根节点开始,根据查询点与分割超平面的关系,选择进入左子树或右子树,直到叶子节点,然后回溯并搜索邻近的节点。

(3)局部敏感哈希 (Locality-Sensitive Hashing LSH)

局部敏感哈希:LSH算法时一种基于哈希的最近邻搜索方法。它通过设计一种哈希函数,使得距离相近的点以较高的概率被哈希到相同桶中,而距离较远的点则以较低的概率被哈希到相同的桶中。然后,可以在每个桶内部进行最近邻搜索,从而大大减少搜索范围。

(4)倒排索引(IVF)

倒排索引:IVF(Inverted File Index with Inverted List)是一种基于倒排索引的最近邻搜索算法。它通过将向量空间划分为多个小的子空间,并在每个子空间中构建一个倒排索引,从而优化相似度搜索的效率。

IVF主要利用倒排的思想保存每个聚类中心下的向量,每次查询向量的时候找到最近的几个中心,分别搜索这几个中心下的向量。通过减小搜索范围,大大提升搜索效率

(5)HNSW算法

HNSW算法:Hierarchical Navigable Small World(HNSW)通过构建图结构来存储数据点,并利用图的性质来加速最近邻搜索。HNSW通过贪心算法遍历图来找出局部最小值,并构建分层网络图,从而实现对特征向量集的维度分层、数据压缩和索引生成。

HNSW算法的核心是通过构建多层的超平面来组织待搜索数据点,以便快速地在高维空间中查找最近邻。首先,它会随机选取一个点作为初始点,然后依次将其他点插入到合适地层中,逐层构建超平面来组织数据。这种层次化的结构使得算法能够按照层次结构进行导航,找到最相关的一组结果,并且具有很好的可解释性。

查询时,根据查询点,从高层开始搜索,逐层向下找到最接近的节点。具体来说,查询过程首先从顶层开始,找到最长的链接。这些顶点往往是高度顶点(具有在多个层之间分离的链接),这意味着默认情况下会从这些顶点开始搜索。然后,算法会沿着每个层的边缘遍历,就像在NSW中所做的那样,贪婪地移动到最近的顶点,直到找到一个局部最小值。此时,算法会转移到较低层中的当前顶点,并开始再次搜索。

2.2 向量数据库地使用和优化

2.2.1 Faiss 向量数据库

Faiss向量数据库:是由Facebook AI研究院开发地一种高效地相似性搜索和聚类地库。其主要基于向量索引和近似最近邻搜索的原理,通过构建索引结构来加速相似性搜索,以便在大规模数据集中快速找到最相似的向量。

索引方式(Index Method)
  • IndexFlatL2:使用欧式距离进行精确检索。适用于较小规模的数据集,采用保理检索的方式,即计算查询向量与所有数据库之间的距离,然后返回相似度最高的前K个向量。
  • PQ:Faiss可以使用基于量化的方法,将高维向量映射到低维空间中,并在低维空间中进行搜索。这种方法可以大大减少搜索时间,同时保持较高的搜索精度。
  • IVF:首先在具有代表性的数据上训练聚类中心,然后将base加入到最近的聚类中心的桶里。在搜索时,query先和聚类中心比对,再在一定数目上的桶里做暴力搜索。这种方法通过聚类将搜索空间划分为多个子空间,然后在可能的子空间中进行精确或近似搜索,从而加速搜索过程。
  • IVFPQ:这是IVF和PQ的结合,既使用了IVF的聚类加速,又使用了PQ的量化压缩,从而实现了既快速又节省内存的搜索。
  • HNSW:一种基于图的索引方法,通过构建图结构来加速向量搜索。

当使用Faiss进行相似性检索时,检索结果通常包括两部分:一个距离数组(D),表示查询向量与数据库中每个近邻向量的距离;一个索引数组(I),表示这些近邻向量在数据库中的位置或ID

import numpy as np
import faiss

# 1. 生成示例数据
np.random.seed(42)
dimension = 128# 向量维度
num_vectors = 10000# 数据库向量数量
num_queries = 10# 查询向量数量

# 生成随机向量作为数据库
database_vectors = np.random.random((num_vectors, dimension)).astype('float32')
# 生成随机查询向量
query_vectors = np.random.random((num_queries, dimension)).astype('float32')

print(f"数据库向量形状: {database_vectors.shape}")
print(f"查询向量形状: {query_vectors.shape}")

# 2. 创建不同的索引方法示例

# 示例1: IndexFlatL2 (精确检索,欧式距离)
print("\n=== IndexFlatL2 示例 ===")
index_flat = faiss.IndexFlatL2(dimension)
index_flat.add(database_vectors)
print(f"索引中的向量数量: {index_flat.ntotal}")

# 执行查询
k = 5# 返回最近邻的数量
distances_flat, indices_flat = index_flat.search(query_vectors, k)
print(f"查询结果距离数组形状: {distances_flat.shape}")
print(f"查询结果索引数组形状: {indices_flat.shape}")
print(f"第一个查询的前5个最近邻索引: {indices_flat[0]}")
print(f"对应的距离: {distances_flat[0]}")

# 示例2: IVF索引 (倒排文件索引)
print("\n=== IVF 示例 ===")
nlist = 100# 聚类中心数量
quantizer = faiss.IndexFlatL2(dimension)  # 量化器用于计算距离
index_ivf = faiss.IndexIVFFlat(quantizer, dimension, nlist, faiss.METRIC_L2)

# 训练IVF索引
print("训练IVF索引...")
index_ivf.train(database_vectors)
index_ivf.add(database_vectors)

# 设置搜索的聚类中心数量
index_ivf.nprobe = 10# 搜索10个最近的聚类中心
distances_ivf, indices_ivf = index_ivf.search(query_vectors, k)
print(f"第一个查询的前5个最近邻索引: {indices_ivf[0]}")

# 示例3: IVFPQ索引 (IVF与乘积量化的结合)
print("\n=== IVFPQ 示例 ===")
m = 8# 子量化器数量,必须是维度的约数
bits = 8# 每个子量化器的比特数

quantizer_pq = faiss.IndexFlatL2(dimension)
index_ivfpq = faiss.IndexIVFPQ(quantizer_pq, dimension, nlist, m, bits)

# 训练IVFPQ索引
print("训练IVFPQ索引...")
index_ivfpq.train(database_vectors)
index_ivfpq.add(database_vectors)
index_ivfpq.nprobe = 10

distances_ivfpq, indices_ivfpq = index_ivfpq.search(query_vectors, k)
print(f"第一个查询的前5个最近邻索引: {indices_ivfpq[0]}")

# 示例4: HNSW索引 (基于图的索引)
print("\n=== HNSW 示例 ===")
M = 32# 每个节点的连接数
index_hnsw = faiss.IndexHNSWFlat(dimension, M)
index_hnsw.add(database_vectors)

distances_hnsw, indices_hnsw = index_hnsw.search(query_vectors, k)
print(f"第一个查询的前5个最近邻索引: {indices_hnsw[0]}")

# 3. 比较不同索引的性能和结果
print("\n=== 不同索引方法结果比较 ===")
print("查询向量 0 的结果比较:")
print(f"IndexFlatL2 (精确): {indices_flat[0]}")
print(f"IVF (近似): {indices_ivf[0]}")
print(f"IVFPQ (近似+压缩): {indices_ivfpq[0]}")
print(f"HNSW (图索引): {indices_hnsw[0]}")

# 4. 实用函数:根据ID获取向量
print("\n=== 根据ID检索向量 ===")
# 假设我们想获取第一个查询的第一个最近邻的完整向量
nearest_id = indices_flat[0][0]
nearest_vector = database_vectors[nearest_id]
print(f"ID {nearest_id} 的向量形状: {nearest_vector.shape}")
print(f"前10个元素: {nearest_vector[:10]}")

# 5. 保存和加载索引
print("\n=== 索引的保存与加载 ===")
# 保存索引
faiss.write_index(index_flat, "index_flat.index")
print("索引已保存到 index_flat.index")

# 加载索引
loaded_index = faiss.read_index("index_flat.index")
print(f"加载的索引中的向量数量: {loaded_index.ntotal}")

# 验证加载的索引
distances_loaded, indices_loaded = loaded_index.search(query_vectors, 1)
print(f"加载索引的查询结果: {indices_loaded[0][0]}")
2.2.2 Faiss的使用经验

在选择检索方法时,首先要明确应用场景和需求,包括数据集规模、搜索精度要求、搜索速度要求以及存储空间限制等。

索引类型 核心特点 典型适用场景 需特别注意
Flat (L2/IP) 精确检索 ,100%召回率,无需训练,但速度慢、内存占用量大。 数据量小(<10万) 、要求绝对精确、或作为评估其他索引的精度基准 数据规模是硬约束,超过百万级查询延迟可能显著上升。
IVFFlat 速度与精度平衡 。通过聚类缩小搜索范围,需指定聚类数 (nlist) 和搜索范围 (nprobe)。 中等数据规模(百万级) ,需要在精度和速度间做灵活权衡的场景。 必须训练nprobe 是调节速度/精度的关键“旋钮”。
IVFPQ 内存与速度兼顾 。在 IVF 基础上用乘积量化压缩向量,大幅节省内存,精度有损失。 十亿级大规模数据 ,内存受限,可接受可控精度损失以换取高性能。 必须训练 。参数更复杂(m, bits),需更多调优。
HNSW 高性能、高精度 。基于图算法,速度快、精度高,但构建索引较慢、内存占用大。 数据量中等(百万级以内) ,对查询速度和精度要求都很高的首选方案 内存消耗较大。参数 efConstruction(构建)和 efSearch(搜索)影响大。

3、 检索增强生成RAG

3.1 RAG的概念与基本流程

3.1.1 RAG概念与意义

检索增强生成(RAG)是一种结合了信息检索和自然语言生成的方法,旨在处理自然语言处理任务中的信息检索和生成问题。RAG结合了检索式方法和生成式方法,以提高文本处理任务的效率和质量。

在问答系统中,RAG可以利用外部知识库中的信息来支持生成更准确和全面的答案,特别是对于需要最新信息或广泛背景知识的问题。在摘要生成任务中,RAG可以帮助理解和总结长篇文本,提高摘要的质量和准确性。在信息检索方面,RAG可以为提供更准确和全面的信息基础,改善搜索结果的质量和相关性。

(1)为什么需要检索增强生成?

LLMs can’t memorize all(long tail) knowledge in their parameters

LLMs’ knowledge is easily outdated and hard to update

LLM’ output is challenging to interpret and verify

LLMs are shown to easiliy leak private training data

(2)LLM VS RAG+LLM

A retrieval-based LM is a language model(LM) that uses an external datastore at test time.

3.2.1 RAG基本流程

(1)数据收集与预处理:

首先,收集所有实际应用的业务数据,如产品手册、开发文档、业务流程规范、FAQ(常见问题)等。这些数据将作为后续检索的基础。预处理阶段则是对这些数据进行必要的清洗和格式化,以便构建索引和进行后续的检索操作。

(2)构建索引

在构建索引阶段,需要对知识库中的每一个文档片段或句子进行编码,得到对应的向量表示,并存储在索引中。这些向量表示有助于快速检索与输入文本相关的信息。

(3)检索阶段

当用户输入查询文本时,RAG系统利用编码器将查询文本转换成高维向量表示。然后,使用高效的近似最近邻搜索算法(如Annoy、FAISS等)找出与输入向量最相似的一组文档片段或关键词。检索的结果可以是文本片段、关键词或结构化数据等。

(4)融合阶段

检索到的信息与输入文本进行融合,以便为生成模型提供丰富的上下文。融合的方式可以根据任务进行调整,以最大限度地发挥检索信息地作用。

(5)生成阶段

最后,利用融合后地信息和生成模型地训练数据,结合生成算法,生成与目标主题相关地文本。这个生成文本将考虑检索到地信息,以提供更准确和全面地结果。

3.2 设计与实现RAG流程
(1)百科检索

request:用于根据关键词下载对应网页

BeautifulSoup:用于解析html源代码

(2)文本拆分

RecursiveCharacterTextSplitter:根据换行符等切分文本

Document:LangChain用于存储文本的类型

(3)文本嵌入

HuggingFaceBgeEmbeddings:用于构建文本嵌入模型

Chroma:一个方便使用的向量数据库

(4)大模型构建

HuggingFacePipeline:用于在LangChain中调用来自huggingface的模型

(5)对话模板

SystemMessagePromptTemplate:大模型收到的提示

HumanMessagePromptTemplate:用户输入的提示

StuffDocumentsChain:用于将检索结果加入对话中

ConversationalRetrievalChain:用于构建RAG对话

# 1. 导入所有必要的库
import os
import requests
from typing import List, Tuple
from bs4 import BeautifulSoup
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document
from langchain.embeddings import HuggingFaceBgeEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import Tongyi
from langchain.prompts import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    ChatPromptTemplate
)
from langchain.chains import StuffDocumentsChain, LLMChain, ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

# 2. 环境变量设置(请替换为你的实际API密钥)
os.environ["DASHSCOPE_API_KEY"] = "你的阿里云通义千问API密钥"

# 3. 网页下载与解析函数
def download_and_parse_webpage(url: str) -> str:
    """
    根据URL下载网页并提取纯文本内容
    
    Args:
        url: 要下载的网页URL
        
    Returns:
        网页的纯文本内容
    """
    try:
        # 发送HTTP请求
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查请求是否成功
        
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(response.content, 'html.parser')
        
        # 移除脚本、样式等无关元素
        for element in soup(["script", "style", "nav", "footer", "header"]):
            element.decompose()
        
        # 提取正文文本
        text = soup.get_text(separator='\n', strip=True)
        
        # 清理多余的空白字符
        lines = [line.strip() for line in text.splitlines() if line.strip()]
        clean_text = '\n'.join(lines)
        
        print(f"✅ 成功下载并解析: {url}")
        print(f"📄 提取文本长度: {len(clean_text)} 字符")
        
        return clean_text
    
    except Exception as e:
        print(f"❌ 下载网页失败: {e}")
        return""

# 4. 文本拆分器
def create_text_splitter() -> RecursiveCharacterTextSplitter:
    """
    创建文本拆分器,用于将长文本切分为适合处理的片段
    """
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=500,          # 每个文本块的最大字符数
        chunk_overlap=50,        # 块之间的重叠字符数
        length_function=len,     # 计算文本长度的函数
        separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""]  # 拆分分隔符
    )
    return text_splitter

# 5. 文本嵌入模型初始化
def create_embedding_model() -> HuggingFaceBgeEmbeddings:
    """
    初始化文本嵌入模型
    """
    model_name = "BAAI/bge-small-zh"# 中文小模型,适合本地运行
    model_kwargs = {'device': 'cpu'}  # 使用CPU,如需GPU可改为'cuda'
    encode_kwargs = {'normalize_embeddings': True}  # 标准化嵌入向量
    
    embeddings = HuggingFaceBgeEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )
    
    print(f"✅ 加载嵌入模型: {model_name}")
    return embeddings

# 6. 向量数据库初始化
def create_vector_store(documents: List[Document], 
                       embeddings: HuggingFaceBgeEmbeddings,
                       persist_directory: str = "./chroma_db") -> Chroma:
    """
    创建并持久化向量数据库
    
    Args:
        documents: 文档列表
        embeddings: 嵌入模型
        persist_directory: 向量数据库保存路径
    """
    # 创建向量数据库
    vector_store = Chroma.from_documents(
        documents=documents,
        embedding=embeddings,
        persist_directory=persist_directory
    )
    
    # 持久化到磁盘
    vector_store.persist()
    
    print(f"✅ 向量数据库创建完成,共 {len(documents)} 个文档块")
    print(f"💾 数据库保存到: {persist_directory}")
    
    return vector_store

# 7. 构建对话链
def create_conversation_chain(vector_store: Chroma) -> ConversationalRetrievalChain:
    """
    构建完整的RAG对话链
    
    Args:
        vector_store: 向量数据库实例
    """
    # 初始化大语言模型
    llm = Tongyi(
        model="qwen-max",  # 使用通义千问最大模型
        temperature=0.3,   # 温度参数,控制随机性
        max_tokens=1000    # 最大输出token数
    )
    
    # 创建对话记忆
    memory = ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True,
        output_key="answer"
    )
    
    # 系统提示模板
    system_template = """你是一个专业的AI助手,基于提供的上下文信息回答问题。
    
    上下文信息:
    {context}
    
    请根据以上上下文信息,准确、专业地回答用户的问题。
    如果上下文信息不足以回答问题,请诚实地告知用户,不要编造信息。"""
    
    system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
    
    # 用户提示模板
    human_template = "{question}"
    human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
    
    # 组合提示模板
    chat_prompt = ChatPromptTemplate.from_messages([
        system_message_prompt,
        human_message_prompt
    ])
    
    # 创建问答链
    question_chain = LLMChain(llm=llm, prompt=chat_prompt)
    
    # 创建文档组合链
    combine_documents_chain = StuffDocumentsChain(
        llm_chain=question_chain,
        document_variable_name="context"
    )
    
    # 创建检索器
    retriever = vector_store.as_retriever(
        search_type="similarity",  # 相似度搜索
        search_kwargs={"k": 4}     # 返回最相关的4个文档块
    )
    
    # 创建完整的对话检索链
    conversation_chain = ConversationalRetrievalChain.from_llm(
        llm=llm,
        retriever=retriever,
        memory=memory,
        combine_docs_chain=combine_documents_chain,
        verbose=True# 显示详细处理过程
    )
    
    print("✅ 对话链构建完成")
    return conversation_chain

# 8. 主函数:完整的RAG系统流程
def main():
    """主函数:演示完整的RAG系统工作流程"""
    print("=" * 60)
    print("🔧 RAG系统启动")
    print("=" * 60)
    
    # 步骤1: 下载网页内容
    print("\n1️⃣ 网页下载与解析")
    print("-" * 40)
    
    # 示例URL(维基百科关于人工智能的页面)
    sample_urls = [
        "https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD"
    ]
    
    all_texts = []
    for url in sample_urls:
        text = download_and_parse_webpage(url)
        if text:
            all_texts.append(text)
    
    ifnot all_texts:
        print("❌ 未能获取任何网页内容,程序退出")
        return
    
    # 步骤2: 文本拆分
    print("\n2️⃣ 文本拆分处理")
    print("-" * 40)
    text_splitter = create_text_splitter()
    
    # 创建Document对象
    documents = []
    for i, text in enumerate(all_texts):
        chunks = text_splitter.split_text(text)
        for chunk in chunks:
            doc = Document(
                page_content=chunk,
                metadata={"source": sample_urls[i], "chunk_id": len(documents)}
            )
            documents.append(doc)
    
    print(f"📊 原始文本拆分为 {len(documents)} 个文档块")
    
    # 步骤3: 初始化嵌入模型
    print("\n3️⃣ 初始化文本嵌入模型")
    print("-" * 40)
    embeddings = create_embedding_model()
    
    # 步骤4: 创建向量数据库
    print("\n4️⃣ 创建向量数据库")
    print("-" * 40)
    vector_store = create_vector_store(documents, embeddings)
    
    # 步骤5: 构建对话链
    print("\n5️⃣ 构建对话链")
    print("-" * 40)
    conversation_chain = create_conversation_chain(vector_store)
    
    # 步骤6: 演示对话
    print("\n" + "=" * 60)
    print("💬 开始对话演示(输入 '退出' 结束)")
    print("=" * 60)
    
    # 示例问题
    example_questions = [
        "人工智能是什么?",
        "人工智能有哪些主要应用领域?",
        "机器学习与人工智能有什么区别?"
    ]
    
    print("\n💡 你可以尝试提问以下问题:")
    for i, q in enumerate(example_questions, 1):
        print(f"  {i}. {q}")
    
    # 交互式对话
    whileTrue:
        print("\n" + "-" * 40)
        user_input = input("\n🤔 请输入你的问题: ").strip()
        
        if user_input.lower() in ['退出', 'exit', 'quit', 'q']:
            print("👋 感谢使用,再见!")
            break
        
        ifnot user_input:
            continue
        
        try:
            print("\n🤖 AI正在思考...")
            # 执行检索和生成
            response = conversation_chain({"question": user_input})
            answer = response.get("answer", "抱歉,我无法回答这个问题。")
            
            print(f"\n💡 AI回答: {answer}")
            
            # 显示检索到的来源(可选)
            if"source_documents"in response:
                print(f"\n📚 参考来源: {len(response['source_documents'])} 个文档块")
                for i, doc in enumerate(response['source_documents'][:2], 1):
                    print(f"  来源{i}: {doc.page_content[:100]}...")
        
        except Exception as e:
            print(f"❌ 处理问题时出错: {e}")

# 9. 运行主函数
if __name__ == "__main__":
    main()

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

在这里插入图片描述

在这里插入图片描述

大模型入门到实战全套学习大礼包

1、大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

img


2、大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

在这里插入图片描述

3、AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

img

4、大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

img

5、大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

img

适用人群

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐