HarmonyOS生态最近在AI工具链上的动作,明显已经不是“磨刀不误砍柴工”的范畴了,而是直接把刀递到你手上。作为一个长期在移动端和应用层折腾的开发者,我对这类变化其实很敏感——因为AI开发工具一旦开始成体系地开放和整合,真正受益的并不是那些做大模型的头部团队,反而是我们这些做具体业务、具体应用的人。这次围绕“HarmonyOS AI开发工具加速应用创新、构建Agentic时代开发新范式”这个话题,我结合自己的实践,把AI开发工具链的选型思路、Agentic应用的核心架构,以及一套基于FastAPI+LangChain+LangGraph+RAG+pgvector的可落地技术方案完整拆一遍。看完你至少能知道:Agentic不是概念炒作,而是真的能落到代码里的一套工程范式。

先说清这篇文章适合谁。如果你正在用HarmonyOS做应用开发,想把系统级AI能力、大模型接口、知识库检索这些能力组合成真正“有脑子”的应用,那这篇文章就是给你准备的。如果你是一个对LangChain、LangGraph、RAG这些词有印象,但还没完整串起来做项目的后端开发者,这篇文章同样能给你一条清晰的技术路径。我会把工具选型的逻辑、核心概念对比、完整的代码骨架、以及我在实际调试中踩过的坑全部放出来,不求面面俱到,但求每一步你都能照着落地。

1. 从Copilot到Agentic:开发范式正在经历的深层变化

1.1 为什么“会聊天”的AI远不够用

这两年我们见过太多AI应用的形态了。最早是聊天机器人,后来是Copilot——你问一句,它答一句,最多帮你润色一段文案、生成一段代码。这种模式本质上是“被动智能”,模型本身的推理能力再强,也只是在你给它划定的框框里输出内容。但真到了实际业务场景里,你会发现一个很尴尬的问题:用户要的不是“一句话的回答”,而是一连串需要工具调用、上下文更新、分步推理才能完成的任务。

我举个例子。你在HarmonyOS上做一个企业知识库助手,用户问“帮我整理一份上季度所有项目的成本分析,并找出超支风险最高的三个”。这种请求如果走传统Chat模式,模型基本只能给出一个泛泛而谈的模板回答,因为它既没有能力去查数据库,也没有办法协调多个工具调用。而Agentic模式下的应用会怎么做?它会先拆解任务:找出上季度项目清单、获取每个项目的成本数据、调用分析工具计算超支率、再按风险程度排序、最后生成报告。每一环节都是一个独立的决策点,每一步都可能调用不同的工具,这就是Agent(智能体)的运作方式。

所以Agentic时代对开发工具的挑战非常直接:你需要一个能编排工具调用、状态流转、多轮决策的框架,而不是简单封装一个API让你传prompt进去。这也是为什么像LangGraph这种有状态、可编排的框架会突然火起来。

1.2 Agentic开发新范式的基本形态

Agentic开发的核心,简单说就是让AI从“回答问题的人”变成“完成任务的人”。这种转变带来三个工程层面的变化,也是HarmonyOS这类终端生态在布局AI开发工具时都在解决的三个问题。

第一是任务规划能力。Agent要能把一个大目标拆成多个小任务,并且判断哪些任务可以并行、哪些必须串行、哪些需要外部工具介入。这对应到工程上就是“图编排”,LangGraph干的就是这件事——它把Agent的执行过程建模成一张有向图,节点是任务,边是流转规则。

第二是工具调用能力。Agent必须能调用外部API、数据库、记忆存储、系统能力,否则它就只是一个“会说话的鹦鹉”。HarmonyOS的AI开发工具在这块做得很务实,它把端侧AI能力、系统服务能力开放成更统一的接口,开发者可以更轻松地让Agent去调日历、调地图、调文件管理,这些在传统移动开发里是很零散的权限和能力。

第三是记忆管理能力。一个真正有用的Agent必须能记住上下文、记住用户偏好、记住历史结果。这就要靠RAG(检索增强生成)和向量数据库来提供“长期记忆”。让Agent先检索相关资料、再结合上下文生成回答,而不是每次从零开始瞎猜。

