跳转至

02 - 大模型应用开发

⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。

目标: 掌握大模型应用开发,能构建生产级AI应用

时间: 4-6周

核心原则: 理解大模型原理,掌握应用开发最佳实践


🎯 2024-2025大模型发展趋势

最新趋势

Text Only
1. 大模型轻量化
   - 从GPT-4到Llama、Qwen等开源模型
   - 端侧部署成为趋势
   - 模型压缩技术(量化、剪枝、蒸馏)

2. 推理能力增强
   - Chain-of-Thought (CoT)
   - Reasoning Models (o1, DeepSeek-R1)
   - 多步推理和逻辑分析

3. AI Agent爆发
   - AutoGPT、LangChain、LlamaIndex
   - 多Agent协作
   - 工具调用能力

4. 多模态融合
   - GPT-4V、Claude 3 Vision
   - 文本+图像+音频+视频
   - 统一多模态模型

5. AI辅助编程
   - Claude Code、Cursor、GitHub Copilot
   - 氛围编程(Vibe Coding)
   - 但:需要保持独立思考能力!

📚 核心内容

1. 大模型基础

Transformer架构回顾

Python
# Transformer核心组件
import torch
import torch.nn as nn

class MultiHeadAttention(nn.Module):
    def __init__(self, d_model, num_heads):
        super().__init__()  # super()调用父类方法
        self.d_model = d_model
        self.num_heads = num_heads
        self.head_dim = d_model // num_heads

        self.q_linear = nn.Linear(d_model, d_model)
        self.k_linear = nn.Linear(d_model, d_model)
        self.v_linear = nn.Linear(d_model, d_model)
        self.out_linear = nn.Linear(d_model, d_model)

    def forward(self, query, key, value, mask=None):
        batch_size = query.size(0)

        # 线性变换并分头
        Q = self.q_linear(query).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)
        K = self.k_linear(key).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)
        V = self.v_linear(value).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)

        # 注意力计算
        scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim))
        if mask is not None:
            scores = scores.masked_fill(mask == 0, -1e9)

        attn = torch.softmax(scores, dim=-1)
        context = torch.matmul(attn, V)

        # 合并头并输出
        context = context.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)
        return self.out_linear(context)

大模型 vs 小模型

特性 大模型 (GPT-4/Claude) 小模型 (Llama/Qwen)
参数量 100B+ 7B-70B
推理成本
部署方式 云端API 本地/边缘
适用场景 复杂任务 实时应用
定制化 有限 可微调

2. Prompt工程进阶

基础Prompt技巧

Python
# 1. 角色设定
system_prompt = """你是一位资深Python开发工程师,擅长代码审查和性能优化。
请对用户的代码进行审查,指出潜在问题并提供改进建议。"""

# 2. Few-Shot示例
few_shot_prompt = """
将自然语言转换为SQL查询:

示例1:
用户: 查询年龄大于25岁的用户
SQL: SELECT * FROM users WHERE age > 25;

示例2:
用户: 统计每个部门的平均工资
SQL: SELECT department, AVG(salary) FROM employees GROUP BY department;

现在请转换:
用户: {user_input}
SQL:
"""

# 3. Chain-of-Thought (CoT)
cot_prompt = """
问题: 一个农场有鸡和兔,头共35个,脚共94只。鸡和兔各有多少只?

让我们一步步思考:
1. 设鸡有x只,兔有y只
2. 根据头的数量:x + y = 35
3. 根据脚的数量:2x + 4y = 94
4. 从方程1得:x = 35 - y
5. 代入方程2:2(35-y) + 4y = 94
6. 70 - 2y + 4y = 94
7. 2y = 24
8. y = 12, x = 23

答案:鸡23只,兔12只
"""

高级Prompt技巧

