基于Harness与Langfuse构建可观测、可评估的AI智能体:从财务分析案例看工程化落地

📅 2026/8/20 12:57:09
基于Harness与Langfuse构建可观测、可评估的AI智能体:从财务分析案例看工程化落地
1. 先搞清楚这个项目到底在解决什么实际问题如果你正在找一套能把大模型能力比如财务分析真正在企业里用起来的方案那这个基于 Harness 和 Langfuse 的项目就值得一看。它核心解决的不是“能不能用大模型做个财务分析”这种单点问题而是“怎么让这个分析过程变得可管理、可评估、可迭代”。简单来说它把两个关键工具组合起来了Harness你可以把它理解成一个专门用来“运行和管理”AI智能体Agent的框架。它负责调度、执行、处理输入输出让智能体跑起来。Langfuse这是一个专注于AI应用“观测和评估”的平台。它能记录智能体运行的每一步比如调用了哪个模型、输入了什么、输出了什么、花了多少钱、用了多久然后让你能基于这些数据去评估效果。所以这个项目的核心价值在于它提供了一个从“智能体开发”到“生产部署与效果评估”的完整工程化路径。特别适合那些想把AI能力比如财务分析、客服问答、报告生成嵌入到现有业务流程但又担心上线后效果不可控、问题难追溯的团队。对于开发者或技术负责人最值得关注的不是某个炫酷的单一功能而是这套组合拳如何解决AI落地中最头疼的几个问题过程不可见智能体内部怎么思考的为什么给出了这个答案出错了是哪一步的问题效果难衡量这次回答比上次好吗调整一个提示词Prompt到底有没有提升迭代无依据基于什么数据去优化智能体是改提示词还是换模型还是调整流程下面我就按一个真实项目从零到评估的落地顺序拆解一遍关键环节和实操细节。2. 环境准备别急着写代码先把“地基”搭好在动手之前先明确你的目标环境。这个项目通常部署在服务器上供内部系统调用或团队使用。本地开发机主要用于调试。2.1 核心依赖与版本确认项目的基础是Python环境。我建议先创建一个独立的虚拟环境避免依赖冲突。# 创建并激活虚拟环境以conda为例venv同理 conda create -n finance-agent python3.10 conda activate finance-agent接下来安装核心框架。这里有个关键点“Harness”这个名字在AI领域有歧义。根据热词来看大家搜索的deepseek harness很可能指的是深度求索公司推出的智能体开发框架。而另一个harness可能指其他工程平台。为了确保我们讨论的是同一件事本文假设我们使用的是类似AgentHarness或DeepSeek-Harness这类新兴的智能体框架以及Langfuse。由于这类框架迭代快安装时务必查看其官方GitHub仓库的最新说明。通常命令如下# 安装智能体框架示例请替换为实际包名 pip install agent-harness # 或 pip install deepseek-harness # 安装Langfuse的Python SDK pip install langfuse重要提醒不要直接复制上面的命令。你应该先去项目的GitHub页面例如github.com/deepseek-ai/DeepSeek-Harness找到最新的安装指南。版本不匹配是后续一切问题的根源。2.2 Langfuse 的部署与配置Langfuse 有两种使用方式云托管版和自托管版。对于企业级项目考虑到数据安全和定制化需求自托管是更常见的选择。部署 Langfuse官方推荐使用 Docker Compose 一键部署。这需要你的服务器或本地开发机已安装 Docker 和 Docker Compose。git clone https://github.com/langfuse/langfuse.git cd langfuse docker-compose up -d部署成功后默认可以通过http://localhost:3000访问 Langfuse 的 Web 界面。获取密钥首次访问 Langfuse 界面需要注册并创建第一个项目。创建成功后你会得到三组密钥LANGFUSE_PUBLIC_KEYLANGFUSE_SECRET_KEYLANGFUSE_HOST(自托管就是你的服务器地址如http://localhost:3000)环境变量配置将这些密钥设置为环境变量这样你的 Python 代码才能安全连接。# 在终端中设置临时 export LANGFUSE_PUBLIC_KEYyour_public_key export LANGFUSE_SECRET_KEYyour_secret_key export LANGFUSE_HOSThttp://localhost:3000在生产环境中你应该使用.env文件或配置管理服务如 AWS Parameter Store, Kubernetes Secrets来管理这些敏感信息。2.3 模型API准备财务分析智能体通常需要调用大模型API。你需要准备相应的API Key。OpenAI GPT系列准备OPENAI_API_KEY。国内大模型如DeepSeek, 通义千问文心一言准备对应平台的API Key。开源模型本地部署如果你使用Ollama、vLLM等本地部署模型则需要配置对应的模型服务地址。将API Key也放入环境变量export OPENAI_API_KEYsk-... # 或 export DEEPSEEK_API_KEY...环境检查清单[ ] Python 3.10 虚拟环境已激活[ ] 智能体框架Harness已安装[ ] Langfuse Python SDK 已安装[ ] Langfuse 服务已部署并可访问[ ] Langfuse 密钥已配置为环境变量[ ] 大模型API Key已配置为环境变量3. 构建财务分析智能体从单点任务到完整工作流有了环境我们开始构建智能体。财务分析可以拆解成多个子任务数据提取、指标计算、趋势分析、风险提示、报告生成。智能体的价值在于将这些任务串联起来并做出决策。3.1 定义智能体的核心能力首先明确你的智能体要干什么。以一个简单的“上市公司财报摘要生成”为例它的工作流可能是输入一家上市公司的股票代码和年份。任务链 a.数据获取调用工具如爬虫接口或金融数据库API获取利润表、资产负债表关键数据。 b.指标计算计算毛利率、净利率、资产负债率等。 c.趋势分析与往年数据进行对比。 d.报告生成用自然语言总结核心发现。输出一段结构化的财务摘要文本。3.2 使用 Harness 框架编写智能体不同的 Harness 框架语法可能不同但核心思想类似定义工具Tools、定义智能体Agent、编排工作流Workflow。以下是一个高度简化的伪代码示例展示逻辑结构# 示例基于一个假设的Harness框架语法 from harness import Agent, Tool, Workflow import langfuse from langfuse.decorators import observe, langfuse_context # 初始化Langfuse它会自动读取环境变量 langfuse_handler langfuse.Langfuse() # 1. 定义工具Tools Tool def fetch_financial_data(stock_code: str, year: int): 模拟从数据库获取财务数据 # 这里应该是真实的API调用例如访问Tushare、AKShare或公司内部数据库 # 返回结构化数据如字典或Pandas DataFrame data { “revenue”: 1000000, # 营收 “net_profit”: 150000, # 净利润 “total_assets”: 5000000, # 总资产 “total_liabilities”: 2000000 # 总负债 } return data Tool def calculate_ratios(data: dict): 计算财务比率 ratios {} ratios[“gross_margin”] (data[“revenue”] - data.get(“cost”, 0)) / data[“revenue”] if data[“revenue”] else 0 ratios[“net_margin”] data[“net_profit”] / data[“revenue”] if data[“revenue”] else 0 ratios[“debt_to_asset”] data[“total_liabilities”] / data[“total_assets”] if data[“total_assets”] else 0 return ratios # 2. 定义智能体Agent并用Langfuse装饰器包装关键步骤 Agent class FinancialAnalystAgent: observe(name“analyze_earnings”) # Langfuse装饰器自动记录此函数执行 def analyze(self, stock_code: str, year: int): # 获取数据 raw_data fetch_financial_data(stock_code, year) # 计算指标 ratios calculate_ratios(raw_data) # 调用大模型生成分析报告 analysis_prompt f”基于以下数据生成财务摘要营收{raw_data[‘revenue’]}净利润{raw_data[‘net_profit’]}净利率{ratios[‘net_margin’]:.2%}...” # 这里假设调用大模型API例如OpenAI import openai response openai.ChatCompletion.create( model“gpt-4”, messages[{“role”: “user”, “content”: analysis_prompt}] ) report response.choices[0].message.content # 将本次执行的Trace ID记录到上下文中方便后续关联 langfuse_context.set_current_trace_id(langfuse_handler.get_trace_id()) return { “stock_code”: stock_code, “year”: year, “raw_data”: raw_data, “ratios”: ratios, “report”: report } # 3. 编排工作流Workflow Workflow def financial_analysis_workflow(stock_codes: list, years: list): agent FinancialAnalystAgent() results [] for code in stock_codes: for year in years: result agent.analyze(code, year) results.append(result) return results # 4. 运行工作流 if __name__ “__main__”: # 运行一个批量分析任务 workflow_result financial_analysis_workflow([“000001”, “600519”], [2023, 2024]) print(workflow_result)关键点解析observe装饰器这是 Langfuse 实现可观测性的核心。它自动记录被装饰函数的输入、输出、开始时间、结束时间和任何错误。你需要确认你安装的 Langfuse SDK 版本是否支持decorators。Trace在 Langfuse 中一次完整的智能体调用如agent.analyze会生成一条Trace。里面包含了所有被observe装饰的步骤称为Spans。工具Tool调用框架会自动记录工具调用的输入输出这在排查“智能体为什么调用了这个工具但结果不对”时非常有用。3.3 运行与初步验证不要一上来就跑批量任务。先跑通单点任务。单次执行在代码中先测试分析单家公司单一年份的数据。查看 Langfuse Dashboard执行后立即刷新 Langfuse 的 Web 界面localhost:3000。你应该能在Traces页面看到刚刚运行的记录。点击查看 Trace 详情你会看到一个树状结构清晰地展示了analyze_earnings这个 Span以及它内部可能包含的LLM Call大模型调用和Tool Call工具调用。检查输入输出是否符合预期。确认数据流确保原始数据、计算后的指标、生成的报告都正确无误。如果这一步看不到 Trace按顺序排查Langfuse 服务是否真的在运行docker ps查看环境变量LANGFUSE_*是否正确设置并生效在 Python 中print(os.environ.get(‘LANGFUSE_PUBLIC_KEY’))检查代码中 Langfuse 初始化是否成功检查是否有网络连接错误observe装饰器是否应用正确4. 实现企业级评估从“能看到”到“能衡量”智能体能跑通只是第一步。企业级应用的核心是评估Evaluation和持续迭代。Langfuse 在这方面提供了强大支持。4.1 定义评估指标Scores在 Langfuse 中你可以为每一条 Trace 打上“分数”Scores。这些分数可以是人工评分业务专家在界面上手动给结果打分如1-5分。自动评分用另一段代码评估器根据规则自动打分。对于财务分析智能体典型的评估维度包括事实准确性报告中的数字是否与原始数据一致可自动化检查分析深度是否涵盖了关键财务指标和趋势可部分自动化结合关键词匹配报告可读性语言是否流畅、专业、无歧义通常需人工评分时效性从输入到输出的延迟是否在可接受范围内自动化4.2 创建并运行评估Dataset EvaluationLangfuse 的评估流程通常围绕“数据集Dataset”进行。创建数据集在 Langfuse 界面中创建一个名为“上市公司财报分析测试集”的数据集。添加测试用例向数据集中添加多条测试数据。每条数据包括Input:{“stock_code”: “000001”, “year”: 2023}Expected Output(可选): 你期望的理想答案摘要用于做对比。批量运行智能体编写一个脚本读取数据集中的每条Input调用你的智能体进行分析并将结果Trace关联到这个数据集。from langfuse import Langfuse langfuse Langfuse() dataset langfuse.get_dataset(“上市公司财报分析测试集”) for item in dataset.items: input_data item.input # 调用你的智能体 with langfuse.trace(name“batch_eval”, dataset_item_iditem.id) as trace: result your_agent.analyze(input_data[“stock_code”], input_data[“year”]) trace.output result[“report”]进行评估打分自动化评分可以写一个脚本在智能体运行后自动计算“事实准确性”等维度分数并通过 Langfuse SDK 提交。langfuse.score( trace_idtrace.id, name“factual_accuracy”, value0.95, # 假设95%准确 comment“自动检查数字一致性” )人工评分在 Langfuse 的 “Dataset” 页面评估者可以逐条查看智能体的输出和原始输入直接在界面上打分。4.3 分析与迭代所有评分完成后Langfuse 的分析面板就派上用场了。对比分析你可以轻松对比不同版本智能体例如修改了提示词或换了模型在同一个测试集上的平均分、分数分布。溯源分析发现某条结果得分低直接点击 Trace查看完整的执行链。是因为数据获取工具出错还是大模型的理解有偏差或是指标计算逻辑有问题成本与延迟监控Langfuse 自动记录每次大模型调用的 Token 消耗和耗时。你可以分析哪一步消耗成本最高是否存在优化空间比如缓存、使用更便宜的模型处理简单步骤。这才是工程化的核心将智能体的优化从一个“黑盒玄学”过程变成一个基于数据的、可重复的、可验证的迭代循环。每一次对提示词、工具链或模型的修改都可以通过同一套评估体系来衡量其影响。5. 生产化部署与运维考量当智能体通过评估准备上生产环境时需要考虑更多工程问题。Harness 框架通常提供了部署支持。5.1 部署为 API 服务大多数 Harness 框架允许你将智能体或工作流打包成一个 HTTP API 服务。# 假设框架提供了 CLI 工具 harness serve financial_agent:FinancialAnalystAgent --port 8000这会在本地8000端口启动一个服务。生产环境你需要使用进程管理器如systemd,supervisord来保证服务常驻。反向代理如Nginx处理负载均衡、SSL 终止。容器化将整个环境Python, 代码, 依赖打包成 Docker 镜像用 Kubernetes 或 Docker Swarm 编排这便于扩展和版本管理。5.2 监控与告警生产环境不能只靠人工看 Langfuse 面板。关键指标监控你需要监控 API 的响应时间、错误率、大模型 API 的调用失败率、Token 消耗速率。可以将 Langfuse 的数据导出到 Prometheus或利用其 webhook 功能在特定事件如错误率飙升时发送告警到 Slack、钉钉或 PagerDuty。日志聚合确保智能体框架和你的应用日志被集中收集如 ELK Stack, Loki方便故障排查。5.3 版本管理与回滚智能体的“代码”包括Python 业务逻辑、提示词模板、工具配置、模型配置。使用 Git 管理所有代码和配置文件。提示词模板可以单独存放在数据库或配置文件中实现热更新。通过 Docker 镜像 Tag 或 Kubernetes Deployment 版本来管理整个智能体的版本。当新版本评估分数不达标时能快速回滚到旧版本。6. 常见问题与排查清单在实际落地中你肯定会遇到各种问题。下面是一个按优先级排序的排查清单。6.1 Langfuse 看不到数据Trace检查服务状态docker ps确认所有容器langfuse, postgres, redis都在运行。检查网络连通性从运行智能体的机器是否能curl通LANGFUSE_HOST的/api端点检查密钥权限确认LANGFUSE_SECRET_KEY有写入权限。公钥/私钥是否配对。检查 SDK 初始化代码中是否成功初始化了 Langfuse 客户端是否有异常被静默吞没尝试打开 SDK 的调试日志。检查异步问题Langfuse SDK 默认可能是异步发送数据。确保程序在退出前给了 SDK 足够时间刷新数据langfuse.flush()。6.2 智能体执行失败或结果荒谬查看完整的 Trace在 Langfuse 中打开失败的 Trace重点看输入传给智能体的参数是否正确工具调用每个工具接收的输入和输出是什么工具本身是否报错大模型调用发给大模型的提示词Prompt长什么样大模型的回复是什么是不是提示词构造有问题检查依赖和数据源智能体调用的外部 API如财务数据接口是否可用返回的数据格式是否符合预期检查模型上下文是否因输入过长导致上下文被截断尝试简化输入或使用具有更长上下文的模型。6.3 评估分数不稳定区分是随机性还是系统性大模型本身具有随机性。对同一个输入多次运行观察分数的波动范围。如果波动巨大考虑调整温度Temperature参数降低随机性或采用自我一致性Self-Consistency等技巧。检查评估标准你的评估指标尤其是自动评分规则是否定义清晰、无歧义人工评分者之间的标准是否一致分析失败模式将低分案例集中起来看它们是否有共同特征例如都涉及某个特定财务指标的计算或都来自某个行业。这能帮你定位智能体能力的薄弱环节。6.4 性能瓶颈定位耗时环节利用 Langfuse Trace 的时序图一眼就能看出是工具调用慢还是大模型响应慢。工具优化对于慢速的外部 API 调用考虑增加缓存、批量请求或使用更快的替代数据源。大模型优化提示词优化更简洁、结构化的提示词往往响应更快、成本更低。模型选择非核心步骤是否可以用更小、更快的模型如 GPT-3.5-turbo并行化Harness 框架是否支持并行执行独立的任务7. 总结从项目到平台的关键跨越走完以上所有步骤你完成的不仅仅是一个“财务分析智能体项目”而是搭建了一个“AI智能体评估与迭代平台”的雏形。这套以 Harness或同类框架为执行引擎、以 Langfuse 为观测评估中心的模式可以复用到任何其他领域的智能体开发上比如客服、招聘、法律文书审核等。我个人最深的体会是在 AI 工程化落地的初期最耗费精力的往往不是模型本身而是如何构建一个可靠的“反馈闭环”。Langfuse 这类工具的价值就在于它把这个闭环的基础设施做好了让你能专注于智能体能力的提升而不是重复造轮子去记录日志和计算分数。最后给一个务实建议不要追求第一个版本就完美。先用这套框架跑通一个最小可用的财务分析流程哪怕只分析一个指标。然后围绕这个流程建立评估数据集和评分标准。之后每一次迭代——无论是修改提示词、增加一个新工具还是更换底层模型——都通过这个评估体系来衡量效果。这样你的智能体进化之路才是可控的、数据驱动的。