1.3 开发工具为什么在Agentic时代变得格外关键

传统软件开发里,工具链负责的是编译、调试、打包这些确定性的流程。但Agentic应用开发完全不是这么回事——你面对的是一个高度不确定的运行时,模型的输出有好有坏,工具调用有成功有失败,状态流转有无数种可能。这时候如果没有强力的开发工具支撑,开发效率会非常低下。

这也是我把HarmonyOS AI开发工具和Agentic放在一起聊的原因。HarmonyOS的方向不是只做一个AI模型接口的聚合平台,而是把“从端侧推理到云端调度、从工具调用到数据回流”整条链路打通。对开发者来说,等于一个人拿到了从地基到毛坯房的全套建材,不用再东拼西凑地自己搭积木。

2. HarmonyOS AI开发工具全景:生态底座的演进

2.1 AI能力接入方式的变迁

HarmonyOS早期给开发者的AI能力,更多是封装好的系统API,比如图像识别、文字识别、语音转写这类单点能力。那时候做AI应用基本就是“调接口”,没有太多的架构设计空间。你不需要关心模型怎么推理、数据怎么管理、上下文怎么组织,只需要把端侧采集的数据传上去,拿回一个结果,渲染到界面上。

但Agentic应用彻底改变了这种模式。Agent要自主决策,要管理多轮对话状态,要决定什么时候调用本地能力、什么时候请求云端大模型、什么时候去检索知识库——这些都是由开发者编排的。HarmonyOS的工具链应对这个变化的方式,是提供更细粒度的AI能力组件,让开发者能像搭积木一样把“感知、推理、行动”组合起来。比如端侧的语音识别模型可以作为一个节点接入Agent的执行图,云端的通用大模型可以作为另一个节点,系统本身的跨应用协同能力也可以被Agent调度。

2.2 从单机智能到端云协同

HarmonyOS的分布式能力是它区别于其他移动操作系统的根本特征。一台手机上的Agent,理论上可以调度平板上的屏幕、手表上的传感器、车机上的扬声器,这种“超级终端”式的协同在Agentic应用里价值巨大。

比如出行场景里,Agent能根据你的日程和位置,自动判断是否需要叫车、是否需要提前出发、是否需要通知会议对方。在传统单设备环境下,这种场景需要你把所有信息都集中在手机上,并且要手动关联大量应用。在HarmonyOS的分布式框架下,Agent可以直接感知多设备的状态,跨设备调用服务,开发和体验的想象空间完全不同。

从开发工具角度看,这意味着Agentic应用要处理的不再是单一的App生命周期,而是分布式环境下的任务分发、设备选择和状态同步。这对开发者的架构能力要求更高了,但反过来,生态工具链也在快速降低这个门槛。

2.3 开发者真正需要什么样的AI工具

我自己在多个AI应用项目里反复体会到一个道理:AI开发工具好不好用,关键不是模型有多强,而是“调试和观测能力”有多到位。Agentic应用最头疼的问题就是不可控——你不知道Agent下一步会调哪个工具,也不知道它为什么做了那个决策。

所以我对AI开发工具的期待很具体:第一,图编排可视化,我能直观看到Agent当前执行到哪个节点;第二,链路追踪,每个工具调用的输入输出都要清清楚楚;第三,沙箱测试环境,不至于每次验证一个小改动都烧钱调用正式模型。HarmonyOS在这方面的布局思路是对的,把成本比较高的算子、中间过程观测能力前置到开发阶段,让开发者及早发现和定位问题。

3. Agentic RAG技术栈实操:一套可落地的完整方案

3.1 技术选型:为什么是FastAPI+LangChain+LangGraph

我在实际项目里构建Agentic应用时,后端技术栈选择的是FastAPI+LangChain+LangGraph+RAG+pgvector。这套组合不是随便拍的,每一个组件我都是对比过替代方案之后才确定的。

