使用LlamaIndex与MongoDB构建RAG系统实践指南
1. 项目概述
在构建现代AI应用时,如何让大语言模型(LLM)生成更准确、更具上下文相关性的响应一直是个关键挑战。Retrieval-Augmented Generation (RAG)系统通过将信息检索技术与生成式AI相结合,有效解决了这一问题。本文将详细介绍如何使用LlamaIndex框架与MongoDB向量数据库构建一个完整的RAG系统。
这个技术组合特别适合需要处理大量结构化或半结构化数据的场景,比如电商产品推荐、知识库问答或内容管理系统。MongoDB作为操作型数据库和向量数据库的双重角色,加上LlamaIndex对RAG流程的抽象,为开发者提供了高效且灵活的解决方案。
2. 核心组件解析
2.1 RAG系统工作原理
RAG系统的工作流程可以分为三个主要阶段:
- 检索阶段 :将用户查询转换为向量表示,从数据库中检索最相关的文档片段
- 增强阶段 :将检索到的相关内容与原始查询结合,形成增强的上下文
- 生成阶段 :LLM基于增强后的上下文生成最终响应
与传统LLM应用相比,RAG系统的优势在于:
- 可以访问私有或最新数据(不受限于模型训练数据)
- 生成的响应更具事实准确性
- 能够提供引用来源,增加可信度
2.2 LlamaIndex的核心价值
LlamaIndex是一个专门为RAG场景设计的框架,它主要解决了以下几个痛点:
- 数据连接抽象 :统一不同数据源的接入方式(API、数据库、文件等)
- 文档处理流水线 :提供文本分块、元数据提取、嵌入生成等标准化处理
- 检索接口标准化 :封装了多种相似度检索算法和策略
在实际项目中,使用LlamaIndex可以节省约40%的底层代码开发量,让团队更专注于业务逻辑的实现。
2.3 MongoDB作为向量数据库的优势
MongoDB Atlas从7.0版本开始原生支持向量搜索,这使得它成为RAG系统的理想选择:
- 一体化架构 :无需维护单独的向量数据库,降低系统复杂度
- 灵活的数据模型 :可以同时存储原始数据、元数据和向量嵌入
- 成熟的运维生态 :备份、监控、扩展等企业级功能开箱即用
特别是在需要处理复杂业务数据的场景中,MongoDB的文档模型比专门的向量数据库(如Pinecone)更具优势。
3. 环境准备与配置
3.1 安装必要的Python库
pip install llama-index
pip install llama-index-vector-stores-mongodb
pip install llama-index-embeddings-openai
pip install pymongo
pip install datasets
pip install pandas
这些库构成了我们的技术栈基础:
llama-index: 核心框架llama-index-vector-stores-mongodb: MongoDB向量存储集成llama-index-embeddings-openai: OpenAI嵌入模型接口pymongo: MongoDB官方Python驱动datasets: Hugging Face数据集加载工具pandas: 数据处理工具
提示:建议使用Python 3.10或更高版本,以避免潜在的依赖冲突。如果使用虚拟环境,可以先创建并激活环境:
python -m venv rag_env source rag_env/bin/activate # Linux/Mac # 或 .\rag_env\Scripts\activate # Windows
3.2 配置API密钥
import os
os.environ["OPENAI_API_KEY"] = "your-api-key-here" # 替换为你的实际API密钥
os.environ["MONGO_URI"] = "mongodb+srv://user:password@cluster.mongodb.net" # MongoDB连接字符串
安全提示:
- 永远不要将API密钥直接硬编码在源代码中
- 在生产环境中,应该使用密钥管理服务(如AWS Secrets Manager)
- 对于Jupyter Notebook开发,可以使用
python-dotenv加载.env文件
4. 数据处理流程
4.1 加载示例数据集
我们使用MongoDB官方提供的Airbnb数据集作为示例:
from datasets import load_dataset
import pandas as pd
dataset = load_dataset("MongoDB/airbnb_embeddings")
dataset_df = pd.DataFrame(dataset['train'])
dataset_df = dataset_df.drop(columns=['text_embeddings']) # 我们将自己生成嵌入
这个数据集包含房源的各种信息:
- 描述文本
- 设施列表
- 地理位置
- 评价分数
- 图片链接等
4.2 数据预处理
将Pandas DataFrame转换为LlamaIndex可处理的文档格式:
import json
from llama_index.core import Document
from llama_index.core.schema import MetadataMode
documents_json = dataset_df.to_json(orient='records')
documents_list = json.loads(documents_json)
llama_documents = []
for document in documents_list:
# 将复杂字段序列化为JSON字符串
for field in ["amenities", "images", "host", "address",
"availability", "review_scores", "reviews", "image_embeddings"]:
document[field] = json.dumps(document[field])
# 创建Document对象
llama_document = Document(
text=document["description"],
metadata=document,
excluded_llm_metadata_keys=["_id", "transit", "minimum_nights", ...],
excluded_embed_metadata_keys=["_id", "transit", "minimum_nights", ...],
metadata_template="{key}=>{value}",
text_template="Metadata: {metadata_str}\n-----\nContent: {content}",
)
llama_documents.append(llama_document)
关键设计决策:
- 元数据过滤 :排除了不相关的字段,避免干扰LLM和嵌入模型
- 文本模板 :明确区分元数据和内容,提高模型理解能力
- 复杂字段处理 :将嵌套结构序列化为字符串,保持数据完整性
4.3 文档分块与嵌入生成
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.openai import OpenAIEmbedding
embed_model = OpenAIEmbedding(model="text-embedding-3-small", dimensions=256)
parser = SentenceSplitter(chunk_size=5000) # 根据文档特点调整块大小
nodes = parser.get_nodes_from_documents(llama_documents)
for node in nodes:
node_embedding = embed_model.get_text_embedding(
node.get_content(metadata_mode=MetadataMode.EMBED)
)
node.embedding = node_embedding
分块策略考虑:
- 对于描述性文本,5000字符的块大小能保持上下文完整性
- 技术文档可能需要更小的块(2000-3000字符)
- 对话记录则适合按对话轮次分块
5. MongoDB向量搜索配置
5.1 创建向量搜索索引
在MongoDB Atlas中,我们需要为集合创建专门的向量搜索索引。以下是索引定义的JSON配置:
{
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 256,
"similarity": "cosine"
},
{
"type": "filter",
"path": "metadata.neighborhood"
}
]
}
这个配置定义了两个关键部分:
- 向量字段 :存储文本嵌入,使用余弦相似度计算
- 过滤字段 :允许基于neighborhood进行预过滤
5.2 Python客户端设置
import pymongo
def get_mongo_client(mongo_uri):
try:
client = pymongo.MongoClient(mongo_uri)
print("成功连接到MongoDB")
return client
except pymongo.errors.ConnectionFailure as e:
print(f"连接失败: {e}")
return None
mongo_client = get_mongo_client(os.getenv("MONGO_URI"))
DB_NAME = "airbnb"
COLLECTION_NAME = "listings_reviews"
# 清空现有集合(仅用于演示)
mongo_client[DB_NAME][COLLECTION_NAME].delete_many({})
连接最佳实践:
- 使用连接池提高性能
- 设置合理的超时参数(默认可能不适合生产环境)
- 在应用关闭时显式关闭连接
6. 数据导入与查询
6.1 将节点导入MongoDB
from llama_index.vector_stores.mongodb import MongoDBAtlasVectorSearch
vector_store = MongoDBAtlasVectorSearch(
mongo_client,
db_name=DB_NAME,
collection_name=COLLECTION_NAME,
index_name="vector_index"
)
vector_store.add(nodes)
导入过程注意事项:
- 大批量导入时建议使用批量插入
- 监控内存使用,避免OOM错误
- 考虑添加进度指示器,特别是处理大量文档时
6.2 构建查询引擎
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_vector_store(vector_store)
query_engine = index.as_query_engine(
similarity_top_k=3,
vector_store_query_mode="hybrid", # 结合语义和关键词搜索
alpha=0.5 # 平衡两种搜索的权重
)
参数调优建议:
similarity_top_k:根据召回精度需求调整alpha:通过A/B测试确定最佳值- 可以添加
filters参数实现基于元数据的过滤
6.3 执行查询并解析结果
query = "我想找一个温暖友好的住处,距离餐厅不要太远,能推荐一个地方吗?请说明推荐理由"
response = query_engine.query(query)
print("生成的回答:")
print(response.response)
print("\n参考来源:")
for node in response.source_nodes:
print(f"- {node.metadata['name']} (相似度得分: {node.score:.2f})")
典型输出示例:
生成的回答:
我推荐"阳光海岸别墅",这是一个评价很高的房源,房东以热情好客著称。房源位于市中心,步行5分钟内有超过20家餐厅。根据评价,94%的客人提到了"便利的位置"和"友好的房东"。
参考来源:
- 阳光海岸别墅 (相似度得分: 0.87)
- 市中心豪华公寓 (相似度得分: 0.82)
- 花园景观套房 (相似度得分: 0.79)
7. 高级优化技巧
7.1 查询重写与扩展
为了提高检索质量,可以在查询前对用户输入进行优化:
from llama_index.core.indices.query.query_transform import HyDEQueryTransform
hyde_transform = HyDEQueryTransform(include_original=True)
# 原始查询
original_query = "找个离地铁近的干净房子"
# 应用HyDE转换
hyde_query = hyde_transform.run(original_query)
print(f"转换后的查询: {hyde_query}")
HyDE(Hypothetical Document Embeddings)技术会生成假设性文档,通常能显著提高检索相关性。
7.2 混合检索策略
结合多种检索方法可以获得更好的结果:
from llama_index.core.retrievers import VectorIndexRetriever, KeywordTableRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
# 创建不同的检索器
vector_retriever = VectorIndexRetriever(index=index, similarity_top_k=2)
keyword_retriever = KeywordTableRetriever(index=index, similarity_top_k=2)
# 组合检索器
from llama_index.core.retrievers import FusionRetriever
fusion_retriever = FusionRetriever(
[vector_retriever, keyword_retriever],
weights=[0.6, 0.4], # 可以调整权重
mode="reciprocal_rank_fusion" # 融合算法
)
# 创建查询引擎
query_engine = RetrieverQueryEngine.from_args(
fusion_retriever,
llm=llm,
response_mode="tree_summarize"
)
7.3 性能监控与优化
对于生产系统,应该建立完善的监控:
import time
from prometheus_client import start_http_server, Summary
# 创建指标
QUERY_TIME = Summary('query_processing_seconds', 'Time spent processing queries')
@QUERY_TIME.time()
def process_query(query):
start_time = time.time()
response = query_engine.query(query)
latency = time.time() - start_time
# 记录质量指标
record_quality_metrics(response)
return response
def record_quality_metrics(response):
# 可以记录:引用数量、引用相似度分数等
pass
# 启动监控服务器
start_http_server(8000)
关键监控指标:
- 查询延迟(P50, P95, P99)
- 引用相关性分数分布
- 缓存命中率(如果实现了缓存层)
- 错误率和重试率
8. 生产环境部署建议
8.1 架构设计
对于高流量生产系统,推荐采用以下架构:
- 前端层 :负载均衡 + API网关
- 应用层 :无状态服务实例,每个实例包含:
- 查询解析器
- 检索器
- 结果生成器
- 数据层 :
- MongoDB Atlas集群(分片配置)
- Redis缓存(存储常用查询结果)
- 监控层 :
- Prometheus + Grafana
- 日志聚合系统(ELK或等效方案)
8.2 扩展性考虑
- 水平扩展 :应用层可以轻松增加实例
- 数据分片 :MongoDB支持基于分片键的水平扩展
- 缓存策略 :
- 高频查询结果缓存
- 嵌入向量缓存(节省模型调用成本)
- 异步处理 :对于复杂查询,可以采用异步任务队列
8.3 安全最佳实践
- 数据安全 :
- 加密敏感字段
- 实施字段级访问控制
- 定期审计数据访问
- API安全 :
- 实施速率限制
- 验证和清理所有输入
- 使用API网关进行保护
- 模型安全 :
- 监控提示注入攻击
- 实施输出内容过滤
- 保留完整的审计日志
9. 常见问题排查
9.1 检索结果不相关
可能原因及解决方案:
-
嵌入模型不匹配 :
- 确保查询时使用的嵌入模型与索引时相同
- 考虑微调嵌入模型以适应特定领域
-
分块策略不当 :
- 尝试不同的块大小和重叠设置
- 对于技术文档,考虑按章节而非固定大小分块
-
元数据缺失 :
- 检查是否过滤掉了有用的元数据
- 添加更多描述性元数据字段
9.2 查询速度慢
性能优化检查清单:
-
索引优化 :
- 确保向量索引已正确构建
- 考虑添加复合索引(向量+过滤字段)
-
资源瓶颈 :
- 检查MongoDB集群资源使用情况
- 考虑增加更多查询节点
-
网络延迟 :
- 确保应用与数据库在同一区域
- 测试网络往返时间(RTT)
9.3 LLM生成质量差
改进生成质量的技巧:
-
提示工程 :
- 设计更明确的系统提示
- 提供回答格式示例
-
上下文优化 :
- 调整返回的上下文文档数量
- 实现重新排序(reranking)步骤
-
后处理 :
- 添加事实核查步骤
- 实现结果评分机制
10. 项目扩展方向
10.1 多模态RAG
结合图像和文本信息:
from llama_index.multi_modal_llms.openai import OpenAIMultiModal
from llama_index.core.indices import MultiModalVectorStoreIndex
# 初始化多模态LLM
openai_mm_llm = OpenAIMultiModal(model="gpt-4-vision-preview")
# 创建多模态索引
mm_index = MultiModalVectorStoreIndex(
vector_store=vector_store,
image_vector_store=image_vector_store # 需要单独配置
)
10.2 对话历史集成
实现多轮对话能力:
from llama_index.core.memory import ChatMemoryBuffer
memory = ChatMemoryBuffer.from_defaults(llm=llm, chat_history=[])
query_engine = index.as_query_engine(
memory=memory,
chat_mode="context",
similarity_top_k=3
)
10.3 自动化评估框架
建立质量评估体系:
from llama_index.core.evaluation import RetrieverEvaluator
# 定义评估数据集
eval_questions = ["...", "..."] # 测试问题列表
eval_answers = ["...", "..."] # 参考答案
# 创建评估器
retriever_evaluator = RetrieverEvaluator.from_metric_names(
["mrr", "hit_rate"], retriever=vector_retriever
)
# 运行评估
eval_results = retriever_evaluator.evaluate(
queries=eval_questions,
expected_ids=eval_answers # 文档ID列表
)
11. 实际应用案例
11.1 房地产推荐系统
使用RAG构建的房产推荐系统可以:
- 理解自然语言查询("海边带泳池的别墅")
- 结合用户偏好历史
- 提供详细推荐理由
技术要点:
- 地理空间索引与向量搜索结合
- 个性化重排序模型
- 动态定价分析集成
11.2 企业知识库
内部知识问答系统实现:
- 从Confluence、PDF等文档提取知识
- 支持基于角色的访问控制
- 保持知识实时更新(通过变更数据捕获)
部署挑战:
- 文档权限映射
- 专有名词识别
- 多语言支持
11.3 电商产品搜索
改进传统电商搜索:
- 理解模糊查询("适合雨天穿的外套")
- 结合用户浏览历史
- 生成比较表格和购买建议
性能考量:
- 低延迟要求(<500ms)
- 高并发支持
- 结果多样性控制
12. 技术选型对比
12.1 向量数据库选项
| 特性 | MongoDB Atlas | Pinecone | Weaviate | Milvus |
|---|---|---|---|---|
| 托管服务 | ✓ | ✓ | ✓ | ✓ |
| 混合搜索 | ✓ | ✗ | ✓ | ✓ |
| 原生多模态支持 | ✗ | ✗ | ✓ | ✗ |
| ACID事务 | ✓ | ✗ | ✗ | ✗ |
| 与LlamaIndex集成 | ✓ | ✓ | ✓ | ✓ |
12.2 嵌入模型选择
对于英文内容:
- text-embedding-3-large :最高质量,较高成本
- text-embedding-3-small :性价比之选
- bge-small-en :开源替代方案
对于中文内容:
- bge-base-zh :专门优化的中文模型
- text-embedding-3-small :多语言支持
12.3 LLM选项
| 模型 | 最佳使用场景 | 成本考虑 |
|---|---|---|
| GPT-4-turbo | 高质量生成,复杂推理 | 较高 |
| Claude 3 Sonnet | 长文档处理 | 中等 |
| Mistral 7B | 开源选择,可自托管 | 基础设施成本 |
| Llama 3 70B | 需要最强开源模型 | 需要强大GPU |
13. 成本优化策略
13.1 嵌入生成优化
-
批量处理 :减少API调用次数
# 不好的做法:逐个文档处理 for doc in documents: embed = embed_model.get_text_embedding(doc.text) # 好的做法:批量处理 texts = [doc.text for doc in documents] embeddings = embed_model.get_text_embedding_batch(texts) -
缓存策略 :避免重复计算相同内容的嵌入
from diskcache import Cache cache = Cache("embedding_cache") @cache.memoize() def get_cached_embedding(text): return embed_model.get_text_embedding(text)
13.2 查询优化
-
两阶段检索 :
- 第一阶段:快速但粗略的检索(如BM25)
- 第二阶段:对少量候选文档进行精确向量搜索
-
预过滤 :
query_engine = index.as_query_engine( vector_store_kwargs={ "filter": {"metadata.neighborhood": "Downtown"} } )
13.3 基础设施优化
-
选择合适的MongoDB层级 :
- 开发环境:M0免费层
- 中小流量:M20/M30
- 高流量生产:M40+或专用集群
-
自动缩放 :
- 配置基于CPU使用率的自动扩展
- 设置读写分离
-
冷热数据分离 :
- 频繁访问的数据放在更快的存储层
- 历史数据归档到成本更低的存储
14. 维护与更新策略
14.1 数据更新机制
-
增量更新 :
# 检查哪些文档需要更新 from pymongo import UpdateOne updates = [] for doc in changed_documents: updates.append(UpdateOne( {"_id": doc.id}, {"$set": {"embedding": new_embedding}}, upsert=True )) collection.bulk_write(updates) -
全量重建 :
- 定期(如每周)重建整个索引
- 可以在低峰期进行
- 使用影子部署模式切换新旧索引
14.2 模型版本管理
-
嵌入模型升级 :
- 保留旧模型用于现有查询
- 新文档使用新模型嵌入
- 逐步迁移或一次性重建
-
LLM版本控制 :
# 配置多版本支持 llm_versions = { "gpt-4-0125": OpenAI(model="gpt-4-0125"), "gpt-4-turbo": OpenAI(model="gpt-4-turbo") }
14.3 监控与告警
关键监控指标:
-
数据质量 :
- 空嵌入比例
- 嵌入维度一致性
-
查询质量 :
- 平均相似度分数
- 无结果查询比例
-
系统健康 :
- MongoDB操作延迟
- 错误率
- 缓存命中率
告警规则示例:
- 连续5分钟错误率>1%
- 平均查询延迟>1秒
- 缓存命中率<80%
15. 团队协作建议
15.1 开发流程
-
环境隔离 :
- 开发、测试、生产环境完全分离
- 每个环境有独立的MongoDB集群
-
代码评审重点 :
- 嵌入模型一致性
- 元数据处理逻辑
- 查询安全过滤
-
文档标准 :
- 所有自定义参数必须有注释说明
- 记录所有设计决策理由
- 维护数据字典
15.2 知识共享
-
定期复盘 :
- 分析失败查询案例
- 分享成功优化经验
- 讨论新兴技术趋势
-
内部培训 :
- LlamaIndex核心概念
- MongoDB最佳实践
- 提示工程技巧
-
工具建设 :
- 查询分析仪表板
- 交互式演示环境
- 案例知识库
15.3 跨团队协作
与不同团队的合作要点:
-
产品团队 :
- 明确RAG系统能力边界
- 共同设计评估指标
- 建立需求优先级框架
-
数据工程团队 :
- 制定数据更新SLA
- 统一监控标准
- 协调资源使用
-
运维团队 :
- 容量规划协作
- 灾备方案设计
- 安全审计配合
16. 伦理与合规考量
16.1 数据隐私
-
匿名化处理 :
- 移除个人身份信息(PII)
- 使用数据脱敏技术
- 实施访问控制
-
用户同意 :
- 明确告知数据使用方式
- 提供选择退出机制
- 记录同意状态
16.2 内容安全
-
输出过滤 :
from llama_index.core.postprocessor import SensitivePostprocessor sensitive_postprocessor = SensitivePostprocessor( filter_list=["信用卡号", "密码", "SSN"] ) query_engine = index.as_query_engine( node_postprocessors=[sensitive_postprocessor] ) -
滥用预防 :
- 实施速率限制
- 监控异常查询模式
- 保留完整审计日志
16.3 偏见与公平性
缓解策略:
-
数据审计 :
- 分析训练数据代表性
- 检测潜在偏见模式
-
结果评估 :
- 对不同人群测试系统表现
- 监控公平性指标
-
纠正机制 :
- 实现人工覆盖功能
- 提供反馈渠道
17. 未来发展方向
17.1 技术演进跟踪
值得关注的新趋势:
-
小型化LLM :
- 更高效的微调技术
- 模型蒸馏方法
-
多模态检索 :
- 联合文本-图像嵌入
- 跨模态注意力机制
-
自优化系统 :
- 基于用户反馈的自动调优
- 持续学习架构
17.2 架构演进
下一代RAG系统可能包含:
-
动态检索 :
- 根据查询复杂度调整检索深度
- 分层检索策略
-
联邦检索 :
- 跨多个数据源联合搜索
- 隐私保护技术集成
-
推理优化 :
- 推测解码
- 模型级联
17.3 应用创新
潜在创新应用场景:
-
教育领域 :
- 个性化学习助手
- 自动习题生成
-
医疗健康 :
- 医学文献问答
- 患者教育工具
-
金融服务 :
- 法规合规助手
- 财务规划顾问
18. 资源推荐
18.1 学习资料
-
官方文档 :
-
教程课程 :
- Coursera: "Advanced NLP with spaCy"
- Udemy: "Building Production-Ready RAG Applications"
-
研究论文 :
- "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (2020)
- "Improving Passage Retrieval with Zero-Shot Question Generation" (2022)
18.2 开发工具
-
本地开发环境 :
- Docker容器化部署
- JupyterLab交互式开发
-
测试工具 :
- Pytest单元测试框架
- Locust负载测试
-
调试工具 :
- LlamaIndex调试回调
- MongoDB查询分析器
18.3 社区支持
-
论坛社区 :
- LlamaIndex Discord频道
- MongoDB社区论坛
-
开源项目 :
- LangChain
- Haystack
-
行业会议 :
- MongoDB.local
- AI Engineer Summit
19. 完整示例代码
以下是整合所有关键步骤的完整示例:
# 1. 环境配置
import os
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
os.environ["OPENAI_API_KEY"] = "your-api-key"
os.environ["MONGO_URI"] = "your-mongo-uri"
Settings.llm = OpenAI(model="gpt-4-turbo")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# 2. 数据准备
from datasets import load_dataset
import pandas as pd
dataset = load_dataset("MongoDB/airbnb_embeddings")
dataset_df = pd.DataFrame(dataset['train'])
# 3. 文档处理
from llama_index.core import Document
import json
documents = []
for _, row in dataset_df.iterrows():
doc = Document(
text=row["description"],
metadata=row.to_dict(),
excluded_llm_metadata_keys=["_id", "image_embeddings"],
text_template="房源描述: {content}\n元数据: {metadata_str}"
)
documents.append(doc)
# 4. 节点创建与嵌入
from llama_index.core.node_parser import SentenceSplitter
parser = SentenceSplitter(chunk_size=5000)
nodes = parser.get_nodes_from_documents(documents)
# 5. MongoDB设置
import pymongo
from llama_index.vector_stores.mongodb import MongoDBAtlasVectorSearch
client = pymongo.MongoClient(os.getenv("MONGO_URI"))
vector_store = MongoDBAtlasVectorSearch(
client,
db_name="airbnb",
collection_name="listings",
index_name="vector_index"
)
# 6. 数据导入
vector_store.add(nodes)
# 7. 查询引擎
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_vector_store(vector_store)
query_engine = index.as_query_engine(
similarity_top_k=3,
vector_store_query_mode="hybrid"
)
# 8. 执行查询
response = query_engine.query("推荐一个适合家庭入住的市中心房源")
print(response)
20. 结语
构建RAG系统是一个需要不断迭代和优化的过程。在实际项目中,我们经历了从最初的概念验证到生产部署的完整周期,有几个关键体会:
-
数据质量决定上限 :无论模型多先进,垃圾进就会垃圾出。投入时间清洗和结构化数据总能获得回报。
-
监控不可或缺 :没有完善的监控,就无法理解系统实际表现。我们建立了超过50个关键指标看板。
-
简单往往更有效 :开始我们尝试了复杂的多阶段检索流程,最终发现适当简化的方案反而更可靠。
一个实用的建议是:从小的、定义明确的使用场景开始,逐步扩展。我们最初只支持5种明确的查询类型,确保这些工作完美后再增加复杂性。
最后,RAG技术正在快速发展,保持对新兴技术的关注很重要,但不必盲目追求最新趋势。理解核心原理,扎实解决实际问题,才能构建出真正有价值的应用。
更多推荐



所有评论(0)