
最近两年AI 领域始终存在一个很有意思的错位一边是大模型的能力每隔几个月就刷新一次认知一边是企业里真正跑在生产环境里的 AI 功能少得可怜。做 AI 产品的人经常被问到同一个问题“你们是不是在追热点大模型已经这么强了我们到底还能做什么”同一个行业里有人觉得 AI 热得过头了也有人觉得 AI 市场被严重低估了。后一种观点里比较有代表性的一位是风险投资公司 Benchmark 合伙人 Eric Vishria。他在相关讨论中表达的核心判断是AI 的商业化进度、应用覆盖范围以及它改变工作流的速度可能比市场上大多数人预期的都要大。换句话说不是 AI 没机会而是市场把 AI 的机会看得太小了。你可能会想投资人的判断和我一个写代码的有什么关系关系很大。如果 AI 真的被低估那意味着未来三到五年企业会需要大量能把模型变成产品的工程师。市场低估的并不是“ChatGPT 式聊天”而是“用 AI 重构现有工作流”这件事本身。对技术人来说这是一个清晰的方向信号。这篇文章会做三件事先拆解“AI 被低估”背后的技术与投资逻辑再从工程视角分析 AI 应用开发真正的瓶颈最后用一个最小但完整的企业知识库问答项目把 RAG 这条技术路径完整跑通包括环境、代码、验证、排查和最佳实践。读完这篇文章你不仅能理解“AI 市场被低估”对开发者意味着什么而且能立刻上手搭建一个可复用的 AI 应用原型。1. 这篇文章真正要解决的问题如果只把“AI 市场被低估了”当成一个宏观话题听完就过去了那对技术人几乎没有价值。这篇文章从一开始就有一个明确的立场它不是一个投资分析问题而是一个工程机会问题。技术人员面对这种判断时最容易犯的错误是把它解读成“赶紧去学大模型算法”。但真正需要关注的是另一个侧面如果 AI 真的会进入每一个业务流程那么软件的工程量会有多大这个问题的答案才直接决定技术选型、岗位需求和职业发展方向。目前大多数团队的现状是Demo 做得很快上线上得很慢。原因也很简单调用一个模型接口只需要几分钟但要把模型、数据、评测、监控、权限、交互这些环节组合成稳定服务工作量会大一个数量级。当前阶段多数团队卡在“能用”和“能上线”之间。而这条鸿沟恰恰是开发者的机会所在。因此本文不打算花大量篇幅复述大模型的原理也不会劝你训练自己的基座模型。我想解决的是四件事说清楚 Eric Vishria 代表的投资判断为什么值得关注但不神化它把“被低估”翻译成三个和技术直接相关的核心判断分析 AI 应用开发中真正稀缺的能力以及开发者该从哪里切入带你从零跑通一个基于 RAG 的企业知识库问答项目把判断落到可操作的技术动作上。如果你正在思考“要不要在项目里引入 AI”或者已经在做 AI 应用但觉得效果不稳定这篇文章会比较适合你。2. 谁在说“AI 被低估”Eric Vishria 与 Benchmark 的视角在看待一个观点之前先了解说话人的位置是有必要的。Eric Vishria 是 Benchmark 的普通合伙人。Benchmark 是硅谷老牌风险投资公司以长期主义和小规模团队著称历史上曾经投资过 Workday、Uber 等公司。Eric 本人则有深厚的技术和产品背景早期创业做过视频技术公司 Ooyala后来担任多家技术公司的高管。因此他对企业软件和基础设施的理解比一般只看财务模型的投资人更技术化。在技术圈里互联网行业的人习惯于把 VC 的话解读成“为了推自己的项目”这种怀疑有一定道理但不应该因此忽略背后的推导逻辑。成熟的投资人尤其是做早期风险投资的人判断技术浪潮通常不是看短期热度而是看三条曲线。第一条是需求曲线AI 是否在从“开发者玩具”变成“企业必需品”第二条是成本曲线单位智能的成本是在上涨还是持续下降第三条是工作流迁移曲线企业引入 AI 后是否会不可逆地改变原来的工作方式Eric 这类投资人之所以认为 AI 市场被低估本质上是因为这三条曲线都在朝同一个方向移动。需求侧AI 已经从聊天进入了代码生成、文档处理、客服、运维、销售、法律和医疗等场景成本侧模型推理成本在过去几年快速下降小模型和量化部署让 AI 功能不再昂贵工作流侧一旦团队适应了 AI 辅助的流程就很难回到过去。当然我并不是说投资人的每个判断都会应验也不是让大家把这句话当成技术决策的充分依据。作为工程师我们要做的是把握其中可以被验证、被拆解的部分。AI 市场是否被高估或低估短期内没有人能打包票但“AI 应用的工程化需求将持续增长”这是可以从技术趋势和历史经验中得出的一致判断。3. 被低估的到底是什么三个技术判断“AI 市场被低估”这句话说出来很容易但如果不拆开看很容易被理解成一句正确的废话。我认为这句话背后真正有价值的是以下三个技术判断。3.1 被低估的不是聊天而是工作流重构绝大多数人接触 AI是从聊天机器人开始的。但聊天只是入口AI 真正高价值的部分是把大模型、Agent、工具调用接入现有业务系统。比如 Java 生态中出现了 Spring AI 这类框架就是把模型能力以 Spring 的方式注入到企业应用里Python 生态里有大量工具处理文档、数据库和运维平台前端开发工具链也在快速接入 AI。这个趋势意味着AI 不只是少数算法工程师的玩具而是每一位应用开发者的基础设施。一旦 AI 被嵌入到业务流程中它的价值就不再是“回答一个有趣的问题”而是直接参与生产决策、代码审查、故障排查、客服处理、内容生成等高频操作。工作流一旦被重构回退成本会变得很高这种不可逆性会推动需求曲线持续向上而不是一次性的项目采购。3.2 被低估的是推理成本下降的速度很多人判断 AI 是否有规模化价值时用的还是“大模型调用很贵”的旧标尺。事实上模型量化、蒸馏、MoE 架构、专用推理芯片、缓存和本地部署方案的发展正在让单位智能的成本快速下降。成本下降带来的不只是预算节省而是打开了全新的场景边界。过去让一个 AI 去分析全部日志、生成全部测试用例、审查每一段代码在成本上不划算当成本降到足够低时企业会开始尝试“让 AI 先跑一遍”。这种“先跑一遍”的习惯一旦建立就会产生大量新的工程需求。这也是为什么我始终认为AI 应用开发的前景比很多人想象的更大关键不在于模型能力而在于成本结构已经到了爆发的临界点。3.3 被低估的是 AI 工程实践的复杂度第三个判断可能是对开发者最重要的。模型能力增长很快但工程能力的成熟度远远落后于模型。我经常看到团队把模型选型做得很好却在数据清洗、切块策略、Prompt 评测、链路追踪、效果回归这些环节上反复踩坑。市场低估的正是 AI 工程实践这个环节的复杂度和价值。许多团队以为“接入模型 API 就算完成 AI 功能”结果一上线就发现回答不可控、无法解释、不能评测、出错后难回滚。这些问题需要一个完整的技术栈来解决而不是靠换一个更强模型就能绕过。下面的表总结了常见认知与工程现实的差异常见认知工程现实AI 应用 调用大模型 API生产级应用需要数据管道、链路追踪、权限、评测、灰度模型能力强回答质量自然高回答质量取决于检索、上下文、Prompt、评测闭环AI 开发门槛非常低生产级门槛很高调试与回归成本被严重低估只要选对模型就成功数据治理、版本管理和回滚机制同样决定成败这三个判断放在一起结论就很清晰了AI 被低估最终体现在应用层的工程量被低估。而这正是普通开发者和企业级团队最值得投入的方向。4. 从市场回到工程AI 应用开发最缺的是什么既然 AI 市场的工程量被低估那问题就来了当前 AI 应用开发到底最缺什么先给出一个明确判断缺的不是模型而是“高质量交付 AI 系统的工程能力”。很多人以为 AI 应用开发就是“调 Prompt 再加个接口”实际上真正像样的 AI 应用开发是一个完整软件工程问题。一个生产级 AI 应用至少要经历这样的链路需求定义、数据准备、模型选择、实验评估、部署上线、监控反馈。在传统软件开发中前几步已经相对成熟但在 AI 应用里数据准备和实验评估的复杂度会被放大。比如一个企业内部知识库问答项目你首先要想清楚文档格式怎么处理质量如何保证切块多大合适检索结果如何排序模型回答如何评测知识更新后索引怎么同步回答错了如何追溯这些问题没有一件可以靠“模型能力”自动解决。它们需要的恰恰是 AI 工程实践评测数据集建设、Prompt 版本管理、RAG 检索调优、Agent 工具编排、模型部署与降级方案。这些能力是模型公司不会替你做的也是应用开发者的核心竞争力。另一个被低估的特点是AI 编程工具的普及并没有让高级工程师贬值反而让资深工程师的价值更突出。因为 AI 生成代码之后审查、调试、边界确认、架构把控都需要有经验的人来完成。同样的 AI 编程提示词新手和专家写出来的结果完全不同。也就是说AI 市场被低估意味着“能把 AI 落到生产环境”的工程师会更稀缺。所以如果你想切入这个方向最稳的起点不是去研究模型训练而是先掌握 AI 应用的工程链路。RAG 因为是结合了数据、检索、生成、评测的典型场景几乎可以看作 AI 应用开发的第一课。5. AI 应用开发第一课RAG 的概念与边界5.1 为什么需要 RAG大模型会“胡说”大模型的知识来自训练数据而训练数据有截止时间也不可能覆盖企业内部资料。直接让模型回答一个企业内部的、训练时没见过的问题它要么答不上来要么会一本正经地编一个答案。这种现象在行业里叫“模型幻觉”是 AI 落地中最常见也最危险的问题之一。5.2 RAG 是什么RAGRetrieval-Augmented Generation检索增强生成的整体思路非常直观先从一个知识库中检索出和问题最相关的资料再把这些资料连同问题一起交给大模型让它基于这些资料来回答。把它理解成一场“开卷考试”就好理解得多。闭卷模式下模型只能靠记忆作答遇到没见过的内容就会编开卷模式下我们把相关资料放在桌面上约束模型“根据桌面上的资料答题”既能回答得更准确又能在出错时追溯到来源。一个基础的 RAG 流程包括五个关键环节加载文档把企业内部资料读入系统分块把长文本切成合适长度的片段同时保留一定重叠向量化用嵌入模型把每个片段转换成向量向量存储把向量写入向量数据库例如 Chroma、Milvus、Qdrant检索与生成用户提问时先检索相关片段再构造 Prompt 交给大模型生成答案。在这个过程中最难的不是调用模型而是切块策略、检索质量、Prompt 设计和评测闭环。5.3 RAG 和长上下文窗口怎么选现在很多模型支持很长的上下文窗口有人会问既然一次能塞几百万字为什么还要做 RAG这是一个很实际的问题。长上下文适合处理单份超长文档比如完整的代码仓库或整本报告但它的成本会随长度快速上升而且当资料特别长时模型对中间内容的关注度会下降容易出现“信息被淹没”的问题。RAG 则是先把最相关的片段挑出来只把这些片段送进模型成本更低还更容易保证来源可追溯。维度RAG长上下文直接输入调用成本只送检索后的少量片段成本低全量输入成本随长度增长准确性来源依赖切块和检索质量依赖模型对长文的注意力更新方式只更新索引库即可不需要改模型需要替换上下文容易丢失信息可追溯性可以返回来源文档追溯比较困难适合场景企业知识库、FAQ、客服、运维问答单份超长文档分析、代码仓理解5.4 什么时候不要用 RAGRAG 不是万能的。如果业务问题需要跨多个文档进行多步推理比如“根据近三个月所有项目的报表找到成本最高的三个项目并分析原因”单纯 RAG 可能不够需要结合 Agent 做多轮检索、工具调用和中间计算。如果问题主要涉及结构化表格的大量计算应该由数据库或代码解释器完成而不是让模型去读纯文本。理解边界才能选对技术方案。6. 环境准备与前置条件在开始项目之前先把环境准备好。本文示例采用 Python 3.9 以上的版本使用到的核心工具包括OpenAI 兼容的模型服务可以是云厂商提供的 API也可以是本地部署 AI 模型。只要服务支持 OpenAI 协议代码逻辑基本不用改。Chroma轻量级向量数据库适合做本地原型验证。SentenceTransformer负责把文本转换成向量示例中使用 BAAI/bge-small-zh-v1.5这是一个在中文场景下常用的小型嵌入模型。Python 依赖管理直接使用 pip 安装所需包。项目目录结构如下rag-demo/ ├── docs/ │ └── sample.txt ├── .env ├── requirements.txt └── rag_demo.py先创建requirements.txt# requirements.txt openai chromadb python-dotenv sentence-transformers版本请以实际项目安装结果为准本文重点演示完整思路。建议用一个干净的环境虚拟环境来安装避免和系统依赖冲突。创建.env文件用于保存模型服务的访问配置# .env # 请替换成你自己的 API Key 和接口地址 OPENAI_API_KEYsk-your-key-change-me OPENAI_BASE_URLhttps://your-openai-compatible-endpoint/v1 LLM_MODELyour-model-name要注意这里的关键是配置一个“OpenAI 兼容”的服务端点。国内云厂商的模型服务、企业内网的模型网关、本地部署的模型服务只要协议兼容都可以直接替换。不要把你的真实密钥提交到代码仓库这一点在生产环境尤其重要。7. 完整示例用 RAG 搭建一个本地知识库问答工具接下来我们用一个最小可运行的项目把 RAG 完整流程跑通。为了让示例贴近真实场景我准备了一份企业运维手册的片段作为知识库内容。7.1 准备测试文档创建docs/sample.txt内容如下本手册用于帮助运维团队快速处理服务器负载异常。 1. 当 CPU 使用率持续 5 分钟超过 80% 时应先查看进程列表确定占用最高的进程。 2. 如果进程属于业务应用优先考虑临时扩容同时检查应用日志中的慢查询。 3. 如果进程属于日志处理任务观察任务队列积压情况必要时降低日志处理并发。 4. 禁止直接 kill 生产进程必须先确认进程归属和影响范围。 5. 操作完成后需要在值班系统中登记变更时间和影响说明。在实际项目中这份文档可以替换为产品说明书、FAQ、内部制度、法律条款等任意知识源。7.2 编写 RAG 核心代码创建rag_demo.py# rag_demo.py import os from typing import List from dotenv import load_dotenv from openai import OpenAI import chromadb from chromadb.utils import embedding_functions load_dotenv() # 使用 OpenAI 兼容协议访问模型服务 llm_client OpenAI( api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL), ) MODEL_NAME os.getenv(LLM_MODEL, your-model-name) def load_text(path: str) - str: 读取文本文件 with open(path, r, encodingutf-8) as f: return f.read() def split_text(text: str, chunk_size: int 300, overlap: int 50) - List[str]: 简单的分块函数按段落合并超过 chunk_size 就切分。 生产环境建议使用语义切分或递归字符切分器。 paragraphs [p.strip() for p in text.split(\n) if p.strip()] chunks [] current for para in paragraphs: if len(current) len(para) chunk_size and current: chunks.append(current) current para else: current para if current: chunks.append(current) return chunks def ingest(collection, docs_dir: str): 把目录下的所有 txt 文档写入向量库 for file_name in os.listdir(docs_dir): if not file_name.endswith(.txt): continue path os.path.join(docs_dir, file_name) text load_text(path) chunks split_text(text) ids [f{file_name}-{i} for i in range(len(chunks))] collection.add( documentschunks, idsids, metadatas[{source: file_name} for _ in chunks], ) print(f[ingest] {file_name}: {len(chunks)} chunks) def ask(collection, question: str, top_k: int 3) - str: 检索相关片段构造 Prompt 并让大模型生成答案 results collection.query(query_texts[question], n_resultstop_k) contexts results[documents][0] # 把检索到的资料拼进 Prompt并明确要求模型不要编造 context \n\n.join(contexts) prompt f根据以下资料回答问题。 资料 {context} 问题{question} 要求 1. 如果资料中没有答案直接说明“资料中未找到相关内容”不要编造。 2. 回答时尽量引用资料中的信息并说明来自哪个文件。 resp llm_client.chat.completions.create( modelMODEL_NAME, messages[{role: user, content: prompt}], temperature0.3, ) return resp.choices[0].message.content if __name__ __main__: # 初始化 Chroma 向量库 chroma_client chromadb.PersistentClient(path./chroma_data) embedding_func embedding_functions.SentenceTransformerEmbeddingFunction( model_nameBAAI/bge-small-zh-v1.5 ) collection chroma_client.get_or_create_collection( nameknowledge_base, embedding_functionembedding_func, metadata{hnsw:space: cosine}, ) # 写入本地文档 ingest(collection, ./docs) # 交互式问答 while True: question input(请输入问题输入 exit 退出).strip() if question.lower() exit: break if not question: continue answer ask(collection, question) print(\n答案) print(answer) print(- * 40)这里有几个关键点值得展开。第一split_text是 RAG 的起点。如果文档被切成整段整段的大块检索时容易把无关内容一起带进来如果切得太碎又会丢失上下文。示例中的overlap参数是为了让相邻片段之间有部分重叠避免关键句落在切分边界上。第二collection.add会把文本、ID 和来源信息一起写入向量库。后续检索返回的results会包含文档片段我们可以直接拼装成上下文。第三Prompt 中明确要求模型在资料不足时不要编造。这是缓解模型幻觉最基础、也最有效的一招。生产环境还可以进一步要求模型输出引用来源甚至用 JSON 格式返回结构化结果。7.3 运行与验证依次执行下面的命令# 1. 安装依赖 pip install -r requirements.txt # 2. 准备目录和测试文档 mkdir -p docs # 把上面的文档内容保存为 docs/sample.txt # 3. 运行脚本 python rag_demo.py首次运行SentenceTransformerEmbeddingFunction时需要下载中文嵌入模型请保持网络连接可访问模型源或者提前下载好模型并配置缓存目录。启动后如果看到类似下面的输出说明入库成功[ingest] sample.txt: 5 chunks 请输入问题输入 exit 退出输入一个关于知识库内容的问题例如生产进程 CPU 过高时可以直接 kill 吗预期输出接近下面的内容实际文本会因模型和 Prompt 不同而略有差异答案 根据运维手册的信息不能直接 kill 生产进程。应先通过进程列表确定占用最高的进程确认进程归属和影响范围必要时临时扩容或降低日志并发操作后需要在值班系统登记变更说明。判断运行成功的标准有三个一是没有报错二是问题能在本地知识库中找到相关片段三是生成的回答内容符合知识库原文没有明显编造。如果回答不理想优先检查检索结果是否相关可以临时把检索到的片段打印出来确认top_k是否太小、切块是否合理然后再调整 Prompt 和模型温度参数。8. 常见问题与排查思路在跑 RAG 项目时下面几个问题出现频率最高这里整理成一张排查表方便对照处理。问题现象可能原因排查方式解决方案运行时提示嵌入模型下载失败网络环境无法访问模型源或模型缓存缺失检查报错信息中的 URL确认下载失败位置提前下载模型并设置缓存目录或更换可访问的模型