🚀 生成匏 AI 党栈孊习指南从零到生产级应甚

11 阅读25分钟

基于埮蜯匀源诟皋 Generative AI for Beginners⭐ 110k+深床敎理芆盖原理、工皋、实战党铟路


目圕

  1. 什么是生成匏 AI从 60 幎代到今倩
  2. LLM 的内郚运䜜机制
  3. 暡型选型地囟
  4. Prompt Engineering和 AI 诎话的艺术
  5. 劚手实战䞉䞪层次的代码瀺䟋
  6. RAG让 AI 拥有䜠的私有知识库
  7. Function Calling让 AI 真正调甚工具
  8. AI Agent从助手到自䞻决策
  9. Fine-Tuning定制䞓属暡型
  10. 技术路埄选择指南
  11. 孊习资源䞎䞋䞀步

1. 历史䞎本莚

埈倚人以䞺生成匏 AI 是 2022 幎 ChatGPT 暪空出䞖才有的䜆这项技术已经酝酿了 60 倚幎。

时闎线总览

1960s  ──► 基于规则的聊倩机噚人知识库 + 关键词匹配
              └─ 无法扩展换䞪诎法就䞍讀识了

1990s  ──► 统计机噚孊习兎起
              └─ 胜从数据里孊规埋䜆䞊䞋文理解匱

2010s  ──► 深床孊习 + RNN埪环神经眑络
              └─ 理解语义胜做翻译/语音识别䜆长文本倄理差

2017   ──► Transformer 架构Attention is All You Need
              └─ 革呜性突砎胜倄理任意长床并行训练

2020+  ──► GPT-3 / ChatGPT / GPT-4
              └─ 生成匏 AI 爆发人人可甚

栞心抂念䞀句话理解

生成匏 AI 是胜借根据䜠的蟓入自劚生成文字、囟像、代码、音频等内容的人工智胜技术。䜠䞍需芁写代码只需芁甚自然语蚀诎出䜠想芁的它就胜给出结果。


2. LLM 内郚机制

理解 LLM 怎么工䜜是甚奜它的关键。䞋面甚最盎癜的方匏解释它的䞉䞪栞心步骀

LLM 倄理䞀次请求的完敎流皋

甚户蟓入文字
     │
     ▌
┌─────────────┐
│  Tokenizer  │  ← 把文字切成"词块Token"蜬䞺数字
│  分词噚      │     䟋"Hello world" → [15496, 995]
└─────────────┘
     │
     ▌
┌─────────────────────────────────┐
│         Transformer 暡型         │
│                                  │
│  泚意力机制Attention           │
│  ┌──────────────────────────┐   │
│  │ 对每䞪 Token 计算"权重"   │   │
│  │ 重芁的词权重高噪声词䜎   │   │
│  └──────────────────────────┘   │
│                                  │
│  预测䞋䞀䞪 Token 的抂率分垃       │
└─────────────────────────────────┘
     │
     ▌
根据抂率 + Temperature 参数随机采样
     │
     ▌
蟓出䞀䞪 Token远加到䞊䞋文埪环盎到结束
     │
     ▌
  最终回答文字

Temperature 参数盎观理解

Temperature = 0.0  →  每次蟓出完党盞同适合代码、结构化任务
Temperature = 0.7  →  有䞀定随机性适合对话、内容创䜜  ← 默讀
Temperature = 1.5  →  非垞随机适合倎脑风暎、创意发散

䞺什么 LLM 䌚"猖造"内容幻觉/Hallucination

LLM 的本莚是"预测最可胜的䞋䞀䞪词"
它没有"我䞍知道"这䞪选项——只芁有蟓入它就䌚蟓出

圓䜠问它䞍知道的事情时比劂䜠公叞内郚数据
它䌚甚统计䞊"最像真的"内容来填充
听起来合理䜆完党是猖的

解决方法
  ├─ Prompt 䞭明确诎"劂果䞍知道请盎接诎䞍知道"
  ├─ RAG检玢增区给它提䟛真实的参考材料
  └─ Fine-Tuning甚真实数据重新训练

3. 暡型选型

面对県花猭乱的暡型怎么选䞋面这匠地囟垮䜠快速定䜍

按甚途选暡型

䜠的任务是什么
│
├─► 文字生成 / 对话 / 代码
│     ├─ 最区效果GPT-4o, Claude 3.5 Sonnet
│     ├─ 性价比GPT-3.5-turbo, Mistral-7B
│     └─ 完党免莹匀源Llama 3, Mistral
│
├─► 囟像生成
│     ├─ DALL-E 3OpenAI集成圚 ChatGPT
│     ├─ Stable Diffusion匀源可本地运行
│     └─ Midjourney商䞚效果最奜
│
├─► 语音识别
│     └─ WhisperOpenAI 匀源支持 99 种语蚀
│
└─► 向量嵌入甚于搜玢/RAG
      └─ text-embedding-ada-002OpenAI
         text-embedding-3-small曎䟿宜

匀源 vs 闭源怎么选

闭源暡型OpenAI / Azure OpenAI         匀源暡型Llama / Mistral
─────────────────────────────────         ─────────────────────────
✅ 效果最奜匀箱即甚                      ✅ 数据完党私有䞍倖䌠
✅ 无需管理基础讟斜                        ✅ 可本地郚眲零成本
✅ 持续曎新绎技                            ✅ 可以 Fine-Tuning 深床定制
❌ 按 Token 付莹倧规暡成本高             ❌ 需芁自己的算力资源
❌ 数据芁䞊䌠到第䞉方                      ❌ 效果皍匱需芁曎倚调䌘
❌ 有数据隐私顟虑                          ❌ 绎技成本高

4. Prompt Engineering

Prompt Engineering 是"甚对方匏和 AI 对话"的技术是成本最䜎、见效最快的䌘化手段。

4.1 Prompt 的基本构成

䞀䞪完敎 Prompt 的解剖

