1. 项目概述

在构建现代AI应用时,如何让大语言模型(LLM)生成更准确、更具上下文相关性的响应一直是个关键挑战。Retrieval-Augmented Generation (RAG)系统通过将信息检索技术与生成式AI相结合,有效解决了这一问题。本文将详细介绍如何使用LlamaIndex框架与MongoDB向量数据库构建一个完整的RAG系统。

这个技术组合特别适合需要处理大量结构化或半结构化数据的场景,比如电商产品推荐、知识库问答或内容管理系统。MongoDB作为操作型数据库和向量数据库的双重角色,加上LlamaIndex对RAG流程的抽象,为开发者提供了高效且灵活的解决方案。

2. 核心组件解析

2.1 RAG系统工作原理

RAG系统的工作流程可以分为三个主要阶段:

  1. 检索阶段 :将用户查询转换为向量表示,从数据库中检索最相关的文档片段
  2. 增强阶段 :将检索到的相关内容与原始查询结合,形成增强的上下文
  3. 生成阶段 :LLM基于增强后的上下文生成最终响应

与传统LLM应用相比,RAG系统的优势在于:

  • 可以访问私有或最新数据(不受限于模型训练数据)
  • 生成的响应更具事实准确性
  • 能够提供引用来源,增加可信度

2.2 LlamaIndex的核心价值

LlamaIndex是一个专门为RAG场景设计的框架,它主要解决了以下几个痛点:

  1. 数据连接抽象 :统一不同数据源的接入方式(API、数据库、文件等)
  2. 文档处理流水线 :提供文本分块、元数据提取、嵌入生成等标准化处理
  3. 检索接口标准化 :封装了多种相似度检索算法和策略

在实际项目中,使用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)

关键设计决策:

  1. 元数据过滤 :排除了不相关的字段,避免干扰LLM和嵌入模型
  2. 文本模板 :明确区分元数据和内容,提高模型理解能力
  3. 复杂字段处理 :将嵌套结构序列化为字符串,保持数据完整性

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"
    }
  ]
}

这个配置定义了两个关键部分:

  1. 向量字段 :存储文本嵌入,使用余弦相似度计算
  2. 过滤字段 :允许基于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 架构设计

对于高流量生产系统,推荐采用以下架构:

  1. 前端层 :负载均衡 + API网关
  2. 应用层 :无状态服务实例,每个实例包含:
    • 查询解析器
    • 检索器
    • 结果生成器
  3. 数据层
    • MongoDB Atlas集群(分片配置)
    • Redis缓存(存储常用查询结果)
  4. 监控层
    • Prometheus + Grafana
    • 日志聚合系统(ELK或等效方案)

8.2 扩展性考虑

  • 水平扩展 :应用层可以轻松增加实例
  • 数据分片 :MongoDB支持基于分片键的水平扩展
  • 缓存策略
    • 高频查询结果缓存
    • 嵌入向量缓存(节省模型调用成本)
  • 异步处理 :对于复杂查询,可以采用异步任务队列

8.3 安全最佳实践

  1. 数据安全
    • 加密敏感字段
    • 实施字段级访问控制
    • 定期审计数据访问
  2. API安全
    • 实施速率限制
    • 验证和清理所有输入
    • 使用API网关进行保护
  3. 模型安全
    • 监控提示注入攻击
    • 实施输出内容过滤
    • 保留完整的审计日志

9. 常见问题排查

9.1 检索结果不相关

可能原因及解决方案:

  1. 嵌入模型不匹配

    • 确保查询时使用的嵌入模型与索引时相同
    • 考虑微调嵌入模型以适应特定领域
  2. 分块策略不当

    • 尝试不同的块大小和重叠设置
    • 对于技术文档,考虑按章节而非固定大小分块
  3. 元数据缺失

    • 检查是否过滤掉了有用的元数据
    • 添加更多描述性元数据字段

9.2 查询速度慢