Python
# 1. ReAct模式 (Reasoning + Acting)
react_prompt = """
你可以使用以下工具:
- search(query): 搜索信息
- calculator(expression): 计算表达式
- code_interpreter(code): 执行Python代码

请按照以下格式回答:
思考: 我需要...
行动: tool_name(arguments)
观察: 工具返回的结果
...(重复思考-行动-观察)
最终答案: ...

问题: 2024年诺贝尔物理学奖得主是谁?他们的主要贡献是什么?
"""

# 2. Self-Consistency
self_consistency_prompt = """
请对以下问题给出5个不同的推理路径和答案,然后选择最一致的答案。

问题: {question}

路径1:
推理: ...
答案: ...

路径2:
推理: ...
答案: ...

...(其他路径)

最一致的答案是: ...
"""

# 3. Tree of Thoughts (ToT)
tot_prompt = """
问题: 如何设计一个高并发的电商系统?

请从多个角度思考,并构建思维树:

角度1: 架构层面
- 微服务拆分
- 服务治理
- ...

角度2: 数据库层面
- 分库分表
- 读写分离
- ...

角度3: 缓存层面
- 多级缓存
- 缓存一致性
- ...

综合以上角度,最佳方案是: ...
"""

3. RAG(检索增强生成)

RAG架构

Python
# RAG完整流程(LCEL方式,替代已废弃的 VectorDBQA/LLMChain)
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

class RAGSystem:
    def __init__(self):
        self.embeddings = OpenAIEmbeddings()
        self.llm = ChatOpenAI(model="gpt-4o", temperature=0)
        self.vector_store = None

    def load_documents(self, file_paths):
        """加载文档"""
        documents = []
        for path in file_paths:
            if path.endswith('.pdf'):
                loader = PyPDFLoader(path)
            else:
                loader = TextLoader(path)
            documents.extend(loader.load())
        return documents

    def split_documents(self, documents, chunk_size=1000, chunk_overlap=200):
        """文档分块"""
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=chunk_size,
            chunk_overlap=chunk_overlap,
            length_function=len
        )
        return text_splitter.split_documents(documents)

    def create_vector_store(self, texts):
        """创建向量数据库"""
        self.vector_store = FAISS.from_documents(texts, self.embeddings)
        return self.vector_store

    def query(self, question, k=3):
        """RAG查询(LCEL方式)"""
        retriever = self.vector_store.as_retriever(search_kwargs={"k": k})

        system_prompt = """基于以下上下文回答问题。如果上下文中没有相关信息,请说"我不知道"。

{context}"""

        prompt = ChatPromptTemplate.from_messages([
            ("system", system_prompt),
            ("human", "{input}")
        ])

        question_answer_chain = create_stuff_documents_chain(self.llm, prompt)
        rag_chain = create_retrieval_chain(retriever, question_answer_chain)

        result = rag_chain.invoke({"input": question})
        return result["answer"], result["context"]

# 使用示例
rag = RAGSystem()
docs = rag.load_documents(['./docs/manual.pdf', './docs/faq.txt'])
texts = rag.split_documents(docs)
rag.create_vector_store(texts)

answer, sources = rag.query("如何重置密码?")
print(answer)

高级RAG技术

Python
# 1. 混合检索(向量+关键词)
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever

class HybridRAG:
    def __init__(self, documents):
        # BM25检索器
        self.bm25_retriever = BM25Retriever.from_documents(documents)
        self.bm25_retriever.k = 2

        # 向量检索器
        self.vector_retriever = FAISS.from_documents(
            documents, OpenAIEmbeddings()
        ).as_retriever(search_kwargs={"k": 2})

        # 混合检索器
        self.ensemble_retriever = EnsembleRetriever(
            retrievers=[self.bm25_retriever, self.vector_retriever],
            weights=[0.5, 0.5]
        )

# 2. 重排序(Reranking)
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.document_compressors import LLMChainExtractor

class RerankRAG:
    def __init__(self, base_retriever, llm):
        compressor = LLMChainExtractor.from_llm(llm)  # 注意:生产环境推荐用CrossEncoder重排序
        self.compression_retriever = ContextualCompressionRetriever(
            base_compressor=compressor,
            base_retriever=base_retriever
        )

