去年夏天,我构建了一个名为"Rosebud"的电影推荐系统(原名"电影搜索"),这是一个典型的检索增强生成(RAG)应用。用户可以通过自然语言描述他们的电影偏好,比如"帮我找一部时长小于2小时、英语对白且有狗出现的剧情片",系统就会返回符合要求的电影推荐。这个项目的独特之处在于采用了自查询检索技术——系统不仅能理解用户的语义需求,还能自动将自然语言转换为结构化过滤条件,确保返回结果严格符合用户的约束要求。
Rosebud的系统架构包含三个关键层次:
自查询检索的实现是这个项目的技术亮点。当用户输入"找一部关于狗的英语剧情片,时长小于2小时"时,系统会将其转换为:
json复制{
"query": "drama English dogs",
"filter": {
"operator": "and",
"arguments": [
{"comparator": "eq", "attribute": "Genre", "value": "Drama"},
{"comparator": "eq", "attribute": "Language", "value": "English"},
{"comparator": "lt", "attribute": "Runtime", "value": 120}
]
}
}
这种转换通过两个LLM调用完成:第一次识别元数据过滤条件,第二次生成最终回复。
初始版本仅依赖人工"肉眼检查",无法系统评估以下方面:
当查询出现问题时,开发人员需要:
电影数据具有时效性特点:
采用RAGAS框架实现自动化评估,重点关注三个核心指标:
| 指标名称 | 评估内容 | 实现方式 | 评分标准 |
|---|---|---|---|
| 上下文相关性 | 检索结果与问题的匹配度 | 计算问题与上下文的语义相似度 | 0-1连续值 |
| 回答准确性 | 回答是否基于给定上下文 | 对比回答与上下文的逻辑一致性 | 0-1连续值 |
| 回答相关性 | 回答是否解决原始问题 | 分析问题与回答的对应关系 | 0-1连续值 |
评估代码实现关键点:
python复制# 评估流程异步化处理
async def evaluate_question(question):
# 构造评估数据集
dataset = Dataset.from_dict({
"question": [question],
"contexts": [[retrieved_context]],
"answer": [model_response]
})
# 并行执行多指标评估
return await evaluate(
dataset=dataset,
metrics=[AnswerRelevancy(), ContextRelevancy(), Faithfulness()],
llm=judge_model,
embeddings=embeddings_model
)
在用户界面添加反馈机制:
python复制# Streamlit反馈组件实现
col1, col2 = st.columns(2)
with col1:
st.button("👍", on_click=log_feedback, args=("positive",))
with col2:
st.button("👎", on_click=log_feedback, args=("negative",))
数据记录采用W&B平台,存储以下信息:
使用Prefect构建自动化工作流:
mermaid复制graph TD
A[触发每周任务] --> B[从TMDB拉取数据]
B --> C[数据清洗转换]
C --> D[生成文档向量]
D --> E[更新Pinecone索引]
E --> F[发布数据集到Weave]
关键配置参数:
json复制{
"schedule": "0 0 * * 0", // 每周日午夜运行
"retry_policy": {
"retries": 3,
"delay": [1, 10, 100] // 指数退避重试
},
"resource_requirements": {
"cpu": 4,
"memory": "16GiB"
}
}
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| RAGAS | 专为RAG设计,指标全面 | LLM评分存在波动 | 离线评估 |
| TruLens | 可视化好,集成度高 | 商业方案成本高 | 企业级监控 |
| 人工评估 | 结果可靠 | 效率低,成本高 | 关键测试用例 |
Prefect的突出优势:
原始配置:
优化后配置:
评估优化:
查询优化:
资源调度:
核心监控指标包括:
数据备份:
故障转移:
回滚机制:
通过这一系列生产化改进,Rosebud系统从最初的实验原型成长为真正可用的服务。在这个过程中,我深刻体会到:一个好的AI应用不仅需要优秀的算法模型,更需要坚实的工程化基础和持续迭代的优化机制。特别是在评估体系建设和自动化运维方面投入的精力,最终换来了系统稳定性和用户体验的显著提升。