性能优化检查清单:

  1. 索引优化

    • 确保向量索引已正确构建
    • 考虑添加复合索引(向量+过滤字段)
  2. 资源瓶颈

    • 检查MongoDB集群资源使用情况
    • 考虑增加更多查询节点
  3. 网络延迟

    • 确保应用与数据库在同一区域
    • 测试网络往返时间(RTT)

9.3 LLM生成质量差

改进生成质量的技巧:

  1. 提示工程

    • 设计更明确的系统提示
    • 提供回答格式示例
  2. 上下文优化

    • 调整返回的上下文文档数量
    • 实现重新排序(reranking)步骤
  3. 后处理

    • 添加事实核查步骤
    • 实现结果评分机制

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 嵌入生成优化

  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)
    
  2. 缓存策略 :避免重复计算相同内容的嵌入

    from diskcache import Cache
    
    cache = Cache("embedding_cache")
    
    @cache.memoize()
    def get_cached_embedding(text):
        return embed_model.get_text_embedding(text)
    

13.2 查询优化

  1. 两阶段检索

    • 第一阶段:快速但粗略的检索(如BM25)
    • 第二阶段:对少量候选文档进行精确向量搜索
  2. 预过滤

    query_engine = index.as_query_engine(
        vector_store_kwargs={
            "filter": {"metadata.neighborhood": "Downtown"}
        }
    )
    

13.3 基础设施优化

  1. 选择合适的MongoDB层级

    • 开发环境:M0免费层
    • 中小流量:M20/M30
    • 高流量生产:M40+或专用集群
  2. 自动缩放

    • 配置基于CPU使用率的自动扩展
    • 设置读写分离
  3. 冷热数据分离

    • 频繁访问的数据放在更快的存储层
    • 历史数据归档到成本更低的存储

14. 维护与更新策略

14.1 数据更新机制

  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)
    
  2. 全量重建

    • 定期(如每周)重建整个索引
    • 可以在低峰期进行
    • 使用影子部署模式切换新旧索引

14.2 模型版本管理

  1. 嵌入模型升级

    • 保留旧模型用于现有查询
    • 新文档使用新模型嵌入
    • 逐步迁移或一次性重建
  2. LLM版本控制

    # 配置多版本支持
    llm_versions = {
        "gpt-4-0125": OpenAI(model="gpt-4-0125"),
        "gpt-4-turbo": OpenAI(model="gpt-4-turbo")
    }
    

14.3 监控与告警

关键监控指标:

  1. 数据质量

    • 空嵌入比例
    • 嵌入维度一致性
  2. 查询质量

    • 平均相似度分数
    • 无结果查询比例
  3. 系统健康

    • MongoDB操作延迟
    • 错误率
    • 缓存命中率

告警规则示例:

  • 连续5分钟错误率>1%
  • 平均查询延迟>1秒
  • 缓存命中率<80%

15. 团队协作建议

15.1 开发流程

  1. 环境隔离

    • 开发、测试、生产环境完全分离
    • 每个环境有独立的MongoDB集群
  2. 代码评审重点

    • 嵌入模型一致性
    • 元数据处理逻辑
    • 查询安全过滤
  3. 文档标准

    • 所有自定义参数必须有注释说明
    • 记录所有设计决策理由
    • 维护数据字典

15.2 知识共享

  1. 定期复盘

    • 分析失败查询案例
    • 分享成功优化经验
    • 讨论新兴技术趋势
  2. 内部培训

    • LlamaIndex核心概念
    • MongoDB最佳实践
    • 提示工程技巧
  3. 工具建设

    • 查询分析仪表板
    • 交互式演示环境
    • 案例知识库

15.3 跨团队协作

与不同团队的合作要点:

  1. 产品团队

    • 明确RAG系统能力边界
    • 共同设计评估指标
    • 建立需求优先级框架
  2. 数据工程团队

    • 制定数据更新SLA
    • 统一监控标准
    • 协调资源使用
  3. 运维团队

    • 容量规划协作
    • 灾备方案设计
    • 安全审计配合