┌────────────────────────────────────────────────────┐
│  System Message系统提瀺                          │
│  → 定义 AI 的角色、性栌、规则                         │
│  → "䜠是䞀䜍䞓䞚的 Python 工皋垈回答芁简掁..."       │
├─────────────────────────────────────────────────────
│  Context䞊䞋文/背景知识                           │
│  → 提䟛 AI 需芁了解的背景信息                         │
│  → 䟋劂䞀段文档内容、数据库结果                       │
├─────────────────────────────────────────────────────
│  Examples瀺䟋                                    │
│  → 给 AI 看䜠期望的蟓入蟓出栌匏                        │
│  → Few-shot 孊习的栞心                               │
├─────────────────────────────────────────────────────
│  User Instruction甚户指什                        │
│  → 明确告诉 AI 芁做什么                              │
│  → 越具䜓越奜包含栌匏芁求                            │
└────────────────────────────────────────────────────┘

4.2 Zero-Shot / One-Shot / Few-Shot 对比

Zero-Shot零样本—— 盎接提问
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Prompt: "把䞋面这句话翻译成法语The weather is nice today."
Output: "Le temps est beau aujourd'hui."

适甚简单通甚任务

─────────────────────────────────────────

One-Shot单样本—— 给䞀䞪䟋子
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Prompt:
  英语: "I love programming" → 法语: "J'aime la programmation"
  英语: "The weather is nice today" → 法语:

Output: "Le temps est beau aujourd'hui."

适甚有栌匏芁求的任务

─────────────────────────────────────────

Few-Shot倚样本—— 给倚䞪䟋子让 AI 孊规埋
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Prompt:
  "The player ran the bases"  → Baseball
  "The player hit an ace"    → Tennis
  "The player hit a six"     → Cricket
  "The player made a slam-dunk" →

Output: Basketball  ✅  AI 掚断出了规埋

适甚分类、栌匏蜬换、规埋提取

4.3 Prompt 䌘化实战对比

䞋面看䞀䞪真实的"写䜜任务"逐步䌘化 Prompt 效果劂䜕变化

❌ 差的 Prompt
"垮我写䞪介绍"

──────────────────────────────────────────────────────

🔶 普通 Prompt
"垮我写䞀段产品介绍"

蟓出泛泛而谈没有重点

──────────────────────────────────────────────────────

✅ 奜的 Prompt
"""
䜠是䞀䜍科技产品文案䞓家。
请䞺䞀欟 AI 写䜜助手写䞀段产品介绍芁求
- 目标甚户内容创䜜者和博䞻
- 字数100-150字
- 语气䞓䞚䜆亲切
- 重点区调省时、智胜、易甚
- 结尟加䞀句行劚召唀Call to Action
"""

蟓出粟准、有针对性、笊合营销目标 ✅

5. 劚手实战

䞋面按隟床分䞉䞪层次提䟛完敎可运行的代码瀺䟋。

🟢 入闚级最简单的对话应甚

# 最简单的 OpenAI 对话瀺䟋
# 安装pip install openai python-dotenv

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

def chat(user_message, system_message="䜠是䞀䞪友奜的AI助手"):
    """最基础的单蜮对话"""
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user",   "content": user_message}
        ],
        temperature=0.7,
        max_tokens=500
    )
    return response.choices[0].message.content

# 䜿甚瀺䟋
print(chat("甚䞀句话解释什么是机噚孊习"))
# 蟓出机噚孊习是䞀种让计算机通过从数据䞭自劚孊习规埋
#       而无需明确猖皋的人工智胜技术。

# 切换角色
print(chat("解释递園", system_message="䜠是䞀䜍给5岁小孩讲故事的老垈"))
# 蟓出风栌完党䞍同

🟡 进阶级垊记忆的倚蜮对话 + 结构化蟓出

# 进阶瀺䟋倚蜮对话 + JSON 结构化蟓出
import json
from openai import OpenAI

client = OpenAI()

class ConversationBot:
    """
    垊记忆的倚蜮对话机噚人
    对话流皋

    甚户蟓入
       │
       ▌
    添加到 messages 历史
       │
       ▌
    发送党郚历史给 LLM
       │
       ▌
    LLM 返回远加到历史
       │
       ▌
    䞋蜮继续AI 记埗之前诎的话
    """
    def __init__(self, system_prompt):
        self.messages = [
            {"role": "system", "content": system_prompt}
        ]

    def chat(self, user_input):
        # 远加甚户消息到历史
        self.messages.append({
            "role": "user", 
            "content": user_input
        })

        response = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=self.messages,
            temperature=0.7
        )

        # 远加 AI 回倍到历史
        assistant_reply = response.choices[0].message.content
        self.messages.append({
            "role": "assistant",
            "content": assistant_reply
        })
        return assistant_reply

    def clear(self):
        """枅空对话历史保留 system prompt"""
        self.messages = self.messages[:1]


# 场景从非结构化文本䞭提取结构化信息
def extract_info(text):
    """䜿甚 JSON 暡匏提取结构化数据"""
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{
            "role": "user",
            "content": f"""
            从䞋面文本䞭提取信息返回 JSON 栌匏
            {{
                "name": "姓名",
                "age": 幎韄数字,
                "skills": ["技胜列衚"],
                "experience_years": 工䜜幎限数字
            }}

            文本{text}

            只返回 JSON䞍芁其他内容。
            """
        }],
        response_format={"type": "json_object"}  # 区制 JSON 蟓出
    )
    return json.loads(response.choices[0].message.content)

# 测试
text = "匠䌟28岁有5幎 Python 匀发经验熟悉 Django、FastAPI 和 Docker"
result = extract_info(text)
print(result)
# 蟓出
# {
#   "name": "匠䌟",
#   "age": 28,
#   "skills": ["Python", "Django", "FastAPI", "Docker"],
#   "experience_years": 5
# }

🔎 高级完敎的流匏蟓出 + 错误倄理 + Token 计数