FastAPI作为API层毫无疑问是当下Python后端的最优解。它是异步框架,性能足够好,而且天然的Pydantic数据校验能和LangChain的许多数据结构无缝对接。你在LangChain里定义好Tool的输入输出结构,FastAPI直接把这些结构暴露成HTTP接口,开发效率很高。

LangChain在这里承担的是“工具生态”的角色。它为模型提供了丰富的工具封装,比如文档加载器、文本分割器、向量存储封装、各类LLM接口适配器。对于Agentic应用来说,LangChain的LCEL(LangChain Expression Language)可以方便地把模型调用、工具调用、动态路由串联成一条类似于管道的执行链。

LangGraph才是这套架构里真正的“大脑”。它把Agent的执行过程建模成图,支持循环、分支、条件跳转。做个对比你就明白了:LangChain老版本的Agent执行方式是顺序的,每次执行完一个工具就重新推理一次,非常僵化;LangGraph则能定义复杂的工作流,比如“先检索再推理,如果信息不足就再搜索,如果质量不好就换一个模型重试”。Agentic应用天然需要这种灵活性。

3.2 pgvector:让知识库具备向量记忆

RAG的核心思路是“先检索,再生成”——模型不是凭空回答,而是先从知识库里找到相关资料,再把这些资料和用户问题拼在一起喂给模型。这里最关键的内容是两块:一是文本向量化,二是向量检索。pgvector作为一个PostgreSQL扩展,恰好把这两件事都装进了你可能会很熟悉的数据库。

为什么我选了pgvector而不是单独的向量数据库?理由很简单:运维简单,事务一致性好。在一个Agentic应用里,知识库的文档、用户会话记录、任务状态全部有结构化数据的需求,如果把它们分散放在MySQL和Milvus两个系统里,事务和数据一致性就很难管理。pgvector直接住在PostgreSQL里,向量数据和结构化数据共用一张表、一起参与事务,整个架构清爽很多。

实际建表也很直观:

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE knowledge_embeddings (
    id SERIAL PRIMARY KEY,
    content TEXT NOT NULL,
    source_url TEXT,
    metadata JSONB,
    embedding vector(1536)
);

CREATE INDEX ON knowledge_embeddings 
USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

这里的核心参数有两个,一个是embedding的维度,取决于你用的Embedding模型(OpenAI的text-embedding-3-small是1536维,中文场景也可以用BGE系列或者M3E);另一个是IVFFlat索引的lists数量,一般经验值是表行数除以1000,行数越多lists可以设得越大。初次建索引时估算不准没关系,关键是要有这个索引,否则检索会退化成全表扫描,数据量一大就卡死。

3.3 项目结构设计与核心代码实现

这个Agentic RAG后端项目,我建议按照下面的结构来组织:

agentic_rag/
├── app/
│   ├── main.py              # FastAPI入口
│   ├── agents/
│   │   ├── graph.py         # LangGraph图定义
│   │   ├── nodes.py         # 图内节点函数
│   │   └── state.py         # Agent状态定义
│   ├── rag/
│   │   ├── embedder.py      # 向量化服务
│   │   ├── retriever.py     # 检索器封装
│   │   └── store.py         # pgvector存储层
│   ├── tools/
│   │   ├── search_tool.py   # 数据库查询工具
│   │   └── http_tool.py     # HTTP API调用工具
│   └── schemas/
│       └── api.py           # 请求/响应数据模型
├── scripts/
│   └── ingest.py            # 知识库入库脚本
└── requirements.txt

这种分层的好处是把“Agent编排”、“RAG能力”、“工具调用”三者解耦。你想换掉LangGraph换别的编排框架,只动agents目录;你想换掉pgvector换别的向量库,只动rag目录。整个系统具备极好的可演进性。

核心的Agent状态定义可以这样写:

from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END

class AgentState(TypedDict):
    question: str
    context_docs: list
    intermediate_steps: Annotated[list, operator.add]
    final_answer: str

