使用Phoenix项目评估和优化基于Qdrant与LangChain的搜索检索系统
前言
在现代AI应用中,基于检索增强生成(RAG)的问答系统已成为企业知识管理的重要工具。本文将深入探讨如何利用Phoenix项目对基于Qdrant向量数据库和LangChain框架构建的文档问答系统进行评估和优化。
系统架构概述
该问答系统采用典型的RAG架构,包含以下核心组件:
- 用户查询处理:接收用户关于Arize产品的自然语言问题
- 嵌入模型:使用OpenAI的text-embedding-ada-002模型将查询转换为向量表示
- 向量检索:通过Qdrant数据库执行最大边际相关性(MMR)搜索,获取最相关的文档片段
- 响应生成:使用gpt-4-turbo-preview模型结合查询和检索到的上下文生成最终回答
- 用户反馈:收集用户对回答质量的评价(点赞/点踩)
Phoenix项目在这一架构中扮演着关键的可观测性角色,它能够捕获并可视化以下关键数据:
- 查询向量嵌入
- 检索到的文档及其相似度分数
- 系统生成的最终响应
- 用户反馈数据
环境配置与数据准备
安装依赖
系统需要以下核心Python库:
%pip install -Uq langchain qdrant-client langchain_community tiktoken cohere langchain-openai "protobuf>=3.20.3" "arize-phoenix[evals,embeddings]" "openai>=1" openinference-instrumentation-langchain 'httpx<0.28'
初始化向量数据库
我们使用Arize官方文档作为知识库来源,通过GitbookLoader加载文档内容:
def load_gitbook_docs(docs_url):
loader = GitbookLoader(docs_url, load_all_paths=True)
return loader.load()
docs_url = "https://docs.arize.com/arize/"
docs = load_gitbook_docs(docs_url)
然后使用OpenAI的嵌入模型初始化Qdrant向量数据库:
model_name = "text-embedding-ada-002"
embeddings = OpenAIEmbeddings(model=model_name)
qdrant = Qdrant.from_documents(
docs,
embeddings,
location=":memory:",
collection_name="my_documents",
)
系统可观测性实现
应用性能监控
Phoenix通过OpenInference规范对LangChain应用进行插桩(instrumentation),捕获关键性能指标:
tracer_provider = register()
LangChainInstrumentor(tracer_provider=tracer_provider).instrument(skip_dep_check=True)
构建问答链
我们配置一个典型的RetrievalQA链,包含以下关键参数:
retriever = qdrant.as_retriever(
search_type="mmr",
search_kwargs={"k": 2},
enable_limit=True
)
llm = ChatOpenAI(model_name="gpt-4-turbo-preview", temperature=0.0)
chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
metadata={"application_type": "question_answering"},
)
评估与优化策略
检索质量评估
传统评估指标如余弦相似度和欧氏距离存在局限性,Phoenix提供了基于LLM的智能评估方法:
from phoenix.evals import (
RAG_RELEVANCY_PROMPT_RAILS_MAP,
RAG_RELEVANCY_PROMPT_TEMPLATE,
OpenAIModel,
llm_classify,
)
model = OpenAIModel(model="gpt-4")
context_relevance = llm_classify(
eval_df,
template=RAG_RELEVANCY_PROMPT_TEMPLATE,
rails=list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values()),
provide_explanation=True,
model=model,
)
关键性能指标计算
基于LLM的评估结果,我们可以计算precision@k指标:
num_relevant_documents_array = np.zeros(len(sample_query_df))
for retrieved_document_index in range(0, num_retrieved_documents):
num_retrieved_documents = retrieved_document_index + 1
num_relevant_documents_array += (
sample_query_df[f"openai_relevance_{retrieved_document_index}"]
.map(lambda x: int(x == "relevant"))
.to_numpy()
)
sample_query_df[f"openai_precision@{num_retrieved_documents}"] = pd.Series(
num_relevant_documents_array / num_retrieved_documents
)
precision@k指标反映了系统在前k个检索结果中返回相关文档的比例,是衡量检索系统性能的关键指标。
系统优化方向
通过Phoenix的可视化分析,我们可以识别以下优化机会:
- 文档覆盖度分析:识别高频查询但低相关度的主题,补充文档内容
- 检索失败分析:定位precision@k为零的查询,优化检索策略
- 用户反馈聚类:分析负面反馈集中的问题类型,针对性改进
- 嵌入空间分析:检查查询和文档在向量空间的分布,优化嵌入模型
结论
Phoenix项目为基于Qdrant和LangChain构建的RAG系统提供了全面的可观测性解决方案。通过结合传统指标和LLM驱动的智能评估,开发者能够深入理解系统行为,识别性能瓶颈,并持续优化问答质量。这种数据驱动的优化方法对于构建企业级知识问答系统至关重要。
在实际应用中,建议定期运行此类评估,将Phoenix集成到CI/CD流程中,确保系统随着知识库的更新和用户需求的变化而持续改进。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考