目录
- [1. 为什么 FDE 要懂企业 Agent 项目](#1. 为什么 FDE 要懂企业 Agent 项目)
- [2. 需求分析:把一句话需求拆成可验证的目标](#2. 需求分析:把一句话需求拆成可验证的目标)
- [2.1 从业务问题开始,而不是从模型开始](#2.1 从业务问题开始,而不是从模型开始)
- [2.2 把目标量化](#2.2 把目标量化)
- [3. 场景拆解与边界定义](#3. 场景拆解与边界定义)
- [3.1 确定 Agent 的能力边界](#3.1 确定 Agent 的能力边界)
- [3.2 拆解处理流程](#3.2 拆解处理流程)
- [4. 技术选型与架构设计](#4. 技术选型与架构设计)
- [4.1 选型原则](#4.1 选型原则)
- [4.2 架构分层](#4.2 架构分层)
- [5. 核心实现:从数据准备到 Agent 编排](#5. 核心实现:从数据准备到 Agent 编排)
- [5.1 准备数据:文档切分很关键](#5.1 准备数据:文档切分很关键)
- [5.2 构建向量索引](#5.2 构建向量索引)
- [5.3 编写检索问答链路](#5.3 编写检索问答链路)
- [6. 效果评估:用数据说话](#6. 效果评估:用数据说话)
- [6.1 准备测试集](#6.1 准备测试集)
- [6.2 计算基础指标](#6.2 计算基础指标)
- [6.3 常见问题与调优方向](#6.3 常见问题与调优方向)
- [7. PoC 交付与落地建议](#7. PoC 交付与落地建议)
- [7.1 PoC 交付物清单](#7.1 PoC 交付物清单)
- [7.2 和客户沟通的注意事项](#7.2 和客户沟通的注意事项)
- [7.3 从 PoC 走向生产](#7.3 从 PoC 走向生产)
- [8. 总结与学习资源](#8. 总结与学习资源)
1. 为什么 FDE 要懂企业 Agent 项目
前沿部署工程师(Forward Deployed Engineer,FDE)的工作不是"交完代码就走",而是要在客户现场把真实业务问题跑通。近两年,企业级 Agent(智能体)项目越来越多,客户的需求往往从一句话开始:
"我想让大模型自动处理工单。"
"能不能让 AI 帮我整理合同风险点?"
"能不能做一个能查内部知识库的问答机器人?"
这些需求听起来简单,但真正落地时会遇到数据分散、权限复杂、接口不规范、准确率不达标、部署环境受限等一系列问题。FDE 的价值就在于:在有限时间内,把一个模糊的业务诉求,验证成可以给客户演示、可以量化评估的 PoC(Proof of Concept,概念验证)。
本教程将以一个常见的"企业知识库问答 Agent"为例,完整走一遍从需求分析到 PoC 落地的流程。你不需要有很深的算法背景,但需要理解 Agent 的组成、工具调用、评估方式和部署边界。
2. 需求分析:把一句话需求拆成可验证的目标
2.1 从业务问题开始,而不是从模型开始
很多 PoC 失败的原因,是工程师上来就选模型、搭框架,却没有定义清楚"做成什么样算成功"。建议先回答三个问题:
- 用户是谁? 是客服、销售、运维还是管理层?
- 用户当前怎么解决这个问题? 花多少时间、依赖多少人?
- Agent 解决后,能帮企业节省什么? 时间、人力成本还是差错率?
以"内部知识库问答"为例,第一版需求可能是:
- 内部员工询问制度、流程、产品资料;
- 目前需要翻 Wiki、问同事、搜邮件;
- 期望 Agent 能直接回答,并给出原文出处。
2.2 把目标量化
模糊的目标无法验证,建议在 PoC 阶段定义 2~3 个可量化指标:
| 目标 | 衡量方式 | 达标参考值 |
|---|---|---|
| 回答准确率 | 针对 30 条测试问题的正确率 | ≥ 80% |
| 可追溯性 | 答案是否带来源引用 | 100% 带引用 |
| 响应速度 | 端到端耗时 | ≤ 10 秒 |
FDE 经验:PoC 阶段不要追求完美,重点是证明"这条路能走通"。指标定高了,反而会让客户把 PoC 当生产系统要求。
3. 场景拆解与边界定义
3.1 确定 Agent 的能力边界
一个企业 Agent 通常不是"万能助手",而是围绕 1~2 个核心任务设计。我们的知识库 Agent 可以定义为:
- 能做:基于内部文档回答事实性问题、总结制度条款、定位原文;
- 暂不做:生成未经验证的结论、处理敏感数据、代替人工审批。
边界清晰后,后续的提示词、工具和数据准备都会更聚焦。
3.2 拆解处理流程
一个典型的知识库问答 Agent 由以下环节组成:
#mermaid-svg-AtX7QGuyM5QCdVuH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AtX7QGuyM5QCdVuH .error-icon{fill:#552222;}#mermaid-svg-AtX7QGuyM5QCdVuH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AtX7QGuyM5QCdVuH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AtX7QGuyM5QCdVuH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AtX7QGuyM5QCdVuH .marker.cross{stroke:#333333;}#mermaid-svg-AtX7QGuyM5QCdVuH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AtX7QGuyM5QCdVuH p{margin:0;}#mermaid-svg-AtX7QGuyM5QCdVuH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH .cluster-label text{fill:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH .cluster-label span{color:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH .cluster-label span p{background-color:transparent;}#mermaid-svg-AtX7QGuyM5QCdVuH .label text,#mermaid-svg-AtX7QGuyM5QCdVuH span{fill:#333;color:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH .node rect,#mermaid-svg-AtX7QGuyM5QCdVuH .node circle,#mermaid-svg-AtX7QGuyM5QCdVuH .node ellipse,#mermaid-svg-AtX7QGuyM5QCdVuH .node polygon,#mermaid-svg-AtX7QGuyM5QCdVuH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AtX7QGuyM5QCdVuH .rough-node .label text,#mermaid-svg-AtX7QGuyM5QCdVuH .node .label text,#mermaid-svg-AtX7QGuyM5QCdVuH .image-shape .label,#mermaid-svg-AtX7QGuyM5QCdVuH .icon-shape .label{text-anchor:middle;}#mermaid-svg-AtX7QGuyM5QCdVuH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AtX7QGuyM5QCdVuH .rough-node .label,#mermaid-svg-AtX7QGuyM5QCdVuH .node .label,#mermaid-svg-AtX7QGuyM5QCdVuH .image-shape .label,#mermaid-svg-AtX7QGuyM5QCdVuH .icon-shape .label{text-align:center;}#mermaid-svg-AtX7QGuyM5QCdVuH .node.clickable{cursor:pointer;}#mermaid-svg-AtX7QGuyM5QCdVuH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AtX7QGuyM5QCdVuH .arrowheadPath{fill:#333333;}#mermaid-svg-AtX7QGuyM5QCdVuH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AtX7QGuyM5QCdVuH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AtX7QGuyM5QCdVuH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AtX7QGuyM5QCdVuH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AtX7QGuyM5QCdVuH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AtX7QGuyM5QCdVuH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AtX7QGuyM5QCdVuH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AtX7QGuyM5QCdVuH .cluster text{fill:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH .cluster span{color:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AtX7QGuyM5QCdVuH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AtX7QGuyM5QCdVuH rect.text{fill:none;stroke-width:0;}#mermaid-svg-AtX7QGuyM5QCdVuH .icon-shape,#mermaid-svg-AtX7QGuyM5QCdVuH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AtX7QGuyM5QCdVuH .icon-shape p,#mermaid-svg-AtX7QGuyM5QCdVuH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AtX7QGuyM5QCdVuH .icon-shape .label rect,#mermaid-svg-AtX7QGuyM5QCdVuH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AtX7QGuyM5QCdVuH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AtX7QGuyM5QCdVuH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AtX7QGuyM5QCdVuH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
用户提问
问题理解与改写
检索知识库片段
是否召回到相关内容
基于片段生成答案
给出澄清或拒答
附上来源引用
返回最终回答
这里的关键不是"模型多强",而是检索质量决定上限,生成质量决定下限。如果相关知识根本没被找到,模型再强也无法给出正确答案。
4. 技术选型与架构设计
4.1 选型原则
PoC 阶段建议遵循:
- 优先云服务:减少本地部署和运维成本;
- 优先成熟框架:如 LangChain、LlamaIndex,避免重复造轮子;
- 组件可替换:检索库、向量库、模型接口尽量解耦。
示例技术栈:
- 大模型:OpenAI 兼容接口或企业内部模型网关;
- 向量库:FAISS / Chroma / 企业已有向量服务;
- 框架:LangChain;
- 数据侧:内部 Wiki 导出的 Markdown / PDF / 网页。
4.2 架构分层
#mermaid-svg-QN1QjdQX5elop2fU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QN1QjdQX5elop2fU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QN1QjdQX5elop2fU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QN1QjdQX5elop2fU .error-icon{fill:#552222;}#mermaid-svg-QN1QjdQX5elop2fU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QN1QjdQX5elop2fU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QN1QjdQX5elop2fU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QN1QjdQX5elop2fU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QN1QjdQX5elop2fU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QN1QjdQX5elop2fU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QN1QjdQX5elop2fU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QN1QjdQX5elop2fU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QN1QjdQX5elop2fU .marker.cross{stroke:#333333;}#mermaid-svg-QN1QjdQX5elop2fU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QN1QjdQX5elop2fU p{margin:0;}#mermaid-svg-QN1QjdQX5elop2fU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QN1QjdQX5elop2fU .cluster-label text{fill:#333;}#mermaid-svg-QN1QjdQX5elop2fU .cluster-label span{color:#333;}#mermaid-svg-QN1QjdQX5elop2fU .cluster-label span p{background-color:transparent;}#mermaid-svg-QN1QjdQX5elop2fU .label text,#mermaid-svg-QN1QjdQX5elop2fU span{fill:#333;color:#333;}#mermaid-svg-QN1QjdQX5elop2fU .node rect,#mermaid-svg-QN1QjdQX5elop2fU .node circle,#mermaid-svg-QN1QjdQX5elop2fU .node ellipse,#mermaid-svg-QN1QjdQX5elop2fU .node polygon,#mermaid-svg-QN1QjdQX5elop2fU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QN1QjdQX5elop2fU .rough-node .label text,#mermaid-svg-QN1QjdQX5elop2fU .node .label text,#mermaid-svg-QN1QjdQX5elop2fU .image-shape .label,#mermaid-svg-QN1QjdQX5elop2fU .icon-shape .label{text-anchor:middle;}#mermaid-svg-QN1QjdQX5elop2fU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QN1QjdQX5elop2fU .rough-node .label,#mermaid-svg-QN1QjdQX5elop2fU .node .label,#mermaid-svg-QN1QjdQX5elop2fU .image-shape .label,#mermaid-svg-QN1QjdQX5elop2fU .icon-shape .label{text-align:center;}#mermaid-svg-QN1QjdQX5elop2fU .node.clickable{cursor:pointer;}#mermaid-svg-QN1QjdQX5elop2fU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QN1QjdQX5elop2fU .arrowheadPath{fill:#333333;}#mermaid-svg-QN1QjdQX5elop2fU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QN1QjdQX5elop2fU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QN1QjdQX5elop2fU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QN1QjdQX5elop2fU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QN1QjdQX5elop2fU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QN1QjdQX5elop2fU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QN1QjdQX5elop2fU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QN1QjdQX5elop2fU .cluster text{fill:#333;}#mermaid-svg-QN1QjdQX5elop2fU .cluster span{color:#333;}#mermaid-svg-QN1QjdQX5elop2fU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QN1QjdQX5elop2fU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QN1QjdQX5elop2fU rect.text{fill:none;stroke-width:0;}#mermaid-svg-QN1QjdQX5elop2fU .icon-shape,#mermaid-svg-QN1QjdQX5elop2fU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QN1QjdQX5elop2fU .icon-shape p,#mermaid-svg-QN1QjdQX5elop2fU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QN1QjdQX5elop2fU .icon-shape .label rect,#mermaid-svg-QN1QjdQX5elop2fU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QN1QjdQX5elop2fU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QN1QjdQX5elop2fU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QN1QjdQX5elop2fU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据接入层
文档解析与清洗
离线索引层
切分与向量化
检索层
向量召回与重排
生成层
LLM 回答
应用层
API 与前端展示
这种分层的好处是:PoC 阶段可以快速替换某一层,例如先上传 50 个文档验证效果,再决定数据接入方案。
5. 核心实现:从数据准备到 Agent 编排
5.1 准备数据:文档切分很关键
企业内部文档往往篇幅长、格式杂。直接整篇塞给大模型不现实,必须切分。下面是一个可运行的切分示例:
python
from langchain_text_splitters import RecursiveCharacterTextSplitter
def load_and_split(file_path: str, chunk_size: int = 500, overlap: int = 50):
"""读取 Markdown 文件并按字符切分"""
with open(file_path, "r", encoding="utf-8") as f:
text = f.read()
splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=overlap,
separators=["\n## ", "\n### ", "\n", "。", " "],
)
chunks = splitter.split_text(text)
return chunks
chunks = load_and_split("data/员工手册.md")
print(f"共切分出 {len(chunks)} 个片段")
for i, chunk in enumerate(chunks[:3]):
print(f"--- 片段 {i + 1} ---")
print(chunk[:120])
FDE 经验 :切分大小需要根据文档类型调整。制度类文档建议保留标题层级,
overlap不要太小,否则会切断上下文。
5.2 构建向量索引
将切分后的片段向量化并存入本地向量库:
python
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
def build_vector_store(chunks, persist_dir: str = "./chroma_db"):
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = Chroma.from_texts(
texts=chunks,
embedding=embeddings,
persist_directory=persist_dir,
)
return vector_store
vector_store = build_vector_store(chunks)
print("向量索引构建完成")
生产环境中,向量库会换成企业已有的向量服务,但 PoC 阶段用 Chroma 足够验证效果。
5.3 编写检索问答链路
下面实现一个"检索 + 生成"的基础链路,并强制要求模型给出引用:
python
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
PROMPT_TEMPLATE = """你是一名企业知识库助手。请严格根据以下资料回答问题。
如果资料中没有相关信息,请直接回答"根据当前资料无法确认"。
资料内容:
{context}
用户问题:{question}
回答要求:
1. 使用简洁、专业的语言;
2. 必须列出答案对应的资料编号;
3. 不要编造资料中没有的内容。
回答:
"""
prompt = PromptTemplate(
template=PROMPT_TEMPLATE,
input_variables=["context", "question"],
)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_store.as_retriever(search_kwargs={"k": 4}),
chain_type_kwargs={"prompt": prompt},
return_source_documents=True,
)
result = qa_chain.invoke({"query": "员工的年假可以休多少天?"})
print("答案:", result["result"])
print("来源:", [doc.metadata.get("source", "未知") for doc in result["source_documents"]])
这段代码可以直接跑通最小 PoC。接下来要做的,是围绕真实业务问题不断调优。
6. 效果评估:用数据说话
6.1 准备测试集
PoC 必须给客户看评估结果。建议准备 30~50 条来自真实用户的测试问题,并为每条问题标注参考答案和预期来源。
python
test_cases = [
{
"question": "员工试用期是多久?",
"expected": "试用期不超过三个月",
},
{
"question": "年假可以跨年使用吗?",
"expected": "可以顺延至次年三月底",
},
{
"question": "差旅报销需要哪些材料?",
"expected": "发票、审批单、行程单",
},
]
6.2 计算基础指标
PoC 阶段可以先用"关键词覆盖率"做快速自动评估:
python
def keyword_hit(predicted: str, expected: str) -> bool:
"""判断预测结果是否覆盖参考答案关键词"""
keywords = [word for word in expected.replace(",", " ").split() if len(word) > 1]
hits = sum(1 for word in keywords if word in predicted)
return hits / max(len(keywords), 1) >= 0.5
hits = 0
for case in test_cases:
predicted = "试用期不超过三个月,具体以劳动合同为准"
if keyword_hit(predicted, case["expected"]):
hits += 1
print(f"关键词覆盖率:{hits}/{len(test_cases)} = {hits / len(test_cases):.0%}")
更严谨的评估可以引入 LLM-as-Judge(用大模型打分),或让业务专家人工抽检。PoC 汇报时,要有测试集、评估方法和得分,不能只给演示视频。
6.3 常见问题与调优方向
| 问题 | 可能原因 | 调优方向 |
|---|---|---|
| 答不对 | 没召回到相关片段 | 调整切分粒度、增加关键词混合检索 |
| 答不全 | 片段被截断 | 增加 overlap、改用父子片段 |
| 瞎编 | 提示词没约束 | 强化"资料中没有就拒答" |
| 引用错 | 片段编号混乱 | 在元数据中标注文档名和章节 |
7. PoC 交付与落地建议
7.1 PoC 交付物清单
一次合格的企业 Agent PoC,应该交付以下内容:
- 可演示的 Web 界面或 API 接口;
- 30~50 条测试集的评估报告;
- 架构图和实现说明;
- 已知限制与风险清单;
- 后续生产化的建议路线。
7.2 和客户沟通的注意事项
- 不要过度承诺:明确告知 PoC 使用的是公开模型或测试数据,生产环境需要替换;
- 强调数据安全:询问客户对数据出境、私有化部署的合规要求;
- 展示边界:主动演示 Agent 会"拒答"的情况,这反而能建立信任;
- 留下优化入口:说明后续如何接入更多文档、更多工具、人工反馈闭环。
7.3 从 PoC 走向生产
PoC 验证通过后,可以按以下路径演进:
#mermaid-svg-zUGqLQ4Wa6bFMkiR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .error-icon{fill:#552222;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .marker.cross{stroke:#333333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR p{margin:0;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .cluster-label text{fill:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .cluster-label span{color:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .cluster-label span p{background-color:transparent;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .label text,#mermaid-svg-zUGqLQ4Wa6bFMkiR span{fill:#333;color:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .node rect,#mermaid-svg-zUGqLQ4Wa6bFMkiR .node circle,#mermaid-svg-zUGqLQ4Wa6bFMkiR .node ellipse,#mermaid-svg-zUGqLQ4Wa6bFMkiR .node polygon,#mermaid-svg-zUGqLQ4Wa6bFMkiR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .rough-node .label text,#mermaid-svg-zUGqLQ4Wa6bFMkiR .node .label text,#mermaid-svg-zUGqLQ4Wa6bFMkiR .image-shape .label,#mermaid-svg-zUGqLQ4Wa6bFMkiR .icon-shape .label{text-anchor:middle;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .rough-node .label,#mermaid-svg-zUGqLQ4Wa6bFMkiR .node .label,#mermaid-svg-zUGqLQ4Wa6bFMkiR .image-shape .label,#mermaid-svg-zUGqLQ4Wa6bFMkiR .icon-shape .label{text-align:center;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .node.clickable{cursor:pointer;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .arrowheadPath{fill:#333333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zUGqLQ4Wa6bFMkiR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zUGqLQ4Wa6bFMkiR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zUGqLQ4Wa6bFMkiR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .cluster text{fill:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .cluster span{color:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zUGqLQ4Wa6bFMkiR rect.text{fill:none;stroke-width:0;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .icon-shape,#mermaid-svg-zUGqLQ4Wa6bFMkiR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .icon-shape p,#mermaid-svg-zUGqLQ4Wa6bFMkiR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .icon-shape .label rect,#mermaid-svg-zUGqLQ4Wa6bFMkiR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zUGqLQ4Wa6bFMkiR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zUGqLQ4Wa6bFMkiR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zUGqLQ4Wa6bFMkiR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PoC 验证
数据治理
权限与质量
工具扩展
审批/查询/工单
评估体系
回归测试与监控
私有化部署
与安全合规
生产上线
8. 总结与学习资源
本教程以一个知识库问答 Agent 为例,走完了从需求分析、场景拆解、技术选型、代码实现到效果评估的完整 PoC 流程。
对 FDE 来说,最重要的能力不是写出最复杂的 Agent,而是:
- 把模糊需求转成可验证目标;
- 快速搭出最小可用版本;
- 用数据向客户证明价值;
- 清楚知道哪些问题需要产品化解决。
推荐学习资源
- LangChain 官方文档:了解 RetrievalQA、Agent 与工具调用;
- LlamaIndex:适合复杂知识库索引场景;
- 《Building LLM Apps》等 LLM 工程实践资料;
- 企业内网的 RAG 和 Agent 实践案例。
下一步练习
- 准备你自己的 20 条测试问题,手动检查检索结果;
- 把文档切分大小从 500 调到 300 和 800,对比准确率;
- 给你的 Agent 增加"拒答"逻辑,并展示给非技术同事验证体验。