这个状态定义是LangGraph的灵魂所在。它决定了在Agent执行过程中,哪些信息需要在节点之间传递。question是用户的原始输入;context_docs是RAG检索回来的上下文文档;intermediate_steps记录每一步工具调用的轨迹,这个字段是调试Agent的关键,你能看到它每一步做了什么;final_answer则是最终生成给用户的结果。

再来看图的定义。LangGraph里你需要自己组装节点和边的流转关系:

def build_agent_graph():
    workflow = StateGraph(AgentState)

    workflow.add_node("route", route_query)
    workflow.add_node("retrieve", retrieve_knowledge)
    workflow.add_node("reason", reason_with_llm)
    workflow.add_node("tools", execute_tools)
    workflow.add_node("answer", generate_answer)

    workflow.add_edge("route", "retrieve")
    workflow.add_edge("retrieve", "reason")
    workflow.add_conditional_edges(
        "reason",
        decide_next_step,
        {
            "use_tools": "tools",
            "generate": "answer"
        }
    )
    workflow.add_edge("tools", "reason")
    workflow.add_edge("answer", END)

    return workflow.compile()

这个图表达的执行逻辑是:先路由判断用户意图,再检索知识库,然后让模型推理判断是直接生成回答还是需要调用外部工具。如果需要调工具,就回到reason节点继续推理,直到模型认为信息足够,才进入answer节点生成最终回复。这种循环结构在传统顺序式代码里写起来很别扭,但在LangGraph里就是一个天然的图循环。

3.4 FastAPI接口封装:把Agent能力暴露给任何客户端

Agent编排层做完之后,还需要一个能让HarmonyOS前端安全、高效调用服务端API的通信层。FastAPI在这里的角色就是把这些能力封装成标准的HTTPS接口。

服务端代码的核心逻辑如下:

from fastapi import FastAPI
from pydantic import BaseModel
from app.agents.graph import build_agent_graph

app = FastAPI(title="Agentic RAG Service")
agent_graph = build_agent_graph()

class QueryRequest(BaseModel):
    question: str
    session_id: str | None = None

class QueryResponse(BaseModel):
    answer: str
    trace: list

@app.post("/v1/agent/query", response_model=QueryResponse)
async def query_agent(req: QueryRequest):
    result = await agent_graph.ainvoke({
        "question": req.question,
        "context_docs": [],
        "intermediate_steps": [],
        "final_answer": ""
    })
    return QueryResponse(
        answer=result["final_answer"],
        trace=result["intermediate_steps"]
    )

session_id字段很有用,后续接RAG的长短期记忆时需要它来区分会话。我建议现在就预留,别等做记忆功能时再改接口。

3.5 与HarmonyOS端侧的衔接策略

HarmonyOS端到Agentic后端的调用方式和传统HTTP接口没什么本质区别,但有几个容易忽略的细节值得单独提醒。

ArkTS发请求时要用到 @ohos.net.http 模块,基础写法如下:

import http from '@ohos.net.http';

let httpRequest = http.createHttp();
let promise = httpRequest.request(
  "https://your-server.com/v1/agent/query",
  {
    method: http.RequestMethod.POST,
    header: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer your_token'
    },
    extraData: JSON.stringify({
      question: "帮我分析一下这几个方案的风险",
      session_id: "user_001"
    })
  }
);

但如果Agent执行时间较长(尤其是涉及多轮工具调用时),HTTP请求很容易超时。这时候我有两个建议:一是把Agent调用改成异步任务模式,客户端提交请求后立即拿到一个task_id,然后用WebSocket或者轮询接口获取结果;二是在HarmonyOS端把Agent调用放在 TaskPool 或者后端任务里,避免阻塞UI线程。前者需要服务端改造支持异步任务队列,后者只需要客户端做调整,可以按项目需求取舍。

4. 常见问题与排查技巧实录

4.1 向量召回质量差的排查思路

RAG项目上线后最常被投诉的问题就是“回答得驴唇不对马嘴”。排查这类问题有一个固定的顺序,不要跳着来。

