极速RAG实操:30分钟搞定跨境精准问答→内容效率提升50%

大模型(LLM)时代,检索增强生成(RAG)技术正日益成为人工智能领域的一股强劲浪潮。对我们跨境从业者而言,这意味着什么?简单来说,RAG通过结合信息检索与文本生成,让大模型在获取外部知识后,能输出更精准、更实用的内容。这在问答系统、智能客服,乃至内容创作等多个应用场景中都展现了巨大的潜力。
今天,我们就以一名中国跨境人的视角,一起从零开始搭建一个简单的RAG系统,手把手教你理解RAG的核心构成,并掌握其基础实现逻辑。新媒网跨境获悉,掌握这类前沿技术,能为我们的出海业务增添不少竞争力。
RAG到底是什么?
我们先从一个没有RAG的传统聊天机器人说起:
这样的聊天机器人,虽然能基于自身训练数据回答常见问题,但对于最新信息或特定领域的知识,它可能就力不从心了。就像你问ChatGPT:“我妈妈叫什么名字?”它无法回答,因为它没有访问外部知识库的权限,自然不知道你家人的信息。
要解决这个“知识盲区”,我们就需要给模型提供外部知识(比如一张包含家人姓名的列表):
一个RAG系统,通常由两大核心组件构成:
- 检索模型: 负责从外部知识源(可以是数据库、搜索引擎,或其他任何信息库)中,找到与我们提问相关的信息。
- 语言模型: 基于检索到的这些外部知识,生成最终的回答。
RAG的实现方式有很多,比如图谱RAG、混合RAG、分层RAG等,我们会在后面简单提及。但核心思路,都是让大模型变得“有据可依”。
搭建一个简易RAG系统
接下来,我们目标是创建一个能从预设数据集中检索信息,并基于这些信息生成回答的简易RAG系统。这个系统主要包含以下几个部分:
- 嵌入(Embedding)模型: 这个模型就像一个“翻译官”,能把输入的文本转换成“数字指纹”(向量表示)。这些向量能捕捉文本的语义信息,后续我们就可以用它们来搜索数据集中相关的信息。
- 向量数据库: 专门用来存储知识内容及其对应的“数字指纹”。市面上有很多专业的向量数据库,比如Qdrant、Pinecone、pgvector等。为了便于理解,我们这次会从零开始,搭建一个简单的内存版向量数据库。
- 聊天机器人: 这就是我们的语言模型,负责根据检索到的知识生成回答。可以是Llama、Gemma,也可以是GPT等任何一种。
第一步:知识索引
知识索引,是RAG系统搭建的第一步。它要做的事情是,把我们的原始数据集(比如一篇篇文章)切分成一个个小“知识点”,并为每个“知识点”计算出一个向量表示,这样在后续生成回答时就能高效地进行搜索。
每个“知识点”的大小可以根据数据集和具体应用场景来定。比如,在文档检索系统中,一个“知识点”可以是一个段落或一句话;在对话系统中,则可能是一轮对话。
完成索引后,每个“知识点”及其对应的向量都会存储在向量数据库中。下面是一个向量数据库索引完成后的示例:
| 知识点 (Chunk) | 嵌入向量 (Embedding Vector) |
|---|---|
| 意大利和法国的葡萄酒产量占全球总量的40%以上。 | [0.1, 0.04, -0.34, 0.21, ...] |
| 印度泰姬陵完全由大理石建造。 | [-0.12, 0.03, 0.9, -0.1, ...] |
| 全球90%的淡水储藏在南极洲。 | [-0.02, 0.6, -0.54, 0.03, ...] |
| ... | ... |
这些嵌入向量随后会被用来根据给定的查询检索相关信息。你可以把它想象成SQL查询中的WHERE语句,但我们不是通过精确的文本匹配来查询,而是根据向量表示来匹配一组“知识点”。
为了比较两个向量的相似度,我们可以使用余弦相似度(cosine similarity)、欧氏距离(Euclidean distance)或其他距离度量方法。在这个例子中,我们将使用余弦相似度。下面是向量A和B之间余弦相似度的计算公式:
如果你对这个公式不熟悉也没关系,我们会在下一节的代码中实现它。
第二步:智能检索
在下面的图示中,我们以用户输入的一个查询为例。首先,我们会为这个查询计算出一个“查询向量”,然后用它去比对数据库中的所有向量,找出最相关的“知识点”。向量数据库会返回与查询最相关的N个“知识点”。这些“知识点”将作为聊天机器人生成回答的依据。
动手编码实现RAG
我们将用Python来实现一个简单的RAG系统。为了运行大模型,我们会使用ollama,一个强大的命令行工具,它允许你在本地运行来自Hugging Face等平台的模型。这意味着你无需服务器或云服务,就能直接在自己的电脑上体验大模型。新媒网跨境认为,本地部署对于初学者来说,是学习和实践大模型技术非常友好的方式。
这次实验,我们将使用以下模型:
- 嵌入模型:
hf.co/CompendiumLabs/bge-base-en-v1.5-gguf - 语言模型:
hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF
数据集方面,我们准备了一份关于猫咪的简单事实列表。在索引阶段,列表中的每一条事实都将被视为一个独立的“知识点”。
1. 下载ollama与模型
首先,从ollama.com官网下载并安装ollama。
安装完成后,打开终端,运行以下命令下载所需模型:
ollama pull hf.co/CompendiumLabs/bge-base-en-v1.5-gguf
ollama pull hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF
如果看到类似如下的输出,说明模型已成功下载:
pulling manifest ...
verifying sha256 digest
writing manifest success
在继续之前,别忘了安装Python版的ollama库:
pip install ollama
2. 加载数据集
接下来,创建一个Python脚本,并将数据集加载到内存中。数据集包含一系列猫咪的事实,它们将作为索引阶段的“知识点”。你可以从这里下载示例数据集。
加载数据集的代码示例如下:
dataset = []
with open('cat-facts.txt', 'r') as file:
dataset = file.readlines()
print(f'Loaded {len(dataset)} entries')
3. 实现向量数据库
现在,我们来搭建向量数据库。我们将使用ollama的嵌入模型,将每个“知识点”转换为一个嵌入向量,然后把“知识点”和它的向量存储在一个列表中。
下面是计算给定文本嵌入向量的函数示例:
import ollama
EMBEDDING_MODEL = 'hf.co/CompendiumLabs/bge-base-en-v1.5-gguf'
LANGUAGE_MODEL = 'hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF'
# VECTOR_DB的每个元素将是一个元组:(知识点chunk, 嵌入向量embedding)
# 嵌入向量是一个浮点数列表,例如:[0.1, 0.04, -0.34, 0.21, ...]
VECTOR_DB = []
def add_chunk_to_database(chunk):
# 使用ollama模型计算嵌入向量
embedding = ollama.embed(model=EMBEDDING_MODEL, input=chunk)['embeddings'][0]
VECTOR_DB.append((chunk, embedding))
为了简化,在这个例子中,我们将数据集中的每一行都视为一个独立的“知识点”。
for i, chunk in enumerate(dataset):
add_chunk_to_database(chunk)
print(f'Added chunk {i+1}/{len(dataset)} to the database')
4. 实现检索功能
接下来,我们实现检索功能,它会根据余弦相似度,从向量数据库中找出并返回与查询最相关的N个“知识点”。我们可以理解为,两个向量的余弦相似度越高,它们在向量空间中的“距离”就越近,意味着它们在语义上更相似。
下面是计算两个向量之间余弦相似度的函数示例:
def cosine_similarity(a, b):
# 计算点积
dot_product = sum([x * y for x, y in zip(a, b)])
# 计算向量a的模
norm_a = sum([x ** 2 for x in a]) ** 0.5
# 计算向量b的模
norm_b = sum([x ** 2 for x in b]) ** 0.5
return dot_product / (norm_a * norm_b)
现在,来实现我们的检索函数:
def retrieve(query, top_n=3):
# 计算查询的嵌入向量
query_embedding = ollama.embed(model=EMBEDDING_MODEL, input=query)['embeddings'][0]
# 临时列表,存储 (知识点, 相似度) 对
similarities = []
for chunk, embedding in VECTOR_DB:
# 计算查询向量与每个知识点向量的相似度
similarity = cosine_similarity(query_embedding, embedding)
similarities.append((chunk, similarity))
# 按相似度降序排列,因为相似度越高表示越相关
similarities.sort(key=lambda x: x[1], reverse=True)
# 返回最相关的N个知识点
return similarities[:top_n]
5. 回答生成
在这个阶段,聊天机器人将根据上一步检索到的知识生成回答。我们只需将这些检索到的“知识点”添加到提示词(prompt)中,作为聊天机器人的输入。例如,可以这样构建提示词:
input_query = input('问我一个问题: ')
retrieved_knowledge = retrieve(input_query)
print('检索到的知识:')
for chunk, similarity in retrieved_knowledge:
print(f' - (相似度: {similarity:.2f}) {chunk}')
# 构建给大模型的指令提示词,强调只使用提供的上下文
instruction_prompt = f'''你是一个乐于助人的聊天机器人。请只使用以下提供的上下文信息来回答问题,不要编造任何新的信息: {'\n'.join([f' - {chunk}' for chunk, similarity in retrieved_knowledge])} '''
然后,我们使用ollama来生成回答。在这个例子中,我们将instruction_prompt作为系统消息:
stream = ollama.chat(
model=LANGUAGE_MODEL,
messages=[
{'role': 'system', 'content': instruction_prompt},
{'role': 'user', 'content': input_query},
],
stream=True, # 启用流式输出,让回答实时显示
)
# 实时打印聊天机器人的回复
print('聊天机器人回复:')
for chunk in stream:
print(chunk['message']['content'], end='', flush=True)
整合代码并运行
你可以在这个文件找到完整的代码。
将代码保存为demo.py文件,然后在终端运行以下命令:
python demo.py
现在,你可以向聊天机器人提问了,它会根据从数据集中检索到的知识生成回答。
问我一个问题: 告诉我猫的速度
检索到的知识:
...
聊天机器人回复: 根据提供的信息,猫在短距离内可以以大约每小时31英里(49公里)的速度奔跑。这是它们的最高速度。
进阶思考与优化方向
到目前为止,我们已经用一个小型数据集实现了一个简单的RAG系统。但在实际应用中,它还有许多可以提升的空间:
- 处理复杂问题: 如果用户的问题同时涉及多个主题,当前系统可能无法提供完美的回答。因为它只根据查询与“知识点”的相似度进行检索,没有充分考虑问题的上下文。
- 优化思路: 我们可以让聊天机器人根据用户输入,自行改写或生成多个查询,再基于这些查询检索更相关的信息,这被称为“查询重写”或“多轮检索”。
- 检索结果质量: 目前我们只是简单返回相似度最高的N个结果,但这不一定总是最佳选择,特别是当每个“知识点”信息量较大时。
- 优化思路: 可以引入“重排序模型”(reranking model),对检索到的“知识点”根据与查询的相关性进行二次排序,确保返回的上下文质量更高。
- 数据存储扩展性: 当前的数据库是存储在内存中的,对于大型数据集来说,这将很快遇到瓶颈。
- 优化思路: 应该采用更专业的向量数据库,例如Qdrant、Pinecone、或pgvector,它们能高效处理海量向量数据。
- “知识点”切分: 目前我们简单地将每一行视为一个“知识点”。对于更复杂的任务,我们需要更精细的文本分块策略。例如,可以根据章节、段落语义来切分,甚至在添加到数据库前对每个“知识点”进行预处理。
- 模型能力提升: 例子中使用的语言模型参数量较小。
- 优化思路: 对于更复杂的任务或追求更高质量的回答,可能需要使用更大、更强大的语言模型。
新媒网跨境了解到,这些优化方向,能帮助我们构建更健壮、更智能的RAG系统,以应对跨境业务中复杂的实际场景。
其他RAG应用模式
在实践中,RAG系统的实现方式多种多样。以下是一些常见的RAG系统类型:
- 图谱RAG(Graph RAG): 这种RAG将知识源表示为图谱,其中节点是实体,边是实体之间的关系。语言模型可以通过遍历图谱来检索相关信息。这是当前研究的热点。
- 混合RAG(Hybrid RAG): 混合RAG结合了知识图谱(KGs)和向量数据库技术,以提升问答系统的表现。它通过融合结构化和非结构化知识,提供更全面的信息。
- 模块化RAG(Modular RAG): 模块化RAG超越了简单的“检索-生成”流程,它采用路由、调度和融合机制,构建了一个灵活可重构的框架。这种模块化设计允许各种RAG模式(线性、条件、分支和循环),从而实现更复杂和适应性强的知识密集型应用。
更多RAG类型,可以参考外媒Rajeev Sharma的文章。
结语
RAG代表了大模型领域的一项重要进展,它让语言模型变得更加“博学”和准确。通过从零开始搭建一个简单的RAG系统,我们深入探索了嵌入、检索和生成这些核心概念。虽然我们的实现还很基础,但它展现了支撑生产环境中更复杂RAG系统的核心原理。
RAG系统的扩展和改进空间巨大,从部署更高效的向量数据库,到探索图谱RAG、混合RAG等高级架构,前景广阔。随着人工智能领域的不断发展,RAG仍将是增强AI系统外部知识能力、同时保持其生成能力的关键技术,为我们跨境出海业务带来更多创新机遇。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。
本文来源:新媒网 https://nmedialink.com/posts/rag-setup-cross-border-qa-30min-efficiency-50-up.html


粤公网安备 44011302004783号 