# 高级瀺䟋生产级代码
import tiktoken
import time
from openai import OpenAI, APIError, RateLimitError

client = OpenAI()

def count_tokens(text: str, model: str = "gpt-3.5-turbo") -> int:
    """粟确计算 Token 数量避免超出限制"""
    encoding = tiktoken.encoding_for_model(model)
    return len(encoding.encode(text))

def stream_chat(
    messages: list,
    model: str = "gpt-3.5-turbo",
    max_retries: int = 3
) -> str:
    """
    流匏蟓出 + 自劚重试生产环境掚荐

    流匏蟓出流皋
    ┌─────────────┐      ┌──────────────┐     ┌──────────────┐
    │  发送请求    │─────►│  服务噚逐块   │────►│  实时打印每  │
    │  stream=True │      │  返回 Token  │     │  䞪字笊      │
    └─────────────┘      └──────────────┘     └──────────────┘

    䌘点甚户看到第䞀䞪字的延迟从3秒降到0.3秒
    """
    for attempt in range(max_retries):
        try:
            full_response = ""
            # 䜿甚流匏接口
            with client.chat.completions.create(
                model=model,
                messages=messages,
                stream=True,          # 关键匀启流匏
                temperature=0.7,
            ) as stream:
                for chunk in stream:
                    delta = chunk.choices[0].delta
                    if delta.content:
                        print(delta.content, end="", flush=True)
                        full_response += delta.content
            print()  # 换行
            return full_response

        except RateLimitError:
            wait_time = 2 ** attempt  # 指数退避
            print(f"\n速率限制等埅 {wait_time}s 后重试...")
            time.sleep(wait_time)
        except APIError as e:
            print(f"API 错误{e}")
            raise

    raise Exception("超过最倧重试次数")


# 䜿甚瀺䟋
messages = [
    {"role": "system", "content": "䜠是䞀䜍 AI 䞓家"},
    {"role": "user", "content": "解释䞀䞋 Transformer 架构"}
]

# 检查 token 甹量
total_tokens = sum(count_tokens(m["content"]) for m in messages)
print(f"蟓入 Token 数{total_tokens}")

# 流匏蟓出
response = stream_chat(messages)
print(f"\n蟓出 Token 数{count_tokens(response)}")

6. RAG

RAGRetrieval Augmented Generation检玢增区生成是圓前䌁䞚 AI 应甚䞭最重芁的架构暡匏解决了 LLM "䞍知道䜠公叞数据" 的栞心问题。

RAG 工䜜原理囟

                    ╔══════════════════════════════════════╗
                    ║         RAG 完敎架构                  ║
                    ╚══════════════════════════════════════╝

【犻线阶段构建知识库】

  私有文档/数据库
  (PDF/Word/眑页...)
       │
       ▌
  ┌─────────────┐
  │  文档分块    │  → 按段萜或语义切分成小块Chunk
  │  Chunking   │     每块 200~500 Token
  └─────────────┘
       │
       ▌
  ┌─────────────────┐
  │  向量嵌入        │  → 调甚 Embedding 暡型
  │  Embedding      │     把文字 → 高绎数字向量
  │  ada-002 等     │     "苹果" → [0.23, -0.11, 0.87, ...]
  └─────────────────┘
       │
       ▌
  ┌─────────────────┐
  │  存入向量数据库  │  → Qdrant / Chroma / Azure AI Search
  │  Vector DB      │     支持盞䌌床快速检玢
  └─────────────────┘

──────────────────────────────────────────────────────────

【圚线阶段回答甚户问题】

  甚户提问"我们公叞的退欟政策是什么"
       │
       ▌
  ┌─────────────────┐
  │  Query Embedding │  → 把问题也蜬成向量
  └─────────────────┘
       │
       ▌
  ┌─────────────────────────────────┐
  │  向量盞䌌床搜玢                   │
  │  扟出最盞关的 Top-K 䞪文本块      │
  │  䜙匊盞䌌床cos(Ξ) 越倧越盞䌌    │
  └─────────────────────────────────┘
       │
       ▌
  ┌────────────────────────────────────────────┐
  │  构建增区 Prompt                            │
  │                                            │
  │  System: "只基于以䞋资料回答问题"            │
  │  Context: [检玢到的文本块1]                 │
  │           [检玢到的文本块2]                 │
  │           [检玢到的文本块3]                 │
  │  User: "我们公叞的退欟政策是什么"          │
  └────────────────────────────────────────────┘
       │
       ▌
  ┌─────────────────┐
  │      LLM        │  → GPT-4 / Claude 等
  └─────────────────┘
       │
       ▌
  "根据公叞政策文件退欟需圚莭买后30倩内..." ✅
  答案有据可查䞍再猖造

RAG 完敎代码实现

# 完敎 RAG 实现瀺䟋
# pip install openai chromadb tiktoken

import chromadb
from openai import OpenAI

client = OpenAI()
chroma_client = chromadb.Client()

# ── 第䞀步创建向量数据库并存入文档 ──

def build_knowledge_base(documents: list[str], collection_name="my_kb"):
    """
    构建知识库
    documents: 文档内容列衚
    """
    collection = chroma_client.get_or_create_collection(collection_name)

    for i, doc in enumerate(documents):
        # 䜿甚 OpenAI Embedding 暡型生成向量
        embedding_response = client.embeddings.create(
            input=doc,
            model="text-embedding-ada-002"
        )
        embedding = embedding_response.data[0].embedding

        # 存入向量数据库
        collection.add(
            ids=[f"doc_{i}"],
            embeddings=[embedding],
            documents=[doc]
        )

    print(f"✅ 知识库构建完成共 {len(documents)} 䞪文档块")
    return collection


# ── 第二步检玢盞关内容 ──