# 3. 多跳检索(Multi-hop)
class MultiHopRAG:
    def query(self, question, max_hops=3):
        current_question = question
        all_contexts = []

        for hop in range(max_hops):
            # 检索相关文档
            docs = self.retriever.get_relevant_documents(current_question)
            context = "\n".join([d.page_content for d in docs])
            all_contexts.append(context)

            # 生成子问题或判断是否需要继续
            sub_question = self.generate_sub_question(question, context)
            if sub_question is None:
                break
            current_question = sub_question

        # 综合所有上下文生成答案
        final_context = "\n\n".join(all_contexts)
        return self.generate_answer(question, final_context)

4. AI Agent开发

Agent架构

Python
# LangChain Agent(LCEL方式)
from langchain.agents import Tool, AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
from langchain_community.utilities import SerpAPIWrapper
from langchain_core.prompts import ChatPromptTemplate

# 定义工具
def calculator(expression: str) -> str:
    """安全的数学计算"""
    import numexpr  # 比 eval 更安全
    return str(numexpr.evaluate(expression))

tools = [
    Tool(
        name="Search",
        func=SerpAPIWrapper().run,
        description="用于搜索最新信息"
    ),
    Tool(
        name="Calculator",
        func=calculator,
        description="用于数学计算,输入数学表达式"
    ),
]

# 创建Agent
llm = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的AI助手,可以使用工具回答问题。\n\n"
               "可用工具:\n{tools}\n工具名: {tool_names}"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 运行Agent
response = agent_executor.invoke({
    "input": "2024年中国的GDP是多少?增长了多少百分比?"
})

多Agent系统

Python
# CrewAI多Agent协作
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

# 定义Agents
researcher = Agent(
    role='研究员',
    goal='收集和分析技术信息',
    backstory='你是一位资深技术研究员,擅长快速学习新技术',
    verbose=True,
    allow_delegation=False,
    llm=ChatOpenAI(model="gpt-4o", temperature=0.7)
)

writer = Agent(
    role='技术作家',
    goal='将技术内容转化为易读的文章',
    backstory='你是一位技术作家,擅长将复杂概念简单化',
    verbose=True,
    allow_delegation=False,
    llm=ChatOpenAI(model="gpt-4o", temperature=0.7)
)

# 定义Tasks
task1 = Task(
    description='研究2024年最新的前端框架趋势,列出3个最重要的趋势',
    agent=researcher,
    expected_output='一份包含3个前端趋势的详细报告'
)

task2 = Task(
    description='基于研究报告,撰写一篇面向开发者的技术博客文章',
    agent=writer,
    expected_output='一篇1000字左右的技术博客文章'
)

# 创建Crew
crew = Crew(
    agents=[researcher, writer],
    tasks=[task1, task2],
    process=Process.sequential,
    verbose=True
)

# 运行
result = crew.kickoff()
print(result)

5. 模型微调

LoRA微调

Python
# 使用PEFT进行LoRA微调
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from trl import SFTTrainer

# 加载基础模型
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    load_in_4bit=True,  # 量化加载
    torch_dtype=torch.float16,
    device_map="auto"
)

# 准备模型
model = prepare_model_for_kbit_training(model)

# LoRA配置
lora_config = LoraConfig(
    r=16,  # LoRA秩
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],  # 目标模块
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

# 应用LoRA
model = get_peft_model(model, lora_config)

# 训练参数
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    optim="paged_adamw_32bit",
    save_steps=100,
    logging_steps=10,
    learning_rate=2e-4,
    weight_decay=0.001,
    fp16=True,
    bf16=False,
    max_grad_norm=0.3,
    max_steps=-1,
    warmup_ratio=0.03,
    group_by_length=True,
    lr_scheduler_type="constant",
)

# 训练
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=lora_config,
    dataset_text_field="text",
    max_seq_length=512,
    tokenizer=tokenizer,
    args=training_args,
)

