大语言模型(LLM),如 GPT-4、Claude 和 Gemini,在文本生成和理解方面表现出色。然而,它们也存在一个显著的弱点:容易产生“幻觉”,即编造事实。在客户支持、文档搜索等实际应用中,我们更需要基于事实依据的答案。这时,RAG(Retrieval-Augmented Generation,检索增强生成)技术就派上了用场。本文将介绍如何使用 Gemini 和 Sentence Transformers 构建一个 RAG 系统,让你的应用程序能够根据自有数据提供精确答案,有效减少大模型的幻觉。
RAG:弥合知识差距,提升大模型可靠性
RAG 是一种通过检索相关信息并将其提供给大模型,从而增强其生成能力的技术。简单来说,它不是让模型直接从记忆中回答问题,而是先帮助模型“查找资料”,然后再给出答案。用户提出的问题会触发一个检索过程,从文档数据库中提取相关数据,然后由大模型利用这些数据生成更具信息量的回复。
RAG 技术的优势显而易见。首先,它显著减少了模型产生幻觉的可能性,确保答案的可靠性。其次,它允许你利用自己的私有数据,而无需重新训练整个模型,大大节省了时间和资源。最后,RAG 在问答系统、文档搜索和智能客服等场景中表现出色,能够提供基于真实知识的交互体验。根据 Gartner 的预测,到 2024 年,超过 50% 的企业将采用某种形式的 RAG 技术来增强其 AI 应用的性能。
Gemini API:赋能 RAG 系统的强大语言模型
Gemini API 是 Google 提供的一系列强大的语言模型接口,它为 RAG 系统提供了核心的生成能力。利用 Gemini API,我们可以将检索到的上下文信息作为提示词(Prompt)的一部分输入到模型中,指示模型根据这些信息生成答案。
例如,在本文介绍的例子中,我们使用 google.generativeai
库来访问 Gemini 模型。通过以下代码初始化模型:
import google.generativeai as genai
# 初始化模型
model = genai.GenerativeModel('gemini-1.5-pro')
Gemini API 提供了多种模型选择,可以根据具体应用场景选择最合适的模型。例如,gemini-1.5-pro
模型具有强大的理解和生成能力,适合处理复杂的问答任务。此外,Gemini API 还提供了各种参数配置,可以调整模型的生成风格和输出质量。
Sentence Transformers:构建高效的向量化知识库
Sentence Transformers 是一种用于将文本转换为向量(嵌入,embeddings)的工具,这些向量能够捕捉文本的语义信息。在 RAG 系统中,Sentence Transformers 用于构建可搜索的知识库。
该工具包通过预训练的深度学习模型,能够将文本转换为高维向量空间中的点,使得语义相似的文本在向量空间中距离更近。这使得我们可以通过计算向量之间的相似度,快速找到与用户查询相关的文档或文本片段。
例如,我们可以使用 all-MiniLM-L6-v2
模型,这是一个轻量级的模型,在速度和准确性之间取得了良好的平衡:
from sentence_transformers import SentenceTransformer
# 初始化 sentence transformer 用于嵌入
embedder = SentenceTransformer('all-MiniLM-L6-v2')
接下来,我们需要将我们的知识库中的文本转换为向量。例如,将知识库中的每一句话都通过 embedder.encode() 转换为向量,存储起来以便后续的相似度计算。
知识库的构建与管理:RAG 系统的基石
一个高质量的知识库是 RAG 系统成功的关键。知识库应该包含所有可能被查询到的信息,并且应该以结构化的方式组织,以便快速检索。
在本文的例子中,知识库是一个简单的 Python 列表,其中包含一些关于巴黎的信息:
# 示例知识库
knowledge_base = [
"The capital of France is Paris.",
"The Eiffel Tower is located in Paris.",
"The Louvre Museum houses the Mona Lisa painting.",
"French cuisine is known for dishes like croissants and baguettes.",
"The French Revolution began in 1789.",
"Paris is divided into 20 arrondissements or districts.",
"The Seine River flows through the heart of Paris.",
"Notre-Dame Cathedral is a famous Parisian landmark.",
"Paris is often referred to as the 'City of Light'.",
"The Paris Metro is one of the busiest subway systems in Europe.",
"Soumendra is an AI Observability architect in Pepsico"
]
在实际应用中,知识库可能包含数百万甚至数十亿个文档。为了提高检索效率,我们可以使用向量数据库,如 FAISS、Milvus 或 ChromaDB。这些数据库专门用于存储和检索高维向量,可以显著提高 RAG 系统的性能。
上下文检索:精准定位相关信息
RAG 系统的核心在于如何从知识库中检索到与用户查询最相关的信息。这通常涉及以下步骤:
- 将用户查询转换为向量: 使用 Sentence Transformers 将用户查询转换为向量。
- 计算相似度: 计算用户查询向量与知识库中所有文档向量之间的相似度。常用的相似度度量方法包括余弦相似度、点积和欧氏距离。
- 选择Top-K个文档: 选择与用户查询最相似的 Top-K 个文档作为上下文信息。
在本文的例子中,retrieve_context
函数实现了上述过程:
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 用于检索相关上下文的函数
def retrieve_context(query, knowledge_base, top_k=2):
query_embedding = embedder.encode([query])
context_embeddings = embedder.encode(knowledge_base)
similarities = cosine_similarity(query_embedding, context_embeddings)[0]
top_indices = np.argsort(similarities)[-top_k:]
return [knowledge_base[i] for i in reversed(top_indices)]
该函数使用余弦相似度来计算查询向量和文档向量之间的相似度,并返回最相似的 Top-K 个文档。top_k
参数控制返回的文档数量,可以根据具体应用场景进行调整。
答案生成:利用 Gemini 整合上下文信息
在检索到相关上下文信息后,我们需要利用 Gemini 模型生成最终答案。这通常涉及以下步骤:
- 构建提示词: 将用户查询和检索到的上下文信息组合成一个提示词。提示词应该清晰地指示模型根据上下文信息回答问题。
- 调用 Gemini API: 将提示词发送给 Gemini API,并获取模型生成的答案。
在本文的例子中,generate_response
函数实现了上述过程:
# 使用 Gemini 生成回复的函数
def generate_response(query, context):
prompt = f"Context: {' '.join(context)}\n\nQuestion: {query}\n\nAnswer:"
response = model.generate_content(prompt)
return response.text
该函数将用户查询和上下文信息拼接成一个字符串,并将其作为提示词发送给 Gemini API。prompt
变量的格式非常重要,它直接影响模型的生成质量。通常,一个好的提示词应该包含以下几个部分:
- Context: 提供上下文信息,帮助模型理解问题。
- Question: 明确用户提出的问题。
- Answer: 指示模型生成答案。
RAG 系统的完整流程与示例
现在,我们已经了解了构建 RAG 系统的各个组成部分。让我们将它们组合起来,构建一个完整的 RAG 系统:
from loguru import logger
# 主要 RAG 函数
def rag_with_gemini(query):
context = retrieve_context(query, knowledge_base)
logger.info(f"{context=}")
logger.info(f"{query=}")
response = generate_response(query, context)
return response
# 示例用法
query = input("Enter your question: ") # 提示用户输入
answer = rag_with_gemini(query)
print(f"Question: {query}")
print(f"Answer: {answer}")
rag_with_gemini
函数封装了整个 RAG 流程:首先,它使用 retrieve_context
函数检索相关上下文信息;然后,它使用 generate_response
函数生成最终答案。
例如,当用户输入 “what is the capital of france?” 时,系统会输出以下结果:
2025-06-10 15:26:24.430 | INFO | __main__:rag_with_gemini:20 - context=['The capital of France is Paris.', 'Paris is divided into 20 arrondissements or districts.']
2025-06-10 15:26:24.431 | INFO | __main__:rag_with_gemini:21 - query='what is the capital of france?'
Question: what is the capital of france?
Answer: The capital of France is Paris.
可以看到,RAG 系统成功地检索到了与问题相关的上下文信息,并利用 Gemini 模型生成了准确的答案。
多模态 RAG:拓展 RAG 的应用边界
RAG 技术不仅可以应用于文本数据,还可以应用于图像、音频和视频等多种模态的数据。多模态 RAG 系统可以处理更复杂的问题,并提供更丰富的用户体验。
例如,我们可以构建一个图像问答系统,用户可以上传一张图片,然后提出与图片相关的问题。RAG 系统会首先分析图片内容,然后从知识库中检索相关信息,最后利用 Gemini 模型生成答案。
一个实际案例是医疗影像诊断。医生可以上传 X 光片或 CT 扫描图像,并提出关于病灶的问题。多模态 RAG 系统可以结合图像分析和医学知识库,帮助医生做出更准确的诊断。
RAG 的未来:持续进化与创新
RAG 技术正在快速发展,未来将出现更多创新应用。一些值得关注的趋势包括:
- 更强大的语言模型: 随着 Gemini 等大型语言模型的不断进步,RAG 系统的生成能力将得到进一步提升。
- 更高效的检索算法: 研究人员正在开发更高效的检索算法,以提高 RAG 系统的性能和可扩展性。例如,基于图神经网络的检索算法可以更好地利用知识库中的结构化信息。
- 更智能的提示词工程: 提示词工程是 RAG 系统成功的关键。未来,我们将看到更多关于如何构建有效提示词的研究和实践,例如利用强化学习自动优化提示词。
总结:利用 RAG 和 Gemini 开启智能应用新篇章
本文介绍了如何使用 Gemini 和 Sentence Transformers 构建一个 RAG 系统。通过将检索和生成相结合,RAG 技术可以显著提高大模型的可靠性和准确性,使其更适合实际应用。随着 Gemini API 和 Sentence Transformers 等工具的不断完善,RAG 技术将变得越来越容易使用,并将在更多领域得到应用。通过理解和应用 RAG 技术,开发者可以构建更智能、更可靠的 AI 应用,为用户提供更优质的服务。