尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于Langfuse的LangChain与LangGraph应用全链路追踪与评估实战

基于Langfuse的LangChain与LangGraph应用全链路追踪与评估实战 在构建基于大语言模型LLM的复杂应用时你是否遇到过这些挑战Agent的执行路径像黑盒一样难以追踪RAG系统的回答质量忽高忽低缺乏量化评估或者面对“LangChain和LangGraph到底该怎么选”的困惑随着2025-2026年大模型技术面试的日益深入这些问题已从单纯的工程难题演变为高频的面试考点。本文旨在为你提供一套从理论到实战的完整解决方案。我们将以Langfuse为核心深入讲解如何对基于LangChain和LangGraph构建的Agent进行全链路追踪与量化评估并系统梳理RAG、Agent、MCP等核心概念的面试八股文与场景题。无论你是正在准备大厂面试还是希望提升自己AI应用的可观测性与稳定性这篇文章都将是一份不可多得的实战指南。1. 核心概念与工具栈全景解读在深入实战之前我们必须厘清整个技术栈中各个核心组件的定位、关系以及它们所要解决的根本问题。1.1 大模型应用开发框架LangChain vs LangGraphLangChain是一个用于开发由语言模型驱动的应用程序的框架。它提供了丰富的模块化组件如Models, Prompts, Chains, Agents, Memory等通过“链”Chain的概念将多个步骤组合起来形成可预测的流水线。其核心思想是可组合性让开发者能够像搭积木一样构建应用。然而当业务流程变得复杂特别是需要循环、分支、多Agent协作等有状态、非线性的控制流时单纯的Chain就显得力不从心。这正是LangGraph的用武之地。LangGraph是构建在LangChain之上的一个库它引入了图Graph的计算模型。你可以将应用中的每个步骤节点和步骤之间的流转条件边定义成一个有向图。它内置了对循环、并行、条件判断等复杂逻辑的原生支持并且完美维护整个对话或任务的状态State。简单来说LangChain擅长组织线性的、确定性的工作流而LangGraph专为复杂的、动态的、有状态的工作流而生。面试高频题辨析QLangChain 工具调用和LLM的Function Calling有什么区别速度受什么影响ALLM的Function Calling是模型原生能力如GPT-4模型直接输出结构化调用信息。LangChain的工具调用是一个更高层次的抽象它封装了提示工程、结果解析、错误处理等流程。速度主要受以下因素影响网络延迟与LLM API的通信耗时。模型推理速度大模型生成响应的速度。工具本身执行时间如调用一个慢速的API或执行复杂计算。LangChain框架开销序列化/反序列化、多步链式调用的中间状态传递。1.2 可观测性与评估平台Langfuse当我们用LangChain或LangGraph构建出复杂的AI应用后新的问题出现了一次调用内部究竟发生了什么为什么这次回答好那次回答差如何量化改进效果Langfuse就是一个开源的LLM应用可观测性与评估平台。它主要解决两大痛点追踪Tracing自动记录LLM调用、工具执行、用户反馈等全链路日志形成可视化的调用链彻底告别“黑盒”。评估Evaluation提供了一套框架和工具用于对AI应用特别是RAG和Agent的输出进行定量和定性评估包括基于规则、模型、人工的多种评估方式。核心价值Langfuse将AI应用的开发从“凭感觉优化”带入到“数据驱动迭代”的新阶段。它也是面试中展示你工程化思维和项目深度的重要加分项。1.3 核心面试概念RAG、Agent与MCPRAG检索增强生成通过从外部知识库检索相关信息来增强LLM的提示词从而生成更准确、更相关且能溯源的内容。面试重点索引构建分块、向量化、检索策略相似度、MMR、提示工程、评估指标命中率、忠实度、答案相关性。Agent智能体一个能感知环境、进行决策并执行动作通常通过调用工具以实现目标的系统。面试重点ReAct模式、规划与反思、多Agent协作、工具使用能力。MCP模型上下文协议Model Context Protocol一个新兴的开放协议旨在标准化应用程序向LLM提供上下文信息的方式。它让工具和数据的集成更统一、更便捷是Agent生态发展的重要方向。2. 环境准备与项目初始化接下来我们将搭建一个实战环境集成上述所有技术栈。2.1 环境与依赖安装我们使用Python作为开发语言。建议使用Python 3.10或以上版本并创建虚拟环境。# 创建并激活虚拟环境 (可选) python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安装核心依赖 pip install langchain langchain-openai langgraph langfuse # 安装可选的向量数据库客户端以Chroma为例 pip install chromadb版本说明本文示例基于langchain0.1.0,langgraph0.0.50,langfuse2.0.0。由于这些库迭代迅速部分API可能发生变化请以官方文档为准。2.2 获取并配置API密钥你需要准备以下服务的API密钥OpenAI API Key用于调用GPT模型。Langfuse注册 Langfuse Cloud 或使用 Docker 本地部署 。获取LANGFUSE_PUBLIC_KEY,LANGFUSE_SECRET_KEY和LANGFUSE_HOST。配置环境变量这是安全且推荐的做法# 在终端中设置或写入 .env 文件 export OPENAI_API_KEYsk-你的openai密钥 export LANGFUSE_PUBLIC_KEYpk-lf-你的公钥 export LANGFUSE_SECRET_KEYsk-lf-你的私钥 export LANGFUSE_HOSThttps://cloud.langfuse.com # 如果是云服务3. 使用Langfuse追踪LangChain/LangGraph应用Langfuse提供了与LangChain/LangGraph无缝集成的SDK只需几行代码即可开启全链路追踪。3.1 基础集成与自动追踪首先我们演示如何追踪一个简单的LangChain链。# 文件basic_tracing.py import os from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langfuse.callback import CallbackHandler # 1. 创建Langfuse回调处理器 langfuse_handler CallbackHandler( public_keyos.getenv(LANGFUSE_PUBLIC_KEY), secret_keyos.getenv(LANGFUSE_SECRET_KEY), hostos.getenv(LANGFUSE_HOST), ) # 2. 构建一个简单的LangChain链 prompt ChatPromptTemplate.from_messages([ (system, 你是一个专业的翻译官。), (user, 请将以下英文翻译成中文{text}) ]) model ChatOpenAI(modelgpt-4o-mini) chain prompt | model | StrOutputParser() # 3. 调用链并传入回调处理器进行追踪 try: result chain.invoke( {text: Hello, Langfuse! This is a tracing demo.}, config{callbacks: [langfuse_handler]} ) print(翻译结果, result) except Exception as e: print(f调用失败{e}) finally: # 确保所有追踪数据被刷新 langfuse_handler.flush()运行此脚本后登录你的Langfuse控制台在“Traces”页面就能看到这次调用。点击进入你可以清晰看到完整的调用链PromptTemplate - ChatOpenAI - StrOutputParser每个节点的输入、输出、耗时、Token用量等信息一目了然。3.2 深度集成追踪LangGraph Agent对于更复杂的LangGraph应用集成方式类似但能揭示更丰富的状态流转信息。# 文件langgraph_agent_tracing.py import os from typing import TypedDict, Annotated, List import operator from langgraph.graph import StateGraph, END from langgraph.checkpoint import MemorySaver from langchain_openai import ChatOpenAI from langchain_community.tools.tavily_search import TavilySearchResults from langfuse.callback import CallbackHandler # 0. 定义Agent的状态结构 class AgentState(TypedDict): question: str search_query: str search_results: List[str] answer: str # 1. 初始化组件 llm ChatOpenAI(modelgpt-4o-mini, temperature0) search_tool TavilySearchResults(max_results2) # 需要TAVILY_API_KEY langfuse_handler CallbackHandler() # 2. 定义图节点函数 def search_node(state: AgentState): 根据问题生成搜索查询并执行搜索 query_gen_prompt f基于用户问题生成一个简洁的网页搜索查询。 用户问题{state[question]} 搜索查询 search_query llm.invoke(query_gen_prompt).content results search_tool.invoke(search_query) return { search_query: search_query, search_results: [result[content] for result in results] } def answer_node(state: AgentState): 基于搜索结果生成最终答案 context \n\n.join(state[search_results]) answer_prompt f请根据以下搜索结果为用户问题提供一个全面的答案。 用户问题{state[question]} 搜索结果 {context} 答案 answer llm.invoke(answer_prompt).content return {answer: answer} # 3. 构建图 workflow StateGraph(AgentState) workflow.add_node(search, search_node) workflow.add_node(answer, answer_node) workflow.set_entry_point(search) workflow.add_edge(search, answer) workflow.add_edge(answer, END) # 4. 编译图并加入Langfuse回调 app workflow.compile(checkpointerMemorySaver()) langfuse_handler CallbackHandler() # 为每次运行创建新的handler # 5. 运行Agent并追踪 config {configurable: {thread_id: thread_1}, callbacks: [langfuse_handler]} initial_state {question: 2024年巴黎奥运会中国代表团获得了多少枚金牌} try: final_state app.invoke(initial_state, configconfig) print(最终答案, final_state[answer]) except Exception as e: print(fAgent运行失败{e}) finally: langfuse_handler.flush()在Langfuse中查看这次追踪你会看到一个清晰的图结构显示了search_node和answer_node的先后执行顺序并能深入查看每个节点内部LLM调用和工具调用的细节。4. 对AI应用进行系统化评估追踪让我们知道“发生了什么”而评估则告诉我们“结果好不好”。Langfuse提供了强大的评估功能。4.1 定义评估指标与评分评估可以在追踪完成后手动进行也可以通过SDK自动集成到流程中。# 文件basic_evaluation.py from langfuse import Langfuse from langfuse.model import CreateScoreRequest import os # 初始化Langfuse客户端 langfuse Langfuse( public_keyos.getenv(LANGFUSE_PUBLIC_KEY), secret_keyos.getenv(LANGFUSE_SECRET_KEY), hostos.getenv(LANGFUSE_HOST), ) # 假设我们已经有一个追踪IDtrace_id来自之前的调用 trace_id 你的追踪ID # 1. 人工评分可用于收集用户反馈 langfuse.score( CreateScoreRequest( traceIdtrace_id, nameuser_rating, value4, # 1-5分 comment答案准确但格式可以更友好。 ) ) # 2. 基于规则的自动评分例如检查答案是否包含关键词 def check_keyword_presence(trace_data, keyword金牌): answer trace_data[output][answer] # 假设能从trace获取答案 score_value 1 if keyword in answer else 0 langfuse.score( CreateScoreRequest( traceIdtrace_id, namekeyword_present, valuescore_value, ) ) # 3. 使用LLM作为裁判进行自动评估更复杂更智能 from langchain_openai import ChatOpenAI llm_judge ChatOpenAI(modelgpt-4, temperature0) def evaluate_with_llm_judge(question, expected_answer, actual_answer): evaluation_prompt f 你是一个公正的评估员。请根据以下标准评估AI助手的回答 - 事实准确性0-5分回答是否与标准答案事实一致 - 完整性0-5分是否涵盖了标准答案的关键点 - 清晰度0-5分回答是否清晰易懂 用户问题{question} 标准答案参考{expected_answer} AI助手回答{actual_answer} 请以JSON格式输出包含三个键factual_accuracy, completeness, clarity。 evaluation llm_judge.invoke(evaluation_prompt).content # 解析JSON并提交分数到Langfuse... # langfuse.score(...)4.2 构建RAG评估流水线对于RAG系统评估至关重要。Langfuse支持批量评估数据集。# 文件rag_evaluation.py import asyncio from langfuse import Langfuse from langfuse.model import CreateDatasetRequest, CreateDatasetItemRequest # 假设我们有一个简单的RAG查询函数 from my_rag_system import query_rag # 创建数据集 langfuse Langfuse() dataset langfuse.create_dataset(CreateDatasetRequest(name产品知识库QA测试集)) # 1. 上传测试用例问题-参考答案对 test_cases [ {input: 产品A的最大支持用户数是多少, expected_output: 产品A支持最多10,000个并发用户。}, {input: 如何重置产品B的管理员密码, expected_output: 请在登录页面点击‘忘记密码’通过注册邮箱接收重置链接。}, ] for case in test_cases: langfuse.create_dataset_item( dataset_name产品知识库QA测试集, requestCreateDatasetItemRequest( inputcase[input], expected_outputcase[expected_output] ) ) # 2. 运行批量评估简化示例 async def run_evaluation(): items langfuse.get_dataset_items(产品知识库QA测试集) for item in items: # 使用RAG系统获取实际输出 actual_output query_rag(item.input) # 创建一次追踪记录这次查询 trace langfuse.trace( nameRAG Evaluation Run, inputitem.input, outputactual_output, metadata{dataset_item_id: item.id} ) # 使用LLM裁判比较实际输出与期望输出 score await evaluate_relevance(item.input, item.expected_output, actual_output) # 将评分关联到这次追踪 trace.score(nameanswer_relevance, valuescore) # 3. 在Langfuse UI中查看评估结果 # 进入Datasets页面选择你的数据集可以看到所有测试用例的执行记录和评分分布。在Langfuse的“Evaluation”和“Datasets”面板你可以直观地看到不同问题的回答质量、评分分布并快速定位表现不佳的案例从而有针对性地优化检索器或提示词。5. 面试高频场景题与八股文实战剖析掌握了工具我们还需要应对理论考察。以下是对核心概念的深度剖析和场景化回答思路。5.1 RAG 场景题场景“我们有一个百万级PDF文档的知识库用户查询时RAG系统偶尔会返回不相关的内容。你会如何系统性地排查和优化”回答思路展现系统性问题定位首先用Langfuse等工具追踪具体案例确定是“检索”不准还是“生成”跑偏。检索阶段优化索引优化检查文档分块策略。大小是否合适是否使用了语义分割如按标题尝试重叠分块。向量化模型评估当前嵌入模型如text-embedding-ada-002对专业领域的表征能力。可考虑微调或更换为领域适配模型如bge-large-zh。检索策略尝试混合检索Hybrid Search结合稠密向量检索和稀疏关键词检索如BM25。调整相似度分数阈值或使用MMR最大边际相关性来平衡相关性与多样性。生成阶段优化提示工程优化系统提示词明确要求“仅根据上下文回答”并加入“若上下文不相关则回答‘我不知道’”的指令。上下文处理对检索到的多个片段进行重排序Re-ranking或将最相关的片段放在提示词最靠近用户问题的位置。评估与迭代构建一个包含“易答”、“难答”、“易混淆”问题的评估数据集。使用Langfuse批量运行量化评估“检索命中率”、“答案忠实度”等指标。每次优化如换模型、改分块后重新评估用数据证明改进效果。5.2 Agent 设计题场景“设计一个旅行规划Agent它需要查询天气、预订酒店、推荐景点。你会用LangChain还是LangGraph为什么画出核心工作流。”回答思路展现架构选择能力工具选择LangGraph。因为旅行规划是典型的多步骤、有状态、且可能需要根据条件如天气不好则调整行程循环或分支的任务。工作流设计输入节点接收用户需求时间、地点、预算、兴趣。并行查询节点同时调用天气查询工具和景点检索工具。条件判断节点根据天气结果如“暴雨”决定是进入“室内景点规划”分支还是“户外景点规划”分支。酒店预订节点根据行程安排和预算调用酒店查询和模拟预订工具。行程整合节点将天气、景点、酒店信息整合成一份日程表。用户确认节点输出规划并等待用户反馈“修改”或“确认”根据反馈可能跳回步骤2或1。LangGraph优势这种包含并行、条件判断、循环基于用户反馈的复杂状态机用LangGraph的图模型来定义和可视化最为清晰和自然。State对象可以承载所有中间数据用户输入、天气数据、景点列表、酒店选项、最终日程。5.3 MCP 概念题场景“解释一下MCPModel Context Protocol。它解决了什么问题在Agent架构中可能处于什么位置”回答思路展现对前沿技术的理解是什么MCP是一个开放协议用于标准化应用程序、数据库、工具等数据源如何向LLM提供上下文信息。它定义了一套简单的通信标准如SSE。解决什么问题集成碎片化过去每个工具都需要为不同AI框架LangChain、LlamaIndex等写不同适配器。MCP提供了统一接口。上下文管理让LLM能更安全、更高效地访问实时数据、私有API和复杂工具而无需将全部逻辑硬编码到提示词中。安全性通过协议隔离可以更好地控制AI可以访问哪些数据和操作。在Agent中的位置MCP Server可以视为一个增强的工具层。Agent通过LangChain/LangGraph不再直接调用成千上万的具体工具API而是通过一个统一的MCP客户端与多个MCP Server通信。每个Server管理一类资源如公司数据库、GitHub API、内部CMS。这大大简化了Agent的集成复杂度并提升了安全性和可维护性。6. 常见问题与排查指南在实际开发和面试中你会遇到各种问题。以下是一些典型问题的排查思路。问题现象可能原因排查步骤与解决方案Langfuse控制台看不到追踪数据1. API密钥或主机地址错误。2. 代码中未调用handler.flush()。3. 网络问题。1. 检查环境变量和初始化代码。2. 确保在程序退出或关键节点调用flush()。3. 在代码中加入异常捕获打印Langfuse初始化或发送日志的错误信息。LangGraph Agent陷入无限循环1. 图的设计存在未终止的环。2. 条件判断逻辑有误始终指向某个循环节点。1. 使用app.get_graph().draw_mermaid()可视化图结构检查循环路径。2. 在关键节点添加print或日志输出状态变量调试逻辑。3. 为图设置interrupt_before或interrupt_after实现手动中断点。RAG检索结果质量差1. 嵌入模型不匹配。2. 文本分块不合理。3. 检索top_k参数不当。1. 在 MTEB 排行榜上选择适合你文本领域的嵌入模型测试。2. 尝试不同的分块大小、重叠度分析对检索效果的影响。3. 调整top_k太小可能遗漏太大可能引入噪声。使用Langfuse评估不同参数下的表现。工具调用速度慢1. 网络延迟高。2. 工具本身响应慢。3. 同步调用阻塞主线程。1. 为工具设置合理的超时timeout参数。2. 考虑对工具进行缓存如使用langchain.cache。3. 对于IO密集型工具使用异步调用ainvoke。在LangGraph中可以利用asyncio实现异步节点。评估分数不稳定1. LLM作为裁判Judge本身具有随机性。2. 评估提示词Prompt不明确。3. 测试用例质量不高或模糊。1. 设置LLM Judge的temperature0增加评估的确定性。2. 精心设计评估提示词提供清晰的评分标准和示例Few-shot。3. 构建高质量、无歧义的测试数据集。对于主观性问题考虑多人标注取平均。7. 最佳实践与工程化建议将原型顺利转化为稳定、可维护的生产级应用需要遵循以下工程实践。7.1 可观测性深度集成为每个追踪添加丰富元数据在langfuse.trace()或CallbackHandler中传入metadata和tags如user_id,session_id,app_version,environment。这便于在控制台进行过滤和聚合分析。标准化评分体系定义清晰的评估维度如factual_correctness,completeness,helpfulness并在团队内统一其含义。定期Review评分结果校准评估标准。设置告警利用Langfuse的监控功能对异常指标如错误率骤升、平均延迟增加、特定评分下降设置告警实现主动运维。7.2 LangGraph应用设计模式状态设计扁平化尽量使用TypedDict定义清晰、扁平的状态结构避免深层嵌套这有利于节点的读写和调试。节点职责单一化每个节点应只完成一件明确的事情。复杂的逻辑应拆分为多个节点或通过子图Subgraph实现。善用检查点Checkpoint对于长周期任务如多轮对话使用MemorySaver或SqliteSaver等持久化检查点支持中断恢复和状态回放。可视化与调试养成画图的习惯。在开发初期就用draw_mermaid()输出工作流并与产品、测试同学沟通确认。利用Langfuse的追踪视图进行事后调试。7.3 RAG系统优化闭环建立持续评估管道不要只评估一次。将评估脚本自动化作为CI/CD的一部分每当知识库更新或模型、参数变更时自动运行评估监控指标变化。A/B测试利用Langfuse的标签功能将不同的优化方案如A方案用text-embedding-3-largeB方案用bge-large打上不同标签在线上进行小流量A/B测试用真实的用户反馈数据决定最终方案。关注“负面案例”在Langfuse中筛选出低分如2的追踪定期进行根因分析。是检索问题就优化索引是生成问题就优化提示是知识缺失就补充数据源。7.4 面试准备策略项目经历STAR法则化针对你做过的AI项目用STAR法则情境、任务、行动、结果准备描述。重点突出你如何定义问题、技术选型为什么选LangGraph、实施细节如何集成Langfuse、评估效果指标提升了多少。概念理解层次化不要死记硬背。理解RAG、Agent、Chain等概念背后的核心思想如RAG是为了解决LLM的幻觉和知识陈旧问题并能用自己的一句话概括。手写代码准备面试官可能要求在白板或在线编辑器上写一段简单的LangChain链或定义LangGraph的状态和节点。平时要多练习确保对核心API如invoke,stream,add_node,add_edge的熟练运用。大模型应用开发领域正在飞速演进工具链和最佳实践日臻成熟。掌握LangChain和LangGraph让你具备了构建复杂AI应用的“双手”而熟练运用Langfuse则为你装上了洞察应用运行状况的“眼睛”。从追踪、评估到优化形成一个完整的数据驱动闭环这正是高级AI工程师与普通开发者的关键区别。
返回列表