trainer.train()

6. 模型部署与优化

vLLM部署

Python
# 使用vLLM进行高效推理
from vllm import LLM, SamplingParams

# 加载模型
llm = LLM(
    model="meta-llama/Llama-2-7b-hf",
    tensor_parallel_size=1,  # GPU数量
    gpu_memory_utilization=0.9,
    max_num_seqs=256
)

# 采样参数
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.95,
    max_tokens=512
)

# 批量推理
prompts = [
    "The future of AI is",
    "In the next decade, technology will",
    "The most important skill for developers is"
]

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

模型量化

Python
# GPTQ量化
from transformers import AutoModelForCausalLM, AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig

# 量化配置
quantize_config = BaseQuantizeConfig(
    bits=4,  # 4-bit量化
    group_size=128,
    desc_act=False
)

# 量化模型
model = AutoGPTQForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantize_config=quantize_config
)

# 执行量化
model.quantize(examples)

# 保存量化模型
model.save_quantized("./llama-7b-4bit")

🎯 实战项目:智能客服系统

项目需求

Text Only
构建一个企业级智能客服系统:
1. 基于RAG回答产品相关问题
2. 支持多轮对话
3. 能处理复杂查询(订单查询、退换货等)
4. 支持转人工
5. 对话质量评估

技术架构

Text Only
前端: React + WebSocket
后端: FastAPI + LangChain
向量数据库: ChromaDB/Pinecone
大模型: GPT-4 / Claude / 本地Llama
监控: LangSmith

核心代码

Python
# 智能客服Agent(使用 create_react_agent + AgentExecutor)
from langchain.agents import Tool, AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import HumanMessage, AIMessage

class CustomerServiceAgent:
    def __init__(self):
        self.rag_system = RAGSystem()  # RAG系统
        self.order_system = OrderAPI()  # 订单系统API
        self.chat_history = []  # 手动维护对话历史(替代已弃用的 ConversationBufferMemory)

        self.tools = [
            Tool(
                name="ProductFAQ",
                func=self.rag_system.query,
                description="查询产品FAQ和文档"
            ),
            Tool(
                name="OrderQuery",
                func=self.order_system.query_order,
                description="查询订单状态"
            ),
            Tool(
                name="HumanHandoff",
                func=self.human_handoff,
                description="转接到人工客服"
            )
        ]

        llm = ChatOpenAI(model="gpt-4o", temperature=0)
        prompt = ChatPromptTemplate.from_messages([
            ("system", "你是一个专业的智能客服Agent。请使用工具回答用户问题。\n\n"
                       "可用工具:\n{tools}\n工具名: {tool_names}"),
            ("placeholder", "{chat_history}"),
            ("human", "{input}"),
            ("placeholder", "{agent_scratchpad}"),
        ])
        agent = create_react_agent(llm, self.tools, prompt)
        self.agent_executor = AgentExecutor(agent=agent, tools=self.tools, verbose=True)

    def chat(self, user_input):
        response = self.agent_executor.invoke({
            "input": user_input,
            "chat_history": self.chat_history,
        })

        # 保存对话历史
        self.chat_history.append(HumanMessage(content=user_input))
        self.chat_history.append(AIMessage(content=response["output"]))

        return response["output"]

✅ 学习检查点

  • 理解Transformer和大模型原理
  • 掌握Prompt工程技巧
  • 能实现RAG系统
  • 能开发AI Agent
  • 能进行模型微调
  • 能部署和优化大模型

📚 推荐资源

开源项目

  • LangChain: 应用开发框架
  • LlamaIndex: 数据增强LLM
  • vLLM: 高效推理引擎
  • Ollama: 本地运行大模型

在线平台

  • Hugging Face: 模型和数据集
  • LangSmith: LLM应用监控
  • OpenAI API: GPT系列模型
  • Anthropic API: Claude模型

记住:大模型是工具,不是替代品。理解原理、掌握应用、保持独立思考! 🤖