从零构建金融大模型问答机器人:Harness工程思想与LangChain实战 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度大家好我是专注于AI大模型应用开发的博主。最近在社区和招聘信息中“Harness”和“Harness Engineering”这两个词的出现频率越来越高很多开发者尤其是刚接触AI应用开发的朋友常常感到困惑它和LangChain、Agent有什么区别为什么说它是AI Agent时代的工程范式革命今天我们就来彻底搞懂Harness并手把手带你从零构建一个基于Harness思想的金融大模型问答机器人项目。无论你是零基础小白还是有一定经验的开发者这篇文章都将为你提供从原理到实战的完整路径附带的代码和配置可以直接复用。1. Harness EngineeringAI Agent时代的核心工程思想在深入代码之前我们必须先理解Harness到底是什么。很多人把它简单理解为一个框架或工具这其实是不准确的。Harness Engineering驾驭工程是一种工程范式一种系统设计思想。1.1 从“写代码”到“设计系统”的范式转变传统的AI应用开发尤其是基于大语言模型LLM的开发常常陷入一个循环我们花费大量精力去编写和调试给模型的提示词Prompt试图让模型一次性输出完美的结果。这个过程充满了不确定性模型可能会“胡言乱语”、遗忘上下文、或者无法执行复杂任务。Harness Engineering的核心思想在于转变视角我们不再追求让一个“超级智能”的模型去完成所有事情而是设计一个系统Harness来可靠地“驾驭”模型的能力。这个系统负责分解任务、管理上下文、处理工具调用、保障流程稳定、并优雅地处理模型的失败。模型在这个系统中更像是一个强大但需要被精心调用的“子模块”。举个例子让模型直接写一个完整的股票分析报告它可能写不好。但如果我们设计一个Harness它先调用工具获取实时股价和新闻然后让模型总结新闻要点再调用另一个工具计算技术指标最后让模型综合所有信息生成报告成功率就会高很多。这个协调、调度、保障流程的“外壳”就是Harness。1.2 Harness、Agent与LangChain的关系与区别这是最容易混淆的地方我们通过一个表格来厘清概念定义角色类比与Harness的关系大语言模型 (LLM)如GPT-4、Qwen、Claude提供核心的理解与生成能力。专家拥有广博的知识和创造力但需要引导。被驾驭的对象是Harness系统的核心“引擎”。智能体 (Agent)一个能够感知环境、进行决策并执行动作以达成目标的实体。它通常包含LLM、记忆、工具等组件。项目经理负责某个具体目标的规划和执行。Agent是Harness思想的一种具体实现形态。一个设计良好的Agent就是一个Harness。LangChain/LlamaIndex提供了构建Agent和链Chain所需的大量预制组件、工具集成和编排模式。工具箱/脚手架提供了标准化的螺丝刀、木板和搭建方法。它们是实现Harness的优秀框架和库。使用它们可以更高效地构建Harness系统。Harness (Engineering)一套工程原则和系统设计模式强调可靠性、可控性、可观测性和迭代优化。工程方法论与蓝图指导你如何设计一个稳定、高效、可维护的“项目经理”Agent团队。是上层指导思想。你可以用LangChain遵循Harness思想来构建Agent。简单总结Harness是“道”是设计哲学Agent是“术”是一种实现形式LangChain是“器”是帮助我们实施“术”以符合“道”的工具。1.3 为什么需要Harness Engineering提升可靠性通过系统化的错误处理、重试机制和验证步骤减少模型幻觉和随机性带来的影响。实现复杂任务将复杂任务分解为模型能可靠执行的子步骤通过流程编排串联起来。增强可控性与可观测性在每个步骤记录输入输出方便调试、监控和优化而不是一个黑盒。降低成本与提升效率精细化的任务分解可以避免让大模型做不擅长的事如精确计算转而调用专用工具从而减少Token消耗、提高响应速度。便于迭代系统的模块化设计使得你可以单独优化某个步骤如改进某个工具的提示词而不影响全局。理解了这些我们就能明白学习Harness实战本质是学习如何用工程化的、系统化的思维去构建可靠、实用的AI应用。接下来我们就进入实战环节。2. 项目实战构建金融大模型问答机器人我们将构建一个具备以下能力的机器人知识问答基于本地金融知识库如公司财报、法规文档回答问题。信息查询调用外部API获取实时股票价格、新闻摘要。逻辑推理根据用户问题自动判断使用哪种能力并编排执行流程。技术栈选型LLMQwen通义千问优秀的开源中文大模型支持本地部署。应用框架LangChain。它提供了构建Agent和Chain所需的几乎所有组件是我们实现Harness思想的利器。向量数据库/检索Chroma轻量级或 FAISS。用于存储和检索本地知识。后端APIFastAPI轻量高效便于部署和集成。核心模式RAG检索增强生成 Agent工具调用。2.1 环境准备与项目初始化操作系统Linux/macOS/Windows (WSL2推荐)Python版本 3.9首先创建项目目录并初始化虚拟环境mkdir finance_ai_harness cd finance_ai_harness python -m venv venv # Linux/macOS source venv/bin/activate # Windows # venv\Scripts\activate安装核心依赖。我们将使用langchain-community来集成各种工具使用chromadb作为向量数据库。pip install langchain langchain-community langchainhub pip install chromadb pypdf sentence-transformers pip install fastapi uvicorn httpx pip install transformers torch # 安装Qwen官方库以Qwen2.5为例 pip install qwen2.5项目结构如下finance_ai_harness/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 主应用 │ ├── harness/ # Harness核心模块 │ │ ├── __init__.py │ │ ├── agent.py # Agent定义与执行器 │ │ ├── tools.py # 自定义工具集 │ │ └── memory.py # 记忆管理 │ ├── knowledge/ # 知识库管理 │ │ ├── __init__.py │ │ ├── loader.py # 文档加载 │ │ ├── splitter.py # 文本分割 │ │ └── vector_store.py # 向量库操作 │ └── config.py # 配置文件 ├── data/ # 存放知识库原始文档PDF/TXT ├── static/ # 静态文件 ├── requirements.txt └── README.md2.2 知识库构建RAG基础Harness系统需要可靠的知识来源。我们首先构建一个本地金融知识库。1. 文档加载与处理 (knowledge/loader.pyknowledge/splitter.py)# app/knowledge/loader.py from langchain_community.document_loaders import PyPDFLoader, TextLoader from langchain.schema import Document from typing import List import os class KnowledgeLoader: def __init__(self, data_dir: str ../data): self.data_dir data_dir def load_documents(self) - List[Document]: 加载指定目录下的所有文档 documents [] for filename in os.listdir(self.data_dir): file_path os.path.join(self.data_dir, filename) if filename.endswith(.pdf): loader PyPDFLoader(file_path) documents.extend(loader.load()) elif filename.endswith(.txt): loader TextLoader(file_path, encodingutf-8) documents.extend(loader.load()) # 可扩展其他格式如 .docx, .md print(f共加载 {len(documents)} 个文档片段。) return documents# app/knowledge/splitter.py from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.schema import Document from typing import List class KnowledgeSplitter: def __init__(self, chunk_size500, chunk_overlap50): # 根据中文特点调整分割器 self.text_splitter RecursiveCharacterTextSplitter( chunk_sizechunk_size, chunk_overlapchunk_overlap, separators[\n\n, \n, 。, , , , , 、, , ] ) def split_documents(self, documents: List[Document]) - List[Document]: 将文档分割成适合检索的片段 return self.text_splitter.split_documents(documents)2. 创建向量存储 (knowledge/vector_store.py)我们使用sentence-transformers中的中文嵌入模型并存入 Chroma。# app/knowledge/vector_store.py from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma from langchain.schema import Document from typing import List import os class VectorStoreManager: def __init__(self, persist_directory: str ./chroma_db): # 使用开源的中文嵌入模型 self.embeddings HuggingFaceEmbeddings( model_namesentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 ) self.persist_directory persist_directory self.vector_store None def create_from_documents(self, documents: List[Document]): 从文档创建向量存储并持久化 self.vector_store Chroma.from_documents( documentsdocuments, embeddingself.embeddings, persist_directoryself.persist_directory ) self.vector_store.persist() print(f向量库已创建并保存至 {self.persist_directory}) def load_vector_store(self): 加载已存在的向量存储 if os.path.exists(self.persist_directory): self.vector_store Chroma( persist_directoryself.persist_directory, embedding_functionself.embeddings ) print(向量库加载成功。) return self.vector_store else: raise FileNotFoundError(f向量库目录 {self.persist_directory} 不存在请先创建。) def get_retriever(self, search_kwargs{k: 3}): 获取检索器用于后续RAG if self.vector_store is None: self.load_vector_store() return self.vector_store.as_retriever(search_kwargssearch_kwargs)3. 知识库初始化脚本在项目根目录创建一个脚本init_knowledge.py# init_knowledge.py import sys sys.path.append(.) from app.knowledge.loader import KnowledgeLoader from app.knowledge.splitter import KnowledgeSplitter from app.knowledge.vector_store import VectorStoreManager def main(): # 1. 加载文档 loader KnowledgeLoader(data_dir./data) raw_docs loader.load_documents() if not raw_docs: print(未在 ./data 目录下找到任何 .pdf 或 .txt 文件。) return # 2. 分割文档 splitter KnowledgeSplitter(chunk_size500, chunk_overlap50) split_docs splitter.split_documents(raw_docs) print(f文档分割为 {len(split_docs)} 个片段。) # 3. 创建并保存向量库 vs_manager VectorStoreManager(persist_directory./chroma_db) vs_manager.create_from_documents(split_docs) print(知识库初始化完成) if __name__ __main__: main()运行此脚本前请将你的金融知识PDF或TXT文件放入./data目录然后执行python init_knowledge.py2.3 定义工具集Harness的“手脚”一个强大的Harness依赖于其可用的工具。我们来定义几个金融领域常用的工具。# app/harness/tools.py from langchain.tools import tool from typing import Optional import httpx import json class FinanceTools: 金融工具集 tool def get_stock_price(symbol: str) - str: 获取指定股票代码的实时价格。 参数: symbol: 股票代码例如 AAPL苹果, 00700腾讯港股。 返回: 股票价格信息字符串。 # 注意这里使用模拟数据。实际应用中应接入雅虎财经、新浪财经等API。 # 请务必遵守相关数据服务的使用条款。 mock_data { AAPL: 172.35 USD, 00700: 320.00 HKD, TSLA: 175.22 USD } price mock_data.get(symbol.upper(), 未找到该股票代码的模拟价格。) return f股票 {symbol} 的当前模拟价格为: {price} tool def search_financial_news(company: str, days: Optional[int] 7) - str: 搜索近期关于某公司的金融新闻摘要。 参数: company: 公司名称如 腾讯Apple。 days: 检索最近多少天的新闻默认7天。 返回: 新闻摘要字符串。 # 模拟新闻检索。实际可接入NewsAPI、百度资讯等。 mock_news { 腾讯: f近期{days}天内关于腾讯的新闻摘要财报显示云业务增长稳健游戏收入符合预期。, Apple: f近期{days}天内关于Apple的新闻摘要发布新款iPad市场关注其AI功能集成。 } summary mock_news.get(company, f未找到近期关于{company}的模拟新闻摘要。) return summary tool def calculate_compound_interest(principal: float, rate: float, years: int) - str: 计算复利。 参数: principal: 本金。 rate: 年利率例如5%输入为0.05。 years: 年数。 返回: 复利计算结果。 amount principal * ((1 rate) ** years) return f本金 {principal}年利率 {rate*100}%经过 {years} 年复利最终金额为: {amount:.2f} # 将工具实例化并导出为列表供Agent使用 def get_finance_tools(): tools_instance FinanceTools() return [ tools_instance.get_stock_price, tools_instance.search_financial_news, tools_instance.calculate_compound_interest, ]2.4 构建Harness核心智能体Agent这是体现Harness工程思想的关键。我们将创建一个能根据用户意图自动选择使用知识库检索RAG还是调用外部工具的Agent。# app/harness/agent.py from langchain.agents import AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate from langchain_core.tools import BaseTool from langchain.chains import RetrievalQA from langchain.memory import ConversationBufferMemory from typing import List, Any import sys sys.path.append(..) from app.config import LLM_CONFIG class FinanceAgentHarness: 金融问答机器人Harness核心。 整合了RAG检索、工具调用和对话记忆。 def __init__(self, llm, retriever, tools: List[BaseTool]): self.llm llm self.retriever retriever self.tools tools self.memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 1. 创建RAG链用于处理纯知识问答 self.rag_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue, verboseFalse ) # 2. 创建Agent提示词模板 # ReAct范式提示词指导Agent思考、行动和观察 agent_prompt PromptTemplate.from_template( 你是一个专业的金融助手拥有以下能力 1. 回答基于已知知识库的金融知识问题。 2. 调用工具获取实时股票价格、新闻或进行计算。 3. 进行多轮对话理解上下文。 如果你需要回答关于金融概念、公司概况、法规政策等**静态知识**请直接使用你的知识库检索能力不要调用工具。 如果你需要**实时数据**如股价、新闻或进行**复杂计算**如复利请调用相应的工具。 请严格遵循以下格式 问题用户输入的问题 思考你需要先思考这个问题属于哪种类型知识问答/需要工具并规划步骤。 行动根据思考要么直接给出基于知识的答案要么调用工具。调用工具时必须使用如下格式 行动调用工具[工具名称] 工具输入{参数名: 参数值} 观察工具返回的结果或你检索到的知识。 ... (这个思考/行动/观察循环可以重复多次) 最终答案综合所有观察和知识给出最终回复。 历史对话 {chat_history} 问题{input} {agent_scratchpad} ) # 3. 创建ReAct Agent self.agent create_react_agent( llmllm, toolstools, promptagent_prompt ) # 4. 创建Agent执行器注入记忆 self.agent_executor AgentExecutor( agentself.agent, toolstools, memoryself.memory, verboseTrue, # 设为True可看到详细的思考过程生产环境建议设为False handle_parsing_errorsTrue, # 优雅处理解析错误 max_iterations5, # 防止无限循环 early_stopping_methodgenerate # 当Agent认为可以结束时停止 ) def route_question(self, question: str) - str: 问题路由根据问题类型决定使用RAG链还是Agent。 这是一个简单的路由逻辑实际可以更复杂。 # 简单的关键词路由如果问题包含“价格”、“股价”、“新闻”、“计算”、“复利”等倾向于使用Agent tool_keywords [价格, 股价, 新闻, 计算, 复利, 利率, 实时] if any(keyword in question for keyword in tool_keywords): print([路由决策] 问题涉及实时数据或计算交由Agent处理。) return self._run_agent(question) else: print([路由决策] 问题可能为知识问答使用RAG检索。) return self._run_rag(question) def _run_rag(self, question: str) - str: 执行RAG检索问答 try: result self.rag_chain.invoke({query: question}) answer result[result] # 可以添加来源引用 sources [doc.metadata.get(source, 未知) for doc in result.get(source_documents, [])] if sources: answer f\n\n相关信息来源{, .join(set(sources))} return answer except Exception as e: return f检索知识库时出错{e}。请尝试重新表述您的问题。 def _run_agent(self, question: str) - str: 执行Agent工具调用流程 try: result self.agent_executor.invoke({input: question}) return result[output] except Exception as e: return fAgent执行过程中出错{e}。请确认您的问题是否需要调用工具。 def run(self, question: str) - str: 主运行接口 return self.route_question(question)2.5 配置与主程序集成配置文件 (app/config.py)# app/config.py from langchain_qwen import Qwen2_5 # 初始化Qwen LLM # 注意你需要有相应的模型文件或API密钥。这里以本地模型为例。 # 如果你使用OpenAI API可以替换为 ChatOpenAI def get_llm(): # 方式1使用本地Qwen模型需提前下载 # from langchain.llms import HuggingFacePipeline # ... 本地加载代码较复杂此处省略建议初学者先使用API # 方式2使用DashScope API阿里云通义千问 # from langchain.llms import Tongyi # llm Tongyi(modelqwen-max, api_keyyour-api-key) # 方式3为简化教程我们使用一个模拟LLM。实际项目请替换为真实的LLM。 from langchain.llms.fake import FakeListLLM responses [ 这是一个模拟回答。在实际项目中这里会连接真实的Qwen大模型。, 我理解你想查询股价我将调用工具。, 根据知识库巴菲特的价值投资理念核心是..., ] llm FakeListLLM(responsesresponses) return llm # 其他配置 VECTOR_STORE_PATH ./chroma_dbFastAPI主应用 (app/main.py)# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from app.harness.agent import FinanceAgentHarness from app.harness.tools import get_finance_tools from app.knowledge.vector_store import VectorStoreManager from app.config import get_llm import uvicorn app FastAPI(title金融大模型问答机器人 Harness Demo) # 全局Harness实例 harness_system None class QueryRequest(BaseModel): question: str class QueryResponse(BaseModel): answer: str source: str # 标识是RAG还是Agent的回答 app.on_event(startup) async def startup_event(): 启动时初始化Harness系统 global harness_system print(正在初始化金融问答Harness系统...) try: # 1. 加载LLM llm get_llm() # 2. 加载向量库检索器 vs_manager VectorStoreManager() retriever vs_manager.get_retriever() # 3. 获取工具 tools get_finance_tools() # 4. 构建Harness harness_system FinanceAgentHarness(llm, retriever, tools) print(Harness系统初始化成功) except Exception as e: print(f系统初始化失败: {e}) raise app.post(/query, response_modelQueryResponse) async def query_knowledge(request: QueryRequest): if harness_system is None: raise HTTPException(status_code503, detail系统未就绪) if not request.question.strip(): raise HTTPException(status_code400, detail问题不能为空) answer harness_system.run(request.question) # 简单判断来源实际可根据harness内部状态更精确判断 source Agent if any(x in request.question for x in [价格, 计算, 新闻]) else RAG return QueryResponse(answeranswer, sourcesource) app.get(/health) async def health_check(): return {status: healthy, service: Finance AI Harness} if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)2.6 运行与测试启动服务cd finance_ai_harness python -m app.main服务将在http://localhost:8000启动。测试API 使用curl或 Postman 进行测试。# 测试健康检查 curl http://localhost:8000/health # 测试知识问答触发RAG curl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d {question: 请解释一下什么是价值投资} # 测试工具调用触发Agent curl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d {question: 苹果公司AAPL的股票价格是多少} # 测试混合意图可能先RAG后Agent取决于你的路由逻辑 curl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d {question: 腾讯最近有什么新闻另外帮我计算一下10000元本金年化5%10年复利是多少}由于我们使用了模拟LLM和模拟工具返回结果是预设的。但整个Harness的流程、路由、Agent的思考-行动-观察循环已经完整搭建起来。当你替换为真实的Qwen模型和真实的股票API后一个功能完整的金融问答机器人就诞生了。3. Harness工程的最佳实践与进阶思考通过上面的项目我们已经实践了Harness的核心思想。以下是将其应用于生产环境时需要关注的工程最佳实践3.1 设计清晰的能力分层与模块边界一个健壮的Harness系统应该像洋葱一样分层接口层 (Interface Layer)接收用户输入格式化输出。负责协议适配HTTP/WebSocket等。编排层 (Orchestration Layer)核心Harness逻辑。负责意图识别、任务分解、流程控制、调用RAG或Agent。这是我们FinanceAgentHarness所在的位置。能力层 (Capability Layer)提供具体能力的模块。包括RAG引擎负责知识检索与生成。工具集封装所有外部API和计算函数。记忆模块管理对话历史、用户偏好等。资源层 (Resource Layer)大模型、向量数据库、外部API连接等基础设施。每层之间通过清晰的接口如函数调用、消息队列通信便于独立开发、测试和替换。3.2 实现强大的可观测性与调试Harness的复杂性要求我们必须能看清内部发生了什么。结构化日志记录每个步骤的输入、输出、耗时、模型调用详情、工具调用结果和错误信息。使用如structlog或loguru库。链路追踪为每个用户会话分配唯一ID并在整个处理链路中传递方便追踪一个问题的完整处理路径。可视化界面考虑集成像LangSmith这样的平台它可以可视化展示Chain和Agent的执行过程是调试Harness的利器。3.3 构建稳健的错误处理与回退机制模型和外部服务都可能失败Harness必须优雅应对。工具调用重试对于暂时性网络错误实现指数退避重试。模型降级当主模型如Qwen-Max不可用时自动切换到备用模型如Qwen-Lite。超时控制为LLM调用和工具调用设置严格的超时避免用户长时间等待。友好兜底当所有尝试都失败时返回一个友好的、预设的兜底答案并提示用户稍后再试或简化问题。3.4 优化提示词工程与模型交互Harness的效能很大程度上取决于你如何与模型“对话”。提示词模板化与管理不要将提示词硬编码在代码中。将其抽取为配置文件或数据库存储便于A/B测试和迭代优化。上下文管理精心设计送入模型的上下文。过长会浪费Token且降低性能过短会丢失关键信息。实现智能的上下文窗口滑动或摘要。输出解析与验证使用LangChain的PydanticOutputParser或自定义解析器确保模型输出是结构化的、可被后续流程消费的格式。对关键输出如工具调用的参数进行格式验证。3.5 保障安全与权限工具调用沙箱对于执行代码、访问数据库等危险工具必须在严格的沙箱环境中运行。用户输入净化防止提示词注入攻击对用户输入进行必要的清洗和转义。访问控制根据用户角色限制其可以访问的知识库范围或可以调用的工具。4. 常见问题排查 (FAQ)在开发和运行上述Harness系统时你可能会遇到以下问题问题现象可能原因排查思路与解决方案启动服务时报ModuleNotFoundError依赖未安装或虚拟环境未激活。1. 确认已激活虚拟环境 (source venv/bin/activate)。2. 运行pip install -r requirements.txt确保所有依赖已安装。RAG检索返回“未找到相关信息”1. 知识库未初始化或路径错误。2. 文档分割过细或嵌入模型不匹配。3. 问题与知识库内容不相关。1. 检查./chroma_db目录是否存在且包含文件。2. 调整chunk_size和chunk_overlap尝试不同的嵌入模型。3. 确认./data目录下已放入相关金融文档。Agent陷入循环或报Parsing error1. LLM未按ReAct格式输出。2. 工具描述不清导致模型无法正确调用。3.max_iterations设置过小。1. 将verboseTrue观察模型输出的原始文本调整提示词使其更严格遵循格式。2. 检查工具函数的docstring是否清晰描述了参数和用途。3. 适当增加max_iterations或检查工具返回结果是否格式异常。调用真实股票API时超时或返回错误1. 网络问题。2. API密钥无效或配额用尽。3. API接口变更。1. 检查网络连接为HTTP请求添加重试机制和超时设置。2. 验证API密钥查看服务商控制台。3. 查阅API最新文档更新请求参数。响应速度慢1. 本地嵌入模型或LLM加载慢。2. 检索的chunk数量 (k) 太大。3. 工具调用串行且耗时。1. 考虑使用更轻量的模型或改用云API。2. 减少search_kwargs中的k值例如从5降到3。3. 分析瓶颈对于无依赖的工具调用可考虑并行化。记忆功能失效上下文丢失1.ConversationBufferMemory未正确配置或传递。2. 每次请求创建了新的Agent实例。1. 确保memory对象被正确注入到AgentExecutor中并在多次调用间复用。2. 确保Harness系统如FastAPI中的harness_system是全局单例。5. 总结与学习路线通过这个完整的项目我们实践了Harness Engineering从理论到落地的全过程。你不再只是调用一个API而是设计了一个能可靠协调大模型、知识库和外部工具的智能系统。回顾核心收获理解了Harness的本质它是一种面向AI Agent的系统工程思想核心是可靠性与可控性。掌握了核心组件学会了如何使用LangChain构建RAG检索、定义工具、创建具备ReAct推理能力的Agent并将它们有机整合。完成了项目闭环从环境搭建、知识库构建、工具开发、Harness核心编排到最终通过API提供服务走通了全流程。建立了工程化思维开始思考分层、观测、错误处理、安全等生产级问题。下一步深入学习方向替换真实模型将示例中的FakeListLLM替换为真实的Qwen API或本地部署的Qwen2.5模型体验真实生成效果。集成真实数据源接入免费的金融数据API如AKShare、eastmoney等让工具真正“活”起来。探索高级Agent模式尝试Plan-and-Execute、Multi-Agent等更复杂的编排模式处理更复杂的任务。引入评估与迭代构建一个测试集对Harness系统的回答进行自动化和人工评估持续优化提示词和流程。学习部署与运维使用Docker容器化你的应用并通过Kubernetes或云服务进行部署学习监控和扩缩容。Harness Engineering是构建下一代AI应用的基石。希望这篇教程能为你打开这扇门助你在AI应用开发的道路上走得更稳、更远。文章中的所有代码都已提供建议你亲手运行和修改这是理解它的最佳方式。如果在实践中遇到任何问题欢迎在评论区交流讨论。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度