第一步检查Embedding模型和检索方式是否匹配。我遇到过最容易踩的坑是:索引用的是cosine距离,代码里检索时也声明了cosine,但实际query向量没过归一化,导致余弦相似度算出来的结果忽高忽低。如果你用的是OpenAI这类商用Embedding接口,一般没问题;但如果你用本地模型,就一定要确认检索代码里有没有对embedding做归一化处理。

第二步检查文本分块策略。很多文档被切得太碎,一言半语根本没有上下文,检索回来也提供不了有效信息。我自己调试下来,中文场景下按300-500字为一个块、重叠50-100字是比较稳的区间。块太小丢上下文,块太大检索命中就模糊。

第三步是看召回日志。如果最终回答质量差,一定要回看中间链路里到底召回了哪些文档。别急着改模型prompt,很多时候问题根本不在模型,而是检索出来的文档压根不对。

4.2 LangGraph状态流转异常的定位

LangGraph上手之后最常见的报错是“InvalidUpdateError”或者图执行到某个节点后状态不对。这类问题八成出在节点函数的返回值定义上。LangGraph对状态更新有严格约束——节点函数只能返回状态中已定义的字段,不能凭空新增一个没有在AgentState里声明的键。

还有一种情况是节点函数返回了None。你在图里定义了某个节点,逻辑上它应当更新状态,但实际代码return了一个空值,图执行到下一步的时候就读不到该有的数据。排查方法很简单:在每个节点函数入口加一行日志,打印当前收到的state关键字段;在节点出口再打一行,打印函数返回了什么。跑一遍测试流程,日志会清晰地告诉你哪一步断了。

我第一次调这个框架时也栽在这儿,后来养成了一个习惯:所有图节点的状态字段都在AgentState里用Annotated标注好更新方式,是覆盖还是累加必须显式声明,绝不默认。

4.3 性能瓶颈与数据隐私的平衡

Agentic应用普遍存在一个痛点是“太慢”。原因是多方面的:模型推理本身要时间,工具调用要时间,串联起来就很容易超过用户的耐心底线。

应对策略我说两个实用的。

第一,缓存。相同或相似的问题可以走缓存,不用每次都让Agent重新跑一遍全流程。pgvector里带metadata字段,可以在里面存一层“问题相似度缓存”,当新来的问题和历史问题的余弦相似度超过0.95时直接复用结果。

第二,用轻量模型做路由层。LangGraph的route节点没必要用最强的模型,用一个速度快、便宜的小模型来判断用户意图就足够。真正需要深度推理时才切换到大模型。这种降配策略在成本上用很小的损耗换取了很大的性能收益。

数据隐私这块,HarmonyOS端特有的问题是端侧数据能不能出设备。我一般建议把涉敏数据相关的处理全部留在端侧,Agent只负责调用端侧能力,RAG知识库只存非敏感文档。这个架构能同时兼顾体验和隐私合规。

5. 回顾Agentic落地过程后的一些体会

如果你现在正要开始做Agentic相关的AI应用,我建议你先把心态调到“工程思维”而不是“模型思维”。模型只是大脑,Agentic的关键在于有没有一套好用的手脚——工具调用、知识检索、任务编排,这些工程能力决定了一个AI应用的真实上限。HarmonyOS对AI开发工具的持续投入,本质上就是在帮开发者快速把这些手脚装配齐。

我个人踩过几次坑之后的体会是:不要一上来就追求特别复杂的图编排和特别完美的Agent行为。先做一条最简链路——一个检索节点加一个生成节点,跑通之后再逐步加入工具调用、条件分支、记忆机制。Agentic应用和传统应用的调试复杂度不在一个量级,只有链路足够短、日志足够清晰,你才能快速定位问题。

最后说一个可能帮你少走弯路的技巧:无论是LangGraph的图定义,还是RAG的检索链路,翻译成图时都尽量加一个人工确认的开关节点。比如Agent调用写操作时先停下问一句用户“确认要执行吗”。Agentic应用要替代人类完成任务,人类监督是最后的护栏,也是让用户安心、让产品合规的重要保障。把这一步做进开发范式里,后面的路会顺很多。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