16. 伦理与合规考量

16.1 数据隐私

  1. 匿名化处理

    • 移除个人身份信息(PII)
    • 使用数据脱敏技术
    • 实施访问控制
  2. 用户同意

    • 明确告知数据使用方式
    • 提供选择退出机制
    • 记录同意状态

16.2 内容安全

  1. 输出过滤

    from llama_index.core.postprocessor import SensitivePostprocessor
     
    sensitive_postprocessor = SensitivePostprocessor(
        filter_list=["信用卡号", "密码", "SSN"]
    )
     
    query_engine = index.as_query_engine(
        node_postprocessors=[sensitive_postprocessor]
    )
    
  2. 滥用预防

    • 实施速率限制
    • 监控异常查询模式
    • 保留完整审计日志

16.3 偏见与公平性

缓解策略:

  1. 数据审计

    • 分析训练数据代表性
    • 检测潜在偏见模式
  2. 结果评估

    • 对不同人群测试系统表现
    • 监控公平性指标
  3. 纠正机制

    • 实现人工覆盖功能
    • 提供反馈渠道

17. 未来发展方向

17.1 技术演进跟踪

值得关注的新趋势:

  1. 小型化LLM

    • 更高效的微调技术
    • 模型蒸馏方法
  2. 多模态检索

    • 联合文本-图像嵌入
    • 跨模态注意力机制
  3. 自优化系统

    • 基于用户反馈的自动调优
    • 持续学习架构

17.2 架构演进

下一代RAG系统可能包含:

  1. 动态检索

    • 根据查询复杂度调整检索深度
    • 分层检索策略
  2. 联邦检索

    • 跨多个数据源联合搜索
    • 隐私保护技术集成
  3. 推理优化

    • 推测解码
    • 模型级联

17.3 应用创新

潜在创新应用场景:

  1. 教育领域

    • 个性化学习助手
    • 自动习题生成
  2. 医疗健康

    • 医学文献问答
    • 患者教育工具
  3. 金融服务

    • 法规合规助手
    • 财务规划顾问

18. 资源推荐

18.1 学习资料

  1. 官方文档

  2. 教程课程

    • Coursera: "Advanced NLP with spaCy"
    • Udemy: "Building Production-Ready RAG Applications"
  3. 研究论文

    • "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (2020)
    • "Improving Passage Retrieval with Zero-Shot Question Generation" (2022)

18.2 开发工具

  1. 本地开发环境

    • Docker容器化部署
    • JupyterLab交互式开发
  2. 测试工具

    • Pytest单元测试框架
    • Locust负载测试
  3. 调试工具

    • LlamaIndex调试回调
    • MongoDB查询分析器

18.3 社区支持

  1. 论坛社区

    • LlamaIndex Discord频道
    • MongoDB社区论坛
  2. 开源项目

    • LangChain
    • Haystack
  3. 行业会议

    • 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系统是一个需要不断迭代和优化的过程。在实际项目中,我们经历了从最初的概念验证到生产部署的完整周期,有几个关键体会:

  1. 数据质量决定上限 :无论模型多先进,垃圾进就会垃圾出。投入时间清洗和结构化数据总能获得回报。

  2. 监控不可或缺 :没有完善的监控,就无法理解系统实际表现。我们建立了超过50个关键指标看板。

  3. 简单往往更有效 :开始我们尝试了复杂的多阶段检索流程,最终发现适当简化的方案反而更可靠。

一个实用的建议是:从小的、定义明确的使用场景开始,逐步扩展。我们最初只支持5种明确的查询类型,确保这些工作完美后再增加复杂性。

最后,RAG技术正在快速发展,保持对新兴技术的关注很重要,但不必盲目追求最新趋势。理解核心原理,扎实解决实际问题,才能构建出真正有价值的应用。

更多推荐