第七章

未来:AI 与大模型时代

第十二层 · Prompt/Agent/MCP/RAG 给书店造一个会“懂人话”的 AI 荐书助手

一、王姐的新需求:"给我一个 AI 荐书助手"

"王姐说,顾客总问'推荐本好书',店员推荐来推荐去就那几本。"老周坐在仓库里,面前摆着两台电脑,"所以咱们要做一个 AI 荐书助手:顾客用大白话提问,它给出靠谱的推荐。"

小陈跃跃欲试:"师傅,这个我会!调大模型 API,把书单喂给它……"

"慢着。"老周抬手,"你刚才那句话里,藏着一个大坑。你说'把书单喂给它'——怎么喂?5 万本书全塞进提示词?塞得下吗?塞得下它还记得住吗?"

小陈沉默了。老周笑了:"所以这一章,我带你认识编程语言家族树的树冠——大模型时代的四个新'概念':Prompt、RAG、Agent、MCP。它们不是编程语言,但它们是人类'偷懒 + 防错'的最新产物。"


二、Prompt:自然语言即代码

"先来最简单的。"老周打开一个网页,里面是一个大模型对话框,"这就是 Prompt(提示词)——用自然语言'写程序',让模型执行。"

你是云间书店的资深荐书员。顾客会告诉你他的喜好,
你根据喜好推荐 3 本书,每本给出推荐理由。
回答要亲切,控制在 80 字以内。

顾客说:我喜欢看烧脑的科幻,最好是硬核物理那种。

模型回答:

推荐《三体》!大刘的硬核科幻,黑暗森林法则直接烧穿脑洞;
还有《球状闪电》,量子物理的浪漫与残酷并存;
想挑战的话试试《你一生的故事》,语言学×物理学,回味无穷。

"看到了吗?你是云间书店的资深荐书员——这是给它设定角色;'推荐 3 本、80 字以内'——这是约束输出Prompt 就是写给大模型的'代码',只不过语法是自然语言。"

"但它有个致命问题。"老周说,"我让模型推荐《三体》——它'知道'《三体》,是因为这本书写进了它的训练数据。可云间书店自己进的那批小众书、新书、本地绝版书,模型一本都不知道。它一开口就露馅。"

小陈抢答:"所以得把我们自己的书单给它!"

"对。但怎么给?这就是 RAG。"


三、RAG:给模型插上"外挂知识"

老周画了一张图:

顾客提问:"推荐一本讲宋朝历史的书"
        │
        ▼
┌─────────────────┐      ┌──────────────────┐
│  向量化 + 检索    │─────▶│ 云间书店本地书库   │
│(把提问变成向量, │      │ (5万本书的摘要    │
│  找出最相关的     │      │   已经向量化存好)  │
│  3~5 本书摘要)   │      └──────────────────┘
└─────────────────┘
        │ 把检索到的书摘要拼进提示词
        ▼
┌─────────────────┐
│  大模型:结合    │
│  "上下文"生成    │──────▶ 推荐结果
│  个性化回答      │
└─────────────────┘

"这叫 RAG(Retrieval-Augmented Generation,检索增强生成)。"老周说,"核心思路一句话:模型不知道的,不让它瞎编,先从我们自己的知识库里'检索'出来,拼进提示词再让它回答。"

# RAG 的极简实现
def recommend(question):
    # 1. 把顾客问题转成向量,在本地书库检索最相关的书
    top_books = vector_search(question, limit=3)   # 找出最相关的 3 本书

    # 2. 把检索结果拼成"上下文",和问题一起交给模型
    context = "\n".join(f"《{b.title}》{b.summary}" for b in top_books)
    prompt = f"""
    基于以下云间书店的书库信息回答问题:
    {context}

    顾客问题:{question}
    请推荐并说明理由。
    """
    return call_llm(prompt)   # 3. 模型基于"真实知识"回答,不会瞎编

"注意关键点:模型还是那个模型,没变;变的是每次提问时'喂'给它的上下文。 书库更新了,检索结果就更新,回答自然更新——不需要重新训练模型。 这就是 RAG 的意义:把'私有知识'低成本地接进大模型。"

小陈眼睛亮了:"就像……给一个什么都懂的专家,配一个只有我们有的资料库,他每次回答前先查资料?"

"对,这就是 RAG。"


四、Agent:让 AI"自己动手干活"

荐书助手上线两周,王姐又提需求了:"光荐书不够,能不能让它在库存不足的时候,自己提醒采购、自动生成补货单?"

老周转头看小陈:"这个需求,光靠'问答'做不到了。它要求 AI 不再只是'说话',还要'动手'——查库存、算缺货、生成采购单。这就从'对话模型'升级成了 Agent(智能体)。"

"Agent 的定义:自主规划 + 工具调用。 它不再是一次性回答,而是一个'能自己思考步骤、一步步调用工具完成任务'的程序。"

# 一个补货 Agent 的伪代码
class RestockAgent:
    def run(self, task):
        # ① 规划:把任务拆成步骤
        plan = self.llm.plan(task)          # "1.查库存 2.算缺货 3.生成采购单"

        # ② 执行:每个步骤可能需要调用工具
        for step in plan:
            if step == "查库存":
                data = query_database("SELECT ...")      # 工具1:查数据库
            elif step == "算缺货":
                shortage = compute_shortage(data)       # 工具2:本地计算
            elif step == "生成采购单":
                create_purchase_order(shortage)         # 工具3:写采购单

        # ③ 反思:检查结果对不对,不对就重试
        return self.llm.verify(result)

"你看,Agent 的骨架还是我们第一章到第六章学的那些东西:查数据库是 SQL,算缺货是循环和函数,生成采购单是调用 API——只是现在'控制流'不是我们手写的 if/for,而是模型根据自然语言任务,动态规划出来的。"

"那'自主规划 + 工具调用',听起来很自由……它会不会乱来?"小陈有点担心。

"问得好!所以 Agent 的工程核心是安全边界:给它哪些工具权限、哪些操作要人工确认、最多重试几次。这跟我们平时给代码设权限是一个道理——能力越大,越要管好边界。"


五、MCP:让工具"即插即用"

"最后一个概念,也是云间书店最近才用上的。"老周说,"你发现没有,Agent 要调工具,每个工具都得写一堆对接代码——查数据库写一段,发邮件写一段,调库存系统写一段。而且每换一个模型,对接代码可能又要重写。"

"能不能定一个统一标准:任何 AI 都能用同一套协议,接入任何工具?"

"能。"老周在屏幕上敲下三个字母:MCP(Model Context Protocol,模型上下文协议)

"MCP 就是工具连接协议——给'AI 调用工具'定一个通用的'插座标准'。工具方按这个标准提供'插头',AI 按这个标准'插上就能用':"

┌──────────────┐      MCP 协议      ┌─────────────────┐
│  AI 应用      │◀──────────────────▶│  MCP 服务器       │
│  (Agent)      │   统一接口/标准     │  ├─ 查询库存工具    │
│              │                    │  ├─ 生成采购单工具  │
│              │                    │  ├─ 发送邮件工具    │
│              │                    │  └─ 查快递工具      │
└──────────────┘                    └─────────────────┘
       ▲                                    ▲
       └── 换任何 AI 都能接                  └── 加任何工具都即插即用

"有了 MCP,云间书店的荐书 Agent 想调用'库存系统''快递查询''邮件通知',不需要每家写一套对接代码——工具方实现一次 MCP 标准,所有兼容的 AI 都能直接调用。这是'人类偷懒'的最新巅峰:连'对接'都不想重复写了。"


六、章末:树冠长出来了

老周把整张家族树补上了最后一行,然后退后两步,和小陈一起看着它:

第十二层:AI / 大模型时代(2020s+)
纯文本
程序
├── Prompt(自然语言即代码)
├── Agent(自主规划 + 工具调用)
├── MCP(工具连接协议)
└── RAG(知识增强生成)

"小陈,你看这棵树。"老周的声音慢下来,"从最底下那卷纸带,到最顶上这棵树的树冠——每一步,都是因为'人'遇到了一个麻烦,然后偷了个懒。"

"机器码记不住?发明助记符。地址记不住?发明变量。代码重复?发明函数。数据散乱?发明结构体。逻辑重复?发明类。类型太多?发明泛型。内存会泄漏?发明 GC。错误会静默?发明异常。并发会撞车?发明锁和异步。需求追着代码跑?发明元编程和 DSL。最后,连'人写代码'都嫌累了——于是我们发明了 Prompt,让机器听懂人话;发明了 RAG,让它用上私有知识;发明了 Agent,让它自己动手;发明了 MCP,让工具即插即用。"

小陈看着那棵树,沉默了很久:"师傅……所以这棵树其实不是在讲'编程语言',是在讲'人类是怎么一步步解放自己的'。"

老周笑了:"明天出师考试,就考你这句话。"

✌ 语言