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

资讯详情

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

从Prompt到Harness:大模型应用开发的架构演进与实践指南

从Prompt到Harness:大模型应用开发的架构演进与实践指南 1. 从“咒语师”到“架构师”为什么说Prompt-only的时代结束了如果你在过去两年里接触过大模型应用开发大概率听过或者自己就干过“Prompt Engineering”这个活儿。那时候我们像一群对着神秘黑箱念咒语的法师精心雕琢一段段文字试图让模型吐出我们想要的答案。调参不我们是“调Prompt”的。一个标点、一个语气词、一个例子顺序的调整都可能让结果天差地别。这催生了一个繁荣的“咒语市场”各种Prompt模板、优化技巧、甚至“魔法Prompt”层出不穷。但到了2026年风向彻底变了。单纯依赖Prompt的玩法正在迅速失效。这不是因为模型变笨了恰恰相反是因为模型变得更聪明、更通用同时也更“脆弱”了。当你把一个大模型直接扔给一个复杂的业务场景时你会发现仅靠一段完美的开场白System Prompt和用户问题User Prompt根本Hold不住。你会频繁撞上这些墙上下文长度限制的硬墙无论你的模型支持4K、32K还是128K Token在真实的、多轮、需要大量背景知识的对话或任务中它总会被塞满。你不得不做痛苦的取舍删掉哪段历史压缩哪个文档结果往往是关键信息丢失模型开始“胡言乱语”。幻觉与事实性错误的泥潭模型会一本正经地编造不存在的信息、引用错误的来源。在金融、法律、医疗等领域这是致命的。Prompt里写一万遍“请基于提供的信息回答”也没用模型固有的生成特性决定了它总会“自由发挥”。复杂任务分解的无能让模型“帮我开发一个电商网站”哪怕给出最详细的Prompt它输出的也大概率是一堆笼统的建议或碎片化的代码片段。它缺乏将宏观目标拆解为可执行原子步骤、管理这些步骤状态、处理步骤间依赖和异常的能力。工具调用与外部集成的混乱让模型调用API、查询数据库、操作软件仅靠Prompt描述接口格式是极其不可靠的。参数格式错误、调用时机不对、结果解析失败是家常便饭。这需要一套稳定的“握手协议”和状态管理机制。所以“Prompt-only已死”这个判断本质是说把大模型当作一个通过自然语言指令就能完成一切任务的“万能接口”这种幻想破灭了。大模型是一个强大的、但也是“原始”的认知引擎。它需要被“驯化”、被“集成”、被置于一个精心设计的系统框架中才能稳定可靠地发挥价值。这个框架就是Harness。Harness直译是“马具”、“安全带”在AI工程领域它指的是一整套用于约束、引导、增强和集成大模型能力以完成特定复杂任务的系统工程框架。它不再把模型当作唯一的“大脑”而是将其视为核心处理器围绕它构建起包括记忆管理、任务规划、工具调用、流程控制、安全校验在内的完整系统。如果说Prompt是给模型的一句口头指令那么Harness就是为模型配备的全身装备、作战地图和后勤支援系统。2026年成为分水岭是因为技术栈已经成熟。向量数据库解决了海量知识的高效检索与上下文注入问题智能体Agent框架提供了任务分解、工具使用和自主决策的基础范式各种中间件和编排工具让组建这样的系统不再是从零造轮子。竞争的焦点从“谁的Prompt更巧妙”转向了“谁的系统架构更健壮、更高效、更易维护”。开发者角色也从“咒语师”转向了“AI系统架构师”。2. Harness核心架构解析不止于Agent很多人会把Harness和Agent划等号这其实是一个常见的误解。Agent智能体确实是Harness架构中的核心执行单元和关键组成部分但Harness的概念更上层、更系统。你可以把Agent看作是一个配备了“思考-行动”循环的智能模块而Harness则是容纳多个这样的模块并管理它们之间协作、数据流、资源分配和异常处理的整个工厂或指挥中心。一个典型的、面向生产环境的Harness架构通常包含以下核心层次和组件2.1 控制层大脑的指挥官这是Harness的决策中枢负责最高级别的目标理解和任务规划。它接收用户的原始请求可能是模糊的并将其解析、拆解成一个结构化的、可执行的工作流。目标解析与意图识别不仅仅是理解用户字面意思更要结合用户历史、会话上下文、业务规则判断其深层意图。例如用户说“帮我分析一下上季度的销售数据”控制层需要判断是要一个总结报告还是要找出异常点或是预测下季度趋势这可能需要调用一个专门的“意图分类”小模型或规则引擎。工作流编排与DAG生成将宏观目标分解为一系列有向无环图DAG形式的子任务。比如“生成季度销售报告”可能被拆解为1. 从CRM系统获取原始数据2. 清洗和预处理数据3. 进行趋势分析和关键指标计算4. 生成图表5. 撰写分析文本6. 整合成PDF报告。控制层需要定义这些任务的执行顺序、依赖关系以及数据传递路径。资源调度与Agent分配根据子任务的性质是数据分析、文本创作还是代码生成将任务分派给最合适的执行单元可能是不同类型的Agent也可能是传统的微服务。它需要管理一个“Agent池”了解每个Agent的能力、当前负载和健康状况。实操心得在初期控制层可以简化甚至用一个精心设计的“规划Agent”Planning Agent来兼任。但随着任务复杂度提升一个独立的、基于规则或轻量级模型的控制层会带来更好的稳定性和可调试性。你可以用像LangChain的SequentialChain、LLMCompiler或直接使用Apache Airflow、Prefect这样的工作流编排工具来实现基础骨架。2.2 执行层干活的智能体们这是Harness中直接与大模型交互、承担具体工作的部分由多个各司其职的Agent构成。每个Agent通常遵循经典的“感知-规划-行动”循环ReAct模式是一个典型代表。规划Agent负责为单个复杂子任务制定分步计划。例如对于“清洗和预处理数据”这个任务规划Agent可能会输出检查缺失值、处理异常值、标准化字段格式等步骤。工具调用Agent这是执行层的主力。它根据规划熟练地使用各种工具Tools。工具是对外能力的封装可以是API调用获取天气、股票信息操作Jira、Slack。数据库查询通过SQL或自然语言接口查询业务数据。代码执行在安全沙箱中运行Python脚本进行数据处理或计算。软件操作通过RPA或脚本控制浏览器、桌面应用。检索器从向量数据库或知识库中查找相关信息。校验与修正Agent在关键步骤后对执行结果进行质量检查。例如检查生成的SQL语句是否有语法错误、查询结果是否为空检查生成的文本是否包含幻觉信息通过事实一致性校验检查代码是否能通过基础编译。如果发现问题它可以尝试自我修正或上报控制层。Harness与Agent的关键区别一个Agent可以独立完成一个任务比如一个能联网搜索并总结的ChatGPT插件但Harness是系统性地解决复杂问题。Harness强调组件化不同的Agent专精不同领域、流程化任务有严格的阶段和顺序和状态持久化整个工作流的状态被完整记录和监控。Agent是士兵Harness是包含情报、后勤、指挥的完整军事体系。2.3 记忆与上下文管理层永不遗忘的副驾驶这是解决“上下文墙”和“金鱼记忆”问题的关键。它不再依赖模型有限的对话上下文而是构建了一个外部的、结构化的、可持久化的记忆系统。短期记忆/会话记忆记录当前会话的完整历史包括多轮对话、中间结果、工具执行记录。这通常存储在像Redis这样的高速缓存中方便快速检索。长期记忆/向量记忆这是核心。将所有相关的知识文档、历史对话摘要、用户偏好、业务规则等通过嵌入模型Embedding Model转化为向量存入向量数据库如Pinecone, Weaviate, Milvus, Qdrant。当需要背景信息时Harness会根据当前对话的向量从向量数据库中检索最相关的N个片段动态地、精准地注入到本次对话的Prompt上下文中。这就是Context Pipeline的精髓——按需供给而非一次性全量灌输。记忆的读写与更新策略设计策略决定什么信息该存入长期记忆、以什么粒度存储是整个文档还是分块、如何更新全量替换还是增量补充。例如每次成功完成一个复杂任务后可以自动生成一个任务摘要存入长期记忆供未来参考。2.4 工具与集成层连接现实世界的桥梁这一层将Harness的能力从数字世界延伸到物理世界和各类业务系统。工具的设计质量直接决定了Harness的实用性。工具抽象与封装每个工具都应该有清晰、严格的输入/输出模式Schema描述最好使用像JSON Schema这样的标准。这不仅能被Agent准确理解也便于做参数校验和错误处理。例如一个“发送邮件”的工具其Schema会明确规定to,subject,body等字段的类型和是否必填。工具发现与路由Harness需要维护一个工具目录。当Agent需要完成某项操作时它能快速查询目录找到合适的工具。更高级的系统可以实现基于工具描述向量的语义检索让Agent能使用它从未明确学过的工具。安全与权限管控这是企业级应用的命门。必须对工具调用施加严格的权限控制。哪个Agent可以调用哪个工具在什么条件下可以调用调用时需要什么样的认证凭证所有工具调用必须有完整的审计日志。对于高风险操作如删除数据、转账应引入人工审批环节。3. 构建你的第一个Harness从理论到实践理解了架构我们来动手搭建一个简单的Harness完成一个具体任务“帮我找出过去一个月内社交媒体上关于我们产品XX的主要负面评价并总结出共性问题。”这个任务无法用一句Prompt解决它涉及数据获取、文本分析、信息归纳等多个步骤。3.1 环境准备与工具定义我们选择Python生态使用LangChain作为Agent框架的基础因为它提供了丰富的组件和抽象。同时我们需要一个向量数据库这里用Chroma轻量易用和一个大模型API例如OpenAI GPT-4或国内的同级别模型。# 基础环境 pip install langchain langchain-openai langchain-community chromadb首先定义我们的工具。至少需要两个社交媒体数据获取工具模拟从某个API获取帖子数据。文本情感分析工具调用一个情感分析API或本地模型。from langchain.tools import tool from typing import List, Dict import json # 工具1模拟获取社交媒体数据 tool def fetch_social_media_posts(platform: str, keyword: str, days: int) - str: 从指定的社交媒体平台获取包含特定关键词的帖子。 Args: platform: 平台名称如 twitter, reddit。 keyword: 搜索关键词。 days: 获取过去多少天的数据。 Returns: 一个JSON字符串包含帖子列表每个帖子有‘id‘, ‘text‘, ‘date‘, ‘author‘字段。 # 这里是模拟数据真实场景替换为API调用 mock_posts [ {id: 1, text: f产品{keyword}太难用了客服也找不到人, date: 2024-05-20, author: user_a, platform: platform}, {id: 2, text: f期待已久的{keyword}功能更新后反而更卡了。, date: 2024-05-18, author: user_b, platform: platform}, {id: 3, text: f{keyword}的设计很棒但价格有点高。, date: 2024-05-15, author: user_c, platform: platform}, ] return json.dumps(mock_posts) # 工具2模拟情感分析 tool def analyze_sentiment(text: str) - str: 分析一段文本的情感倾向。 Args: text: 需要分析的文本。 Returns: 一个JSON字符串包含‘sentiment‘ (positive/negative/neutral) 和 ‘confidence‘ (置信度)字段。 # 模拟分析逻辑真实场景可调用NLP服务如NLTK, TextBlob或云服务 negative_keywords [难用, 卡, 差, 抱怨, 找不到] if any(kw in text for kw in negative_keywords): result {sentiment: negative, confidence: 0.85} else: result {sentiment: neutral, confidence: 0.7} return json.dumps(result)3.2 构建核心Harness工作流现在我们来组装控制层和执行层。我们将创建一个简单的顺序工作流。from langchain.agents import AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI import os # 1. 初始化大模型 # 请替换为你的实际API密钥和Base URL如果使用国内模型 os.environ[OPENAI_API_KEY] your-api-key # 对于国内模型可能需要类似这样的设置 # llm ChatOpenAI(modeldeepseek-chat, openai_api_keyyour-key, openai_api_basehttps://api.deepseek.com/v1) llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0) # 2. 定义工具列表 tools [fetch_social_media_posts, analyze_sentiment] # 3. 创建ReAct Agent的Prompt模板 # 这个模板会指导Agent进行“思考-行动-观察”的循环 prompt_template PromptTemplate.from_template( 你是一个社交媒体分析助手。请逐步思考使用提供的工具来完成任务。 任务{input} 你有以下工具 {tools} 请严格按照以下格式回应 Thought: 你需要思考当前应该做什么 Action: 要使用的工具名称必须是[{tool_names}]中的一个 Action Input: 工具的输入参数 Observation: 工具返回的结果 ... (这个循环可以重复多次) 当你认为已经获得了足够的信息来最终回答用户的问题时请使用 Thought: 我现在可以给出最终答案了 Final Answer: 你的最终答案应清晰总结负面评价及其共性问题。 开始 {agent_scratchpad} ) # 4. 创建Agent并执行 agent create_react_agent(llm, tools, prompt_template) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 5. 执行任务 result agent_executor.invoke({ input: 帮我找出过去一个月内社交媒体上关于我们产品‘智能音箱‘的主要负面评价并总结出共性问题。 }) print(result[output])当你运行这段代码并设置verboseTrue时会在控制台看到类似以下的思考过程这就是Harness中执行层Agent在工作Thought: 用户想找关于产品“智能音箱”的负面评价。我需要先获取相关的社交媒体帖子。 Action: fetch_social_media_posts Action Input: {{platform: twitter, keyword: 智能音箱, days: 30}} Observation: [{id: 1, text: 产品智能音箱太难用了客服也找不到人, ...}, ...] Thought: 我拿到了几条帖子。现在需要分析它们的情感找出负面的。 Action: analyze_sentiment Action Input: {{text: 产品智能音箱太难用了客服也找不到人}} Observation: {{sentiment: negative, confidence: 0.85}} ... (分析其他帖子) Thought: 我已经分析完所有帖子识别出了负面评价。现在可以总结共性问题了。 Final Answer: 在过去一个月内关于“智能音箱”的主要负面评价集中在两点1. 产品易用性差用户反映“太难用”2. 客服支持不到位“找不到人”。共性问题涉及产品用户体验和售后支持渠道。3.3 引入记忆与上下文管道上面的例子是“一次性”的。为了让Harness能记住历史我们引入记忆和向量检索。from langchain.memory import ConversationBufferMemory from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from langchain.chains import RetrievalQA from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 初始化记忆和向量库 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) embeddings OpenAIEmbeddings() vectorstore Chroma(embedding_functionembeddings, persist_directory./chroma_db) # 2. 假设我们有一些产品手册、历史客服记录等知识文档 knowledge_docs [ 智能音箱产品V2.0用户手册重点介绍了语音唤醒和智能家居联动功能。, 2024年Q1客服常见问题汇总最多投诉问题是网络连接不稳定和唤醒词不灵敏。, 我们的竞品XX音箱在音质测评中评分较高。 ] text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) doc_splits text_splitter.create_documents(knowledge_docs) vectorstore.add_documents(doc_splits) # 3. 创建一个检索链作为新的“知识查询工具” retriever vectorstore.as_retriever() qa_chain RetrievalQA.from_chain_type(llmllm, chain_typestuff, retrieverretriever) tool def query_knowledge_base(question: str) - str: 从内部知识库中查询与产品相关的信息。 return qa_chain.invoke({query: question})[result] # 4. 将新工具加入Agent tools.append(query_knowledge_base) # 5. 现在当用户问“为什么用户总抱怨连接问题”时Agent可以主动查询知识库。 # 修改Prompt模板让Agent知道在需要背景信息时使用这个新工具。现在你的Harness具备了短期记忆多轮对话和长期记忆向量知识库。当任务需要背景信息时Context Pipeline会自动将最相关的知识片段注入Prompt让Agent的回答更有依据。4. 避坑指南与进阶优化构建一个能稳定运行的Harness远比跑通一个Demo复杂。以下是我在实际项目中踩过的坑和总结的经验。4.1 稳定性与错误处理Agent不是神Agent会犯错而且错误五花八门。必须为每一层设计防御。工具调用错误网络超时、API限流、参数错误。必须在工具函数内部做好异常捕获返回结构化的错误信息而不是抛出异常导致整个Agent崩溃。例如返回{error: API timeout, suggestion: Please try again later.}。模型输出解析失败LLM可能不按你要求的格式输出导致Action和Action Input解析失败。在AgentExecutor中设置handle_parsing_errorsTrue是基础。更好的做法是使用更鲁棒的输出解析器如PydanticOutputParser强制模型输出结构化的JSON。循环与超时Agent可能陷入“思考-行动”的死循环。务必设置max_iterations最大迭代次数和max_execution_time最大执行时间。LangChain的AgentExecutor都有这些参数。验证与回滚对于关键操作引入“校验-执行”或“预演-确认”模式。例如让Agent先生成要执行的SQL语句由另一个校验模块或人工确认后再真正执行。4.2 提示工程在Harness中的新角色Prompt-only时代结束不代表Prompt不重要了。相反在Harness中Prompt的设计变得更加精细和模块化。系统提示词System Prompt从“万能指令”变为“角色定义与基础规则”。它应该清晰地定义Agent的角色、职责范围、回答格式禁忌如“不要自行编造数据”。工具描述Tool Description这是新的Prompt工程重点。工具的描述必须精确、无歧义、包含示例。模糊的描述会导致模型误用工具。好的描述应像API文档一样清晰。思维链Chain-of-Thought提示在Agent的Prompt模板中强制要求其输出“Thought”是保证其推理过程可控、可调试的关键。这也是ReAct模式的核心价值。上下文压缩与摘要当从向量库检索出多段相关文本时直接拼接可能超出上下文窗口。需要设计一个“摘要Agent”或使用Map-Reduce等方法先对检索结果进行压缩和摘要再将精华注入Prompt。4.3 评估与监控没有度量就没有改进如何知道你的Harness表现好还是坏需要建立评估体系。任务完成率给定100个标准测试任务有多少个被成功完成工具调用准确率Agent选择的工具是否正确调用参数是否准确人工评估分数定期抽样任务结果由人工从“准确性”、“完整性”、“有用性”等维度评分。成本与延迟监控记录每次任务消耗的Token数、API调用次数、总耗时。优化Context Pipeline避免检索和注入不必要的信息是控制成本的关键。可观测性记录完整的执行轨迹Trace。包括每一步的Thought、Action、Observation。这不仅是调试的救命稻草也是后续进行强化学习或微调的训练数据来源。考虑集成像LangSmith这样的专门平台。4.4 面向复杂场景的架构演进当你的Harness需要处理更复杂的业务时考虑以下演进方向多智能体协作引入“主管Agent”Supervisor Agent来协调多个“员工Agent”Worker Agent。例如一个数据分析任务可以由主管分配给“数据获取Agent”、“清洗Agent”、“分析Agent”和“可视化Agent”协同完成。微软的AutoGen框架在此领域有深入探索。分层规划将控制层的规划能力也Agent化。一个顶层的“战略规划Agent”负责拆解宏观目标生成高级工作流每个子任务再由一个“战术规划Agent”进一步细化步骤。这适合极其复杂、动态的任务。与现有系统集成Harness不应是孤岛。通过清晰的API网关将Harness作为服务暴露给现有的业务系统。同时Harness内部也可以调用企业的微服务实现能力互补。持续学习与优化利用执行轨迹Trace数据可以对Agent进行微调Fine-tuning或者训练一个“奖励模型”来优化其决策过程强化学习。让Harness在实践中越用越聪明。从Prompt-only到Harness本质是从“艺术”走向“工程”从“黑箱试探”走向“系统设计”。这要求开发者具备更全面的能力不仅要知道如何与模型对话更要懂软件架构、懂数据流设计、懂异常处理、懂运维监控。这条路挑战巨大但这也是2026年之后构建真正有价值、可交付的AI应用的唯一路径。
返回列表