[Begin]AI Learn Data Day 0

BeginAI Learn Data Day 0

最近一直在学 AI 全栈开发。关于全栈,略懂一二;关于 AI,则完全是个新手。 说到底我还没学完全栈,后端的内容比如 Redis 根本没学,只知道是个什么东西,教学视频太长看不下去。然后转到 AI 这边,或许因为是新方向的缘故,网上连一篇成体系的 AI 教程都很难找到。只能自己硬着头皮,一点一点地学。

说回正题,既然找不到成体系的教程,那我就自己写一写,作为学习记录。

这里我们采用自顶而下的学习方式。
原帖地址:https://www.cnblogs.com/Reisentyan/p/20312914

需要学习的东西

使用 AI,相信大部分人都会,毕竟是每天都在用的工具。但要把它融入开发,就我目前的进度,大概需要学习如下内容。

  • AI 对话的原理
  • AI 工作流平台(如 Dify)
  • Skill(技能调用)
  • MCP(模型上下文协议)
  • RAG(检索增强生成)
  • AI 进阶工作流(如 LangGraph)

更多的我就没学了

核心模块 核心作用 / 原理解释
对话原理 你必须知道一次 AI 对话底层究竟发生了什么(上下文机制与 Token 消耗)。
工作流平台 用于可视化编排工作流,限制 AI 的自由发挥,让其按预定逻辑产出。
Skill 赋予大模型调用外部单一工具(如代码计算、查天气)的能力。
MCP 提供全局标准化的外部能力接入协议,让 AI 深入操作系统或企业级私有系统进行复杂交互。
RAG 外挂知识库,通过向量检索让 AI 基于海量私有数据进行精准回答,避免幻觉并降低 Token 成本。
LangGraph 构建复杂的、支持多智能体协作与循环图状逻辑的底层代码框架。

学习这些内容需要扎实的编程基础。就拿 Skill 来说,你必须熟悉 Python,否则连环境都配不好;用 MCP,你需要懂网络通信、至少得有一台云服务器,还得会点 Linux 运维;用 RAG,更少不了数据结构、数据库(如 PostgreSQL)和 Docker 容器化部署的知识。

ai全栈的门槛很高,当然,使用Agent可以完成你的目标。但是这完全没有意义。Agent又不可能替你坐牢,出事之后自负后果。

以上。希望大家学习ai全栈开发之前,先学全栈。

对话的原理

一次对话的原理其实很简单:把文本信息发给模型,然后模型返回文本数据。

但大模型本身是没有记忆的,为了让它"记住"之前的聊天内容,唯一的解决办法就是:把历史对话记录打包,连同新问题一起发过去。 这听起来好像有点傻逼,但极其有效,目前也基本只有这一种主流做法。

这样,引出一个问题,token 消耗会很大。我们的目标是又快又好又便宜 ,于是,优化是必要的。

ai工作流平台

为什么我用 Dify?因为我目前只会用 Dify(笑)。这个平台得用**,并且前端写的很垃圾。

不过是免费的,而且很好用,于是推荐这个了。

你需要有某个模型的api,这里推荐dpsk,因为便宜好用还快。

新手挑战:尝试自己做一个"思考型"工作流。

  1. 获取用户输入。
  2. 并行调用两次大模型,给出两种不同的解决方案。
  3. 将两种方案汇总给第三个大模型节点,让它分析利弊并得出最优解。
  4. 将最终结果输出给用户。

写完这个流程,你就会深刻理解:最好的工作流,就是通过限制和拆解任务,让 AI 在每个节点只做最擅长的小事,从而达到"又快又好又便宜"的目标。

skill

让模型调用工具。使用Python,因为又简单又方便。

Skill 的本质: 它是一种高内聚、强耦合的轻量级扩展。我们将外部服务的 API 封装好,告诉大模型:"我这里有个计算器,你需要的时候告诉我"。

这里给出一段基本的调用代码:

py 复制代码
import json
import math
from openai import OpenAI

# ================= 1. 定义本地 Skill =================
def calculate_gcd(a: int, b: int) -> int:
    """这是我们本地的 Skill,用于计算最大公约数"""
    return math.gcd(a, b)


# ================= 2. 配置 DeepSeek =================
client = OpenAI(
    api_key="sk-5426a5dbb29e4a6a888c5966c1f4208c",  # 【请在这里填入你的API KEY】
    base_url="https://api.deepseek.com"       # DeepSeek的官方接口
)


# ================= 3. 告诉模型有这个 Skill =================
# 这是标准的 JSON Schema 格式,用来向 AI 描述工具长什么样
tools = [{
    "type": "function",
    "function": {
        "name": "calculate_gcd",
        "description": "计算两个整数的最大公约数 (GCD)",
        "parameters": {
            "type": "object",
            "properties": {
                "a": {"type": "integer", "description": "第一个整数"},
                "b": {"type": "integer", "description": "第二个整数"}
            },
            "required": ["a", "b"]
        }
    }
}]


# ================= 4. 开始演示流程 =================
print("🧑 用户提问: 帮我算一下 11451400000 和 191981000000 的最大公约数是多少?\n")

# 把问题发给 DeepSeek,并附带工具列表
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "帮我算一下 11451400000 和 191981000000 的最大公约数是多少?"}],
    tools=tools
)

# 获取 DeepSeek 的回复
message = response.choices[0].message

# 判断 AI 是否决定调用工具 (Skill)
if message.tool_calls:
    tool_call = message.tool_calls[0]
    
    # AI 告诉我们需要调用的函数名和解析出的参数
    func_name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)  
    
    print(f"🤖 AI 决定调用 Skill: {func_name}")
    print(f"📥 AI 自动提取的参数: a={args['a']}, b={args['b']}")
    
    # 触发真正的本地函数
    if func_name == "calculate_gcd":
        result = calculate_gcd(args['a'], args['b'])
        print(f"✅ 本地 Skill 执行完毕,最终 GCD 结果为: {result}")
else:
    print("🤖 AI 没有调用 Skill,直接回答了:", message.content)

模型具有逻辑判断能力,它能根据用户输入的内容,自行决定提取参数并调用你写好的函数。

如果不用skill。那你只能让模型给你算一卦了。

有了工具库,当本地代码计算出准确结果后,模型就能把这个精确的数字包装在自然语言里反馈给用户。

MCP

MCP(Model Context Protocol)和 Skill 有着本质的系统级差异。

  • Skill 就像是为你当前写的代码专门定制的非标准零件,直接嵌入在当前环境里。
  • MCP 则是行业标准的通用底层协议(C/S 架构)。

它的工作原理是这样的:AI 会获取 MCP 服务器 上的可用技能列表 ,并将它们放进当前对话上下文 中。当模型需要时,就会自主发起调用 。这种方式下,诸如递归调用图状调用 等复杂操作会开启新的通信流程 ,虽然会消耗更多的 Token,但它能完成极度复杂的系统级任务,扩展性和自由度远超简单的 Skill。

这里同样展示一段最基本的mcp服务器代码:

py 复制代码
import math
from mcp.server.fastmcp import FastMCP

# 1. 创建 MCP 服务器实例
mcp = FastMCP("GCD_Server")

# 2. 使用 @mcp.tool() 装饰器将函数注册为大模型可调用的工具
@mcp.tool()
def calculate_gcd(a: int, b: int) -> int:
    """计算并返回两个整数的最大公约数 (GCD)"""
    return math.gcd(a, b)

# 3. 启动服务器,通过标准输入输出 (stdio) 与 AI 客户端通信
if __name__ == "__main__":
    mcp.run()

服务器启动之后,只需让大模型客户端连接这个服务即可。至于更加具体的,我也不会。

因为我也是初学者

RAG

RAG 不是一个东西

RAG 的全称是「Retrieval-Augmented Generation」,翻译过来就是 「检索增强生成」

试想一个场景:公司里有一份 10GB 大小的内部文档,每天有 100 万次的查询需求。你不可能精准记住所需资料的具体位置,只能进行"模糊查询",这时候向量数据库 就该出手了。

它的核心依赖于 Embedding(嵌入)模型 。Embedding 模型能将一段文本转化为一串高维向量,然后在向量数据库中计算向量间的距离,从而找到语义最相似的文本片段。这就实现了真正意义上的"模糊查找"。

至于嵌入模型是怎样把文本转换为高维向量,您可能需要先学习深度学习

如果你已经学过深度学习了,那么肯定就不用教就能看懂了。

为什么要用这个东西?直接把文档喂给聊天大模型,让聊天大模型自己去找不就好了吗?

这样很方便,但是代价就是:10GB 的文档,一天查询 100 万次,意味着每天要消耗上千 T 的 Token,您的老板一分钟就倒闭了。

通过向量数据库,我们可以精准截取最相关的几段文本喂给模型,从而极大节约成本。

这里讲述如何进行一次基础的检索。

  1. 准备一个嵌入模型。
  2. 部署一个向量数据库(例如 PostgreSQL 的 pgvector 插件)。
  3. 准备数据集(比如 wiki-cn 数据集就不错)。
  4. 切分:编写代码将长文档切分成合适大小的文本块。
  5. 向量化:将这些文本块通过嵌入模型转化为向量。
  6. 入库:把向量及对应的原文写入向量数据库。
  7. 检索与生成:当用户输入查询(如"什么是民族?"),先把用户的提问也向量化,在数据库中查询距离最接近的文本片段,最后交给大模型总结输出给用户。

这就是最基本的流程。看似简单,但实际落地时有无数个可以优化的地方等待你去发掘。

LangGraph

目前还没深入学,大概知道它类似于 Dify,但属于纯代码层面的进阶工作流框架,能提供远超可视化界面的定制化能力。

至于更多

由于没学,这里请 AI 帮我补充

RAG 的进阶优化方向

要真正落地一个工业级的 RAG 系统,业界通常会关注以下几大痛点与优化手段:

  • RAG 七层架构:摄入(Ingestion) → 解析(Parsing) → 切片(Chunking) → 索引(Indexing) → 检索(Retrieval) → 精排(Reranking) → 生成(Generation)。每个环节都可能成为系统瓶颈。
  • 切片三剑客:掌握语义切片、父子切片(Parent-Child Chunking)、命题切片,这比简单的按字数切分效果好得多。
  • 混合检索与改写:单一的向量检索容易遗漏关键词,使用「向量 + BM25(词频检索)」的混合检索,配合 Query 改写技术,能让召回率提升 50% 以上。
  • 精排 (Rerank):这是性价比最高的优化手段。召回粗略结果后,用专用模型重新打分排序,准确率能轻松提升 10%-20%。
  • 评估驱动:构建系统必须看重 4 个核心指标,并经常进行消融实验(Ablation Study)来验证每一步优化的实际效果。

深度剖析:Skill 与 MCP 的架构差异

在大语言模型能力扩展的架构体系中,技能(Skill) 与**模型上下文协议(MCP)**均扮演着核心角色。虽然两者都建立在"函数调用"机制之上,旨在打破模型预训练数据的静态壁垒,但它们在系统架构和生态通用性上存在根本差异:

  1. 定位与耦合度
  2. 可移植性与复用
  3. 执行环境与核心安全边界

总结:Skill 是连接应用与公共互联网的便捷桥梁,而 MCP 则是大模型迈向"自主智能体 (Agent)"、实现与物理环境及复杂私有系统深度交互的底层基础设施规范。根据业务场景的安全敏感度与调用深度,开发者可在两者之间做出最符合工程效益的战略选择。