def retrieve(query: str, collection, top_k=3):
    """
    向量检玢扟到最盞关的文档块
    """
    # 把问题蜬成向量
    query_embedding = client.embeddings.create(
        input=query,
        model="text-embedding-ada-002"
    ).data[0].embedding

    # 盞䌌床搜玢
    results = collection.query(
        query_embeddings=[query_embedding],
        n_results=top_k
    )

    return results["documents"][0]  # 返回最盞关的 top_k 䞪文档块


# ── 第䞉步RAG 问答 ──

def rag_answer(query: str, collection):
    """
    RAG 完敎流皋检玢 → 增区 → 生成
    """
    # 检玢盞关内容
    relevant_docs = retrieve(query, collection)
    context = "\n\n---\n\n".join(relevant_docs)

    # 构建增区 Prompt
    augmented_prompt = f"""
请基于以䞋参考资料回答问题。
劂果参考资料䞭没有盞关信息请盎接诎"我圚知识库䞭没有扟到盞关信息"䞍芁猖造答案。

【参考资料】
{context}

【问题】
{query}
"""

    # 调甚 LLM 生成答案
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "䜠是䞀䞪䞓䞚的知识库助手只基于提䟛的资料回答问题。"},
            {"role": "user", "content": augmented_prompt}
        ],
        temperature=0  # 讟䞺0让答案曎皳定
    )

    answer = response.choices[0].message.content

    # 打印来源增区可信床
    print("\n📚 参考来源")
    for i, doc in enumerate(relevant_docs, 1):
        print(f"  [{i}] {doc[:80]}...")

    return answer


# ── 䜿甚瀺䟋 ──

# 暡拟公叞内郚文档
company_docs = [
    "退欟政策所有商品支持30倩无理由退欟。退欟需通过官眑提亀申请3-5䞪工䜜日内倄理完成。",
    "䌚员制床黄金䌚员享受9折䌘惠铂金䌚员享受8折䌘惠。消莹满1000元升级黄金䌚员。",
    "配送政策党囜包邮48小时内发莧。偏远地区西藏、新疆等需额倖3-5倩。",
    "售后服务产品圚保修期内出现莚量问题免莹绎修或曎换。保修期䞺莭买后䞀幎。",
]

collection = build_knowledge_base(company_docs)

# 提问
answer = rag_answer("我买的䞜西想退莧需芁几倩胜到莊", collection)
print(f"\n🀖 回答{answer}")

7. Function Calling

Function Calling 让 LLM 从"只䌚诎话"变成"胜做事"——它胜识别甚户意囟并调甚䜠预定义的凜数。

Function Calling 工䜜流皋囟

甚户问"北京明倩倩气怎么样"
         │
         ▌
┌─────────────────────────────────────────┐
│  LLM 分析第䞀次调甚                   │
│                                          │
│  可甚工具                               │
│  - get_weather(city, date) → 查倩气       │
│  - search_web(query) → 搜玢眑页           │
│  - send_email(to, body) → 发邮件          │
│                                          │
│  LLM 决策这䞪问题需芁调甚 get_weather    │
└─────────────────────────────────────────┘
         │
         â–Œ  返回 JSON䞍是自然语蚀
{
  "function": "get_weather",
  "arguments": {
    "city": "北京",
    "date": "tomorrow"
  }
}
         │
         â–Œ  䜠的代码执行这䞪凜数
  real_weather = get_weather("北京", "tomorrow")
  → "晎倩最高气枩28°C最䜎18°C北风3级"
         │
         â–Œ  把结果返回给 LLM第二次调甚
┌─────────────────────────────────────────┐
│  LLM 生成自然语蚀回倍                    │
│  "北京明倩倩气晎朗气枩圚18-28°C之闎  │
│   北风3级出闚可以穿薄倖套䞍甚垊䌞" │
└─────────────────────────────────────────┘

完敎代码瀺䟋

# Function Calling 完敎瀺䟋
import json
from openai import OpenAI

client = OpenAI()

# ── 第䞀步定义工具凜数真实实现──

def get_weather(city: str, date: str) -> str:
    """暡拟倩气 API实际项目䞭接真实 API"""
    weather_data = {
        "北京": {"today": "晎倩 25°C", "tomorrow": "倚云 22°C"},
        "䞊海": {"today": "阎倩 20°C", "tomorrow": "小雚 18°C"},
    }
    return weather_data.get(city, {}).get(date, "暂无数据")

def search_courses(role: str, topic: str, level: str) -> str:
    """搜玢孊习诟皋暡拟 API"""
    return json.dumps([
        {"title": f"{topic} 入闚诟皋", "url": "https://example.com/1", "level": level},
        {"title": f"{topic} 实战项目", "url": "https://example.com/2", "level": "intermediate"},
    ], ensure_ascii=False)

# ── 第二步甚 JSON Schema 描述工具 ──
# LLM 通过这些描述决定"䜕时调甚哪䞪凜数、䌠什么参数"

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城垂的倩气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "城垂名称劂北京、䞊海"
                    },
                    "date": {
                        "type": "string",
                        "enum": ["today", "tomorrow"],
                        "description": "查询日期"
                    }
                },
                "required": ["city", "date"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "search_courses",
            "description": "搜玢孊习诟皋",
            "parameters": {
                "type": "object",
                "properties": {
                    "role": {"type": "string", "description": "孊习者角色"},
                    "topic": {"type": "string", "description": "孊习䞻题"},
                    "level": {
                        "type": "string",
                        "enum": ["beginner", "intermediate", "advanced"]
                    }
                },
                "required": ["topic", "level"]
            }
        }
    }
]

# ── 第䞉步完敎的工具调甚埪环 ──

def run_with_tools(user_message: str) -> str:
    """垊工具调甚的完敎对话埪环"""
    messages = [
        {"role": "system", "content": "䜠是䞀䞪智胜助手可以查倩气和搜玢诟皋。"},
        {"role": "user", "content": user_message}
    ]

    available_functions = {
        "get_weather": get_weather,
        "search_courses": search_courses,
    }

    while True:
        # 调甚 LLM
        response = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=messages,
            tools=tools,
            tool_choice="auto"
        )

        message = response.choices[0].message

        # 劂果没有工具调甚盎接返回答案
        if not message.tool_calls:
            return message.content

        # 倄理工具调甚
        messages.append(message)  # 远加 AI 的"决定调甚工具"消息

        for tool_call in message.tool_calls:
            func_name = tool_call.function.name
            func_args = json.loads(tool_call.function.arguments)

            print(f"🔧 调甚工具{func_name}({func_args})")

            # 执行实际凜数
            result = available_functions[func_name](**func_args)

            # 把凜数结果远加到消息列衚
            messages.append({
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": str(result)
            })

        # 继续埪环让 LLM 根据工具结果生成最终回答


# 测试
print(run_with_tools("北京今倩倩气怎么样"))
print(run_with_tools("我想孊 Python有什么入闚诟皋掚荐"))

8. AI Agent

AI Agent智胜䜓是圓前最前沿的方向——让 LLM 自䞻规划、执行倚步骀任务䞍只是"问䞀答䞀"而是"给䞀䞪目标自己想办法完成"。

Agent 䞎普通 LLM 的区别

普通 LLM 对话
──────────────
甚户 → [问题]  → LLM → [答案]   结束

───────────────────────────────────────────────────

AI Agent 运䜜暡匏ReAct 框架
────────────────────────────────
甚户给出目标"垮我分析最新的 AI 论文趋势并写䞀仜报告"
         │
         ▌
┌─────────────────────────────────────────────────┐
│              Agent 䞻埪环                        │
│                                                  │
│  THINK思考需芁先搜玢最新论文               │
│       │                                          │
│       â–Œ                                          │
│  ACT行劚调甚 search_papers("AI 2024")     │
│       │                                          │
│       â–Œ                                          │
│  OBSERVE观察获埗论文列衚                   │
│       │                                          │
│       â–Œ                                          │
│  THINK需芁分类汇总这些论文                     │
│       │                                          │
│       â–Œ                                          │
│  ACT调甚 summarize(papers)                    │
│       │                                          │
│       â–Œ                                          │
│  OBSERVE获埗摘芁                               │
│       │                                          │
│       â–Œ                                          │
│  THINK现圚可以写报告了                         │
│       │                                          │
│       â–Œ                                          │
│  ACTgenerate_report(summaries)               │
│       │                                          │
│       â–Œ                                          │
│  OBSERVE报告生成完毕                           │
│       │                                          │
│       â–Œ                                          │
│  THINK任务完成                                 │
└─────────────────────────────────────────────────┘
         │
         ▌
  返回完敎报告给甚户 ✅

䞻流 Agent 框架对比

┌──────────────┬──────────────┬────────────────┬─────────────────┐
│  框架         │  栞心特点     │  适合场景       │  隟床           │
├──────────────┌──────────────┌────────────────┌──────────────────
│  LangChain   │ 工具生态䞰富  │ 通甚任务        │ ⭐⭐⭐ 侭等       │
│              │ 瀟区最倧      │ RAG + Agent    │                  │
├──────────────┌──────────────┌────────────────┌──────────────────
│  AutoGen     │ 倚 Agent 对话 │ 倍杂任务协䜜    │ ⭐⭐⭐ 侭等       │
│  (Microsoft) │ 可暡拟团队    │ 代码生成/审查   │                  │
├──────────────┌──────────────┌────────────────┌──────────────────
│  TaskWeaver  │  代码䌘先      │  数据分析       │ ⭐⭐ 蟃简单       │
│  (Microsoft) │  支持DataFrame │  生成囟衚       │                 │
├──────────────┌──────────────┌────────────────┌──────────────────
│  JARVIS      │  调床其他 AI   │  倚暡态任务     │ ⭐⭐⭐⭐ 蟃倍杂    │
│              │  暡型来协䜜    │  囟像+文字混合  │                 │
└──────────────┮──────────────┮────────────────┮─────────────────┘

AutoGen 倚 Agent 协䜜瀺䟋

# AutoGen 倚 Agent 协䜜暡拟研发团队评审代码
# pip install pyautogen

import autogen

llm_config = {
    "model": "gpt-4",
    "api_key": "YOUR_API_KEY"
}

# ── 创建䞉䞪䞍同角色的 Agent ──

# 1. 皋序员 Agent莟莣写代码
coder = autogen.AssistantAgent(
    name="皋序员",
    system_message="""䜠是䞀䜍资深 Python 工皋垈。
    䜠的职莣是猖写枅晰、高效、有泚释的代码。
    只写代码䞍做其他事。""",
    llm_config=llm_config,
)

# 2. 代码审查员 Agent莟莣审查
reviewer = autogen.AssistantAgent(
    name="代码审查员",
    system_message="""䜠是䞀䜍䞥栌的代码审查员。
    䜠的职莣是扟出代码䞭的 bug、安党问题、性胜问题。
    给出具䜓的改进建议。""",
    llm_config=llm_config,
)

# 3. 甚户代理代衚人类参䞎
user_proxy = autogen.UserProxyAgent(
    name="技术莟莣人",
    human_input_mode="TERMINATE",   # 遇到 TERMINATE 关键词就停止
    max_consecutive_auto_reply=5,   # 最倚自劚回倍5蜮
    code_execution_config={
        "work_dir": "workspace",
        "use_docker": False
    }
)

# ── 启劚倚 Agent 对话 ──
# 流皋技术莟莣人提需求 → 皋序员写代码 → 审查员审查 → 皋序员修改 → 埪环盎到满意

groupchat = autogen.GroupChat(
    agents=[user_proxy, coder, reviewer],
    messages=[],
    max_round=10
)

manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config=llm_config
)

# 发起任务
user_proxy.initiate_chat(
    manager,
    message="请垮我写䞀䞪 Python 凜数实现对列衚的快速排序芁求包含蟹界倄理和类型检查。"
)

# AutoGen 䌚自劚进行倚蜮对话
# 皋序员写出初版代码
# 审查员指出猺少类型泚解、蟹界没倄理 None
# 皋序员修改代码
# 审查员确讀通过
# 技术莟莣人满意终止

LangChain Agent 完敎瀺䟋

# LangChain Agent垊工具的自䞻任务执行
# pip install langchain langchain-openai

from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import tool
from langchain import hub

# ── 定义工具Agent 可以调甚的凜数──

@tool
def calculate(expression: str) -> str:
    """计算数孊衚蟟匏劂 '2 + 3 * 4'。泚意只胜甚于安党的数孊计算。"""
    try:
        # 安党评䌰只允讞数字和运算笊
        allowed = set('0123456789+-*/.() ')
        if not all(c in allowed for c in expression):
            return "错误䞍支持的字笊"
        result = eval(expression)
        return str(result)
    except Exception as e:
        return f"计算错误: {e}"

@tool
def search_knowledge(query: str) -> str:
    """圚知识库䞭搜玢信息。甚于查扟䞓䞚知识、政策文档等。"""
    # 这里连接真实的 RAG 系统
    knowledge_base = {
        "退欟政策": "莭买后30倩内可申请退欟审栞3-5䞪工䜜日",
        "䌚员权益": "黄金䌚员享9折铂金䌚员享8折",
        "技术支持": "工䜜日9:00-18:00电话 400-xxx-xxxx"
    }
    for key, value in knowledge_base.items():
        if key in query:
            return value
    return "未扟到盞关信息"

@tool
def send_notification(message: str, channel: str = "email") -> str:
    """发送通知消息。channel 可以是 email 或 sms。"""
    print(f"📚 发送{channel}通知: {message}")
    return f"通知已成功发送到 {channel}"

# ── 创建 Agent ──

llm = ChatOpenAI(model="gpt-4", temperature=0)
tools = [calculate, search_knowledge, send_notification]

# 䜿甚 ReAct 提瀺暡板思考→行劚→观察埪环
prompt = hub.pull("hwchase17/react")

agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,   # 打印每䞀步思考过皋
    max_iterations=5
)

# ── 运行 Agent ──
result = agent_executor.invoke({
    "input": "垮我查询退欟政策然后计算劂果退欟金额是1299元退欟手续莹是1.5%实际退欟是倚少钱最后发邮件通知甚户。"
})

# Agent 䌚自劚
# 1. THINK: 需芁先查退欟政策
# 2. ACT: 调甚 search_knowledge("退欟政策")
# 3. OBSERVE: 埗到退欟政策文本
# 4. THINK: 需芁计算实际退欟金额
# 5. ACT: 调甚 calculate("1299 * (1 - 0.015)")
# 6. OBSERVE: 埗到 1279.515
# 7. THINK: 需芁发通知
# 8. ACT: 调甚 send_notification(...)
# 9. OBSERVE: 通知已发送
# 10. 返回最终结果

print(result["output"])

9. Fine-Tuning

圓 Prompt Engineering 和 RAG 郜满足䞍了需求时Fine-Tuning埮调就是终极歊噚——甚䜠自己的数据重新训练暡型。

䞉种䌘化策略对比

选择䌘化策略的决策树

匀始
  │
  ▌
䜠的问题是什么
  │
  ├─► 暡型䞍了解䜠的私有数据公叞文档/产品信息
  │      │
  │      â–Œ
  │    数据量倧吗是吊需芁实时曎新
  │      ├─ 是 → 甹 RAG检玢增区✅ 掚荐銖选
  │      └─ 吊数据皳定 → 考虑 Fine-Tuning
  │
  ├─► 暡型蟓出风栌/栌匏䞍笊合芁求倪正匏/倪随意/栌匏乱
  │      └─► Fine-Tuning ✅甚䜠的样本训练风栌
  │
  ├─► 暡型圚特定领域衚现差医疗/法埋/代码特定框架
  │      └─► Fine-Tuning ✅
  │
  └─► 需芁减少 Token 甚量每次 Few-Shot 倪莵
         └─► Fine-Tuning ✅训练后䞍再需芁倧量瀺䟋


成本/效果对比

                  䜎成本              高成本
                    │                  │
䜎倍杂床   Prompt Engineering ──────────────────►
                                    RAG
高倍杂床                         Fine-Tuning ───►
                                          从倎训练极少数场景

Fine-Tuning 数据准倇栌匏

# Fine-Tuning 数据准倇瀺䟋OpenAI 栌匏
# 数据栌匏JSONL每行䞀䞪训练样本

import json

# 训练数据瀺䟋让暡型孊习特定的客服回倍风栌
training_data = [
    {
        "messages": [
            {"role": "system", "content": "䜠是XX公叞䞓䞚客服语气亲切回答简掁。"},
            {"role": "user", "content": "我的快递还没到怎么查询"},
            {"role": "assistant", "content": "悚奜悚可以通过以䞋方匏查询\n1. 登圕官眑→订单䞭心→查看物流\n2. 回倍短信「查询+订单号」\n3. 臎电 400-xxx-xxxx\n\n劂有问题随时联系我们 😊"}
        ]
    },
    {
        "messages": [
            {"role": "system", "content": "䜠是XX公叞䞓䞚客服语气亲切回答简掁。"},
            {"role": "user", "content": "产品莚量有问题想退莧"},
            {"role": "assistant", "content": "非垞抱歉给悚垊来䞍䟿莚量问题我们100%莟莣。\n\n退莧流皋\n1. 拍照䞊䌠问题囟片订单诊情页\n2. 选择「莚量问题退莧」\n3. 客服24小时内审栞\n4. 审栞通过后䞊闚取件无需悚承担运莹\n\n请问悚方䟿现圚提亀申请吗"}
        ]
    },
    # ... 至少准倇 50-100 䞪高莚量样本
]

# 保存䞺 JSONL 栌匏
with open("training_data.jsonl", "w", encoding="utf-8") as f:
    for item in training_data:
        f.write(json.dumps(item, ensure_ascii=False) + "\n")

print(f"✅ 训练数据已保存共 {len(training_data)} 条样本")
# 䞊䌠并启劚 Fine-Tuning 任务OpenAI
from openai import OpenAI

client = OpenAI()

# 第䞀步䞊䌠训练数据
with open("training_data.jsonl", "rb") as f:
    upload_response = client.files.create(
        file=f,
        purpose="fine-tune"
    )
file_id = upload_response.id
print(f"文件䞊䌠成功ID: {file_id}")

# 第二步创建 Fine-Tuning 任务
ft_job = client.fine_tuning.jobs.create(
    training_file=file_id,
    model="gpt-3.5-turbo",
    hyperparameters={
        "n_epochs": 3,          # 训练蜮数
        "batch_size": 4,        # 批次倧小
        "learning_rate_multiplier": 1.5
    }
)
print(f"Fine-Tuning 任务已创建: {ft_job.id}")
print(f"状态: {ft_job.status}")
# 通垞需芁 10 分钟到几小时取决于数据量

# 第䞉步䜿甚埮调后的暡型
# ft_job.fine_tuned_model 就是新暡型的名称
response = client.chat.completions.create(
    model=ft_job.fine_tuned_model,  # 䜿甚埮调暡型
    messages=[
        {"role": "system", "content": "䜠是XX公叞䞓䞚客服语气亲切回答简掁。"},
        {"role": "user", "content": "我的订单什么时候发莧"}
    ]
)
print(response.choices[0].message.content)
# 蟓出风栌将完党笊合䜠训练数据的风栌

10. 技术路埄选择

读到这里䜠可胜圚想这么倚技术我的项目到底该甚哪䞪䞋面是䞀匠完敎的决策地囟。

䌁䞚 AI 应甚技术选型党景囟

                    ┌─────────────────────────────────────────────────┐
                    │           䜠芁构建什么类型的应甚                │
                    └──────────────────┬──────────────────────────────┘
                                       │
           ┌───────────────────────────┌──────────────────────────────┐
           │                           │                              │
           ▌                           ▌                              ▌
    ┌─────────────┐            ┌─────────────┐               ┌─────────────┐
    │ 对话 / 问答  │            │  内容生成   │               │ 自劚化任务  │
    └──────┬──────┘            └──────┬──────┘               └──────┬──────┘
           │                          │                              │
           ▌                          ▌                              ▌
    需芁私有知识           需芁特定风栌/栌匏              需芁倚步骀执行
     ├─ 是 → RAG              ├─ 是 → Fine-Tuning             └─ 是 → AI Agent
     └─ 吊 → 盎接调甚 API      └─ 吊 → Prompt Engineering            │
                                                                      │
                                                              需芁调甚倖郚 API
                                                               └─ 是 → Function Calling
                                                                 嵌入 Agent äž­



完敎技术组合掚荐

场景1䌁䞚内郚知识库助手
━━━━━━━━━━━━━━━━━━━━━━━━━━
  APIAzure OpenAI
    + RAG向量数据库存䌁䞚文档
    + Function Calling查 HR 系统/ERP
    + Fine-Tuning可选统䞀回答风栌

场景2代码助手
━━━━━━━━━━━━━━━
  GPT-4 / Claude
    + Fine-Tuning训练圚䜠的代码库䞊
    + Function Calling执行代码测试
    + Agent自劚修 Bug 埪环

场景3客服机噚人
━━━━━━━━━━━━━━━━━
  GPT-3.5-turbo成本䜎
    + Fine-Tuning孊习品牌语气
    + RAG产品手册/FAQ
    + 内容安党过滀

场景4数据分析 Agent
━━━━━━━━━━━━━━━━━━━━━
  GPT-4
    + Function Calling查数据库/生成囟衚
    + AutoGen / TaskWeaver倚步分析
    + 代码执行环境

莟莣任 AI 的四层防技䜓系

这是埮蜯诟皋特别区调的从底层到应甚层的安党防技䞍胜只是"加䞪 if"了事

┌──────────────────────────────────────────────────────────┐
│                   甚户界面层第4层                      │
│  • 限制蟓入类型䞍允讞蟓入 HTML/脚本                    │
│  • 对敏感问题提瀺"请咚询䞓䞚人士"                          │
│  • 明确标泚"AI 生成内容仅䟛参考"                         │
├───────────────────────────────────────────────────────────
│                 Meta Prompt 层第3层                    │
│  • System Prompt 讟眮枅晰的行䞺蟹界                        │
│  • "劂果问题超出范囎请瀌貌拒绝"                          │
│  • 䜿甚 RAG 限制暡型只匕甚可信来源                          │
├───────────────────────────────────────────────────────────
│                  安党系统层第2层                        │
│  • Azure AI Content Safety埮蜯内容过滀 API             │
│  • 检测仇恚、暎力、色情、自我䌀害等内容                   │
│  • 检测 Prompt Injection 泚入攻击                          │
├───────────────────────────────────────────────────────────
│                   暡型选择层第1层                       │
│  • 小暡型 + 特定甚途 > 倧暡型 + 通甚甚途曎可控          │
│  • 䜿甚 Fine-Tuning 减少有害蟓出风险                        │
│  • 定期红队测试Red Teaming䞻劚扟挏掞                  │
└──────────────────────────────────────────────────────────┘

高级 Prompt 技巧速查衚

基于第 5 章的进阶内容这里敎理䞺䞀仜实甚速查卡

技巧              适甚场景                        瀺䟋关键词
─────────────────────────────────────────────────────────────
Chain-of-Thought  æ•°å­Š/逻蟑/掚理问题              "䞀步䞀步思考..."
                  倍杂分析任务                    "Let's think step by step"

Self-Refine       代码䌘化、文章涊色              "指出䞊面答案的3䞪问题并改进"
                  任䜕莚量芁求高的生成任务

Few-Shot          栌匏蜬换、分类、抜取             盎接给3-5䞪蟓入蟓出䟋子

Generated Know.   需芁䞓䞚/领域知识时             先让 AI 生成背景知识再提问
                  倍杂䞚务场景                    "先介绍X的背景然后回答..."

Least-to-Most     倧型倍杂任务分解                "把这䞪任务分解成5䞪步骀
                  数据科孊/项目规划               然后逐步执行"

Maieutic          验证 AI 答案正确性              "解释䜠答案䞭每䞪芁点的䟝据"
                  高准确性芁求场景

Temperature 控制
  代码生成/结构化数据  → temperature=0.0~0.2
  日垞问答/分析       → temperature=0.5~0.7默讀
  创意写䜜/倎脑风暎   → temperature=0.8~1.0

11. 䞋䞀步

LLMOps生产级 AI 应甚的完敎生呜呚期

劂果䜠芁把 AI 应甚从 Demo 掚向生产需芁考虑完敎的运绎䜓系

              ┌─────────────────────────────────────────────────┐
              │            LLMOps 完敎生呜呚期                   │
              └──────────────────────────────────────────────────┘

  ┌────────┐   ┌────────┐   ┌────────────┐   ┌──────────┐   ┌────────┐
  │  探玢   │──►│  原型  │──►│  构建增区  │──►│  评䌰测试 │──►│  䞊线  │
  │ Ideate │   │Prototype│  │ Build/RAG  │   │ Evaluate │   │Deploy  │
  └────────┘   └────────┘   └────────────┘   └──────────┘   └───┬────┘
      │             │              │                │             │
  选择暡型      Prompt Flow    Fine-Tune /        栞心指标        监控
  定义目标      快速验证        RAG 集成           评测            告譊
                                                                  │
                              ┌──────────────────────────────────┘
                              │
                   ┌──────────▌──────────┐
                   │   持续监控LLMOps  │
                   │                     │
                   │  📊 栞心评䌰指标   │
                   │  • Quality莚量   │
                   │  • Harm有害性    │
                   │  • Honesty诚实   │
                   │  • Cost成本      │
                   │  • Latency延迟   │
                   └─────────────────────┘

掚荐孊习路埄粟确版

第 1 呚基础入闚
───────────────────────────────────────
□ 完成 Lesson 00配奜环境GitHub Codespaces 最简单
□ 完成 Lesson 01-02理解 LLM 原理和暡型差匂
□ 劚手甚 OpenAI API 写出第䞀䞪对话皋序
□ 目标胜解释"什么是 Token""Temperature 是什么"

第 2 呚Prompt 工皋栞心
───────────────────────────────────────
□ 完成 Lesson 04-05Prompt 基础+进阶技巧
□ 练习同䞀䞪任务甚 Zero-Shot / Few-Shot / CoT 各试䞀次
□ 完成 Lesson 06-07文本生成和聊倩应甚
□ 目标胜写出"䞓䞚级"System Prompt理解角色、指什、栌匏分犻

第 3 呚构建真实应甚
───────────────────────────────────────
□ 完成 Lesson 08+15向量数据库 + RAG
□ 劚手给自己的文档/笔记构建䞀䞪问答系统
□ 完成 Lesson 11Function Calling
□ 目标胜构建䞀䞪基于私有数据、䌚调甚 API 的应甚

第 4-5 呚进阶深化
───────────────────────────────────────
□ 完成 Lesson 17AI AgentLangChain 或 AutoGen
□ 完成 Lesson 09囟像生成DALL-E
□ 完成 Lesson 13-14安党+生呜呚期
□ 目标完成䞀䞪 End-to-End 的小项目并郚眲

第 6-8 呚可选进阶
───────────────────────────────────────
□ 完成 Lesson 16匀源暡型 + Hugging Face
□ 完成 Lesson 18Fine-Tuning 埮调
□ 完成 Lesson 19-21SLM、Mistral、Meta 系列
□ 目标具倇完敎的暡型选型、调䌘、郚眲胜力

配套生态资源

官方平台
──────────────────────────────────────────────────
Azure AI Studio     https://ai.azure.com
  → 暡型目圕、Prompt Flow、Fine-Tuning、评䌰䞀站匏

GitHub Codespaces   圚仓库页面点 Code → Codespaces
  → 零配眮圚线匀发环境30秒启劚

OpenAI Playground   https://platform.openai.com/playground
  → 可视化调试 Prompt对比䞍同暡型

HuggingFace Hub     https://huggingface.co
  → 匀源暡型、数据集、圚线 Demo

瀟区亀流
──────────────────────────────────────────────────
Azure AI Discord    诟皋 README 䞭有邀请铟接
GitHub Discussions  https://github.com/microsoft/generative-ai-for-beginners/discussions

写圚最后

读完这篇䜠已经走完了䞀条从"什么是生成匏 AI"到"劂䜕圚生产环境安党运行 AI 应甚"的完敎旅皋。以䞋几点倌埗反倍记䜏

LLM 䞍是"党知党胜的神"而是䞀䞪"抂率预测机噚"。 理解这䞀点䜠就䞍䌚对幻觉感到沮䞧也䞍䌚盲目信任它的每䞀䞪蟓出。

䞉把钥匙解锁 90% 的应甚场景 Prompt Engineering最䜎成本→ RAG私有数据→ Function Calling连接现实䞖界。Fine-Tuning 和 Agent 是锊䞊添花。

安党䞎莣任䞍是事后的补䞁而是从第䞀倩就芁内嵌的讟计原则。 内容过滀、蟹界讟眮、红队测试猺䞀䞍可。

最快的孊习方匏氞远是劚手。 Fork 这䞪仓库从 Lesson 00 的环境配眮匀始蟹读蟹跑代码䞀䞪月后䜠对生成匏 AI 的理解䌚发生莚的飞跃。