AI Agent技术完整指南 第四部分:Transformer架构与实践

📚 目录

  1. Transformer基础:它是什么?
  2. Transformer在Agent中的作用
  3. 核心模块关系:LLM、RAG、Prompt、Transformer
  4. 模块间交互流程详解
  5. 完整实现代码解析
  6. 实战演练:一步步构建Agent
  7. 常见问题与优化

1. Transformer基础:它是什么?

1.1 Transformer的本质

Transformer 是一种深度学习架构,专门用于处理序列数据(如文本、语音等)。

核心特点

  • 📐 架构:基于注意力机制(Attention Mechanism)的神经网络
  • 🎯 用途:理解语言、生成文本、翻译、问答等
  • 🧠 能力:能够捕捉序列中不同位置之间的依赖关系

1.2 Transformer的物理形态

在Agent系统中,Transformer通常以**大语言模型(LLM)**的形式出现:

复制代码
Transformer架构
    ↓
[训练过程:使用海量文本数据]
    ↓
训练好的模型(如GPT、ChatGLM、DeepSeek)
    ↓
通过API或本地部署提供服务
    ↓
我们通过代码调用它

实际例子

  • GPT-3.5/GPT-4:OpenAI的Transformer模型
  • DeepSeek:国产Transformer模型
  • ChatGLM:清华的Transformer模型

1.3 Transformer的工作原理(简化版)

复制代码
输入文本: "什么是RAG?"
    ↓
【步骤1: 分词(Tokenization)】
将文本切分成token(词或子词)
["什么", "是", "RAG", "?"]
    ↓
【步骤2: 词向量化(Embedding)】
每个token转为数字向量
"RAG" → [0.1, 0.3, -0.2, 0.5, ...] (768维向量)
    ↓
【步骤3: 位置编码(Positional Encoding)】
添加位置信息,告诉模型每个词的位置
    ↓
【步骤4: 多层Transformer处理】
通过12-96层Transformer层,每层包含:
  - 自注意力机制(Self-Attention):关注重要信息
  - 前馈网络(Feed-Forward):处理信息
  - 层归一化(Layer Norm):稳定训练
    ↓
【步骤5: 输出层】
生成下一个token的概率分布
    ↓
【步骤6: 解码】
根据概率分布生成回答
"RAG是检索增强生成技术..."

1.4 为什么叫"Transformer"?

Transform = 转换、变换

Transformer的作用是:将输入文本转换为输出文本

复制代码
输入: "什么是RAG?"
    ↓ [Transform/转换]
输出: "RAG是检索增强生成技术..."

2. Transformer在Agent中的作用

2.1 Agent系统的核心组件

一个完整的Agent系统通常包含:

复制代码
┌─────────────────────────────────────────┐
│          Agent系统架构                   │
├─────────────────────────────────────────┤
│                                         │
│  ┌──────────┐  ┌──────────┐  ┌────────┐│
│  │  Prompt  │→ │   LLM    │← │  RAG   ││
│  │ (提示词) │  │(Transformer)│(检索) ││
│  └──────────┘  └──────────┘  └────────┘│
│       │            │            │       │
│       └────────────┴────────────┘       │
│                  │                       │
│            ┌─────▼─────┐                │
│            │   Agent   │                │
│            │  (协调层)  │                │
│            └───────────┘                │
└─────────────────────────────────────────┘

2.2 Transformer在Agent中的三大作用

作用1: 理解用户输入(理解能力)
复制代码
用户输入: "帮我查一下图书馆的开放时间"
    ↓
[Transformer处理]
    ↓
理解结果:
  - 意图:查询信息
  - 实体:图书馆、开放时间
  - 动作:检索相关信息
作用2: 生成回答(生成能力)
复制代码
上下文 + 用户问题
    ↓
[Transformer处理]
    ↓
生成回答: "图书馆的开放时间是周一至周五 9:00-21:00..."
作用3: 处理上下文(记忆能力)
复制代码
对话历史:
  - 用户: "你好"
  - Agent: "你好,有什么可以帮助你的?"
  - 用户: "图书馆在哪?"
    ↓
[Transformer记住对话历史]
    ↓
生成连贯回答: "图书馆位于校园中心..."

2.3 Transformer vs 传统规则系统

特性 传统规则系统 Transformer-based Agent
理解方式 关键词匹配 语义理解
灵活性 低(需要写规则) 高(自动学习)
上下文 不支持 支持多轮对话
扩展性 难(需要改代码) 易(通过Prompt调整)
准确性 依赖规则质量 依赖模型能力

3. 核心模块关系:LLM、RAG、Prompt、Transformer

3.1 模块定义与关系图

模块1: Transformer(底层架构)

定义:深度学习模型架构,是LLM的基础

位置:最底层,是其他模块的基础

复制代码
Transformer架构
    ↓
训练好的模型参数
    ↓
封装成LLM服务
模块2: LLM(大语言模型)

定义:基于Transformer架构训练好的模型,提供文本生成能力

与Transformer的关系

  • LLM = Transformer架构 + 训练好的参数
  • 我们通过LLM API调用Transformer的能力

实际例子

python 复制代码
# LLM是对Transformer的封装
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="deepseek-chat",  # 这是一个基于Transformer的LLM
    api_key="your-key"
)

# 调用LLM = 调用底层的Transformer
response = llm.invoke("什么是RAG?")
模块3: Prompt(提示词)

定义:给LLM的指令和上下文,告诉它要做什么

与LLM/Transformer的关系

  • Prompt是输入给Transformer的文本
  • Transformer根据Prompt生成回答

例子

python 复制代码
# Prompt = 系统提示 + 用户问题
prompt = """
你是一个专业的图书馆助手。
请回答用户的问题。

用户问题:图书馆开放时间是多少?
"""

# Transformer根据这个Prompt生成回答
response = llm.invoke(prompt)
模块4: RAG(检索增强生成)

定义:从外部知识库检索相关信息,增强LLM的回答

与LLM/Transformer的关系

  • RAG检索到的文档 → 作为Prompt的一部分 → 输入给Transformer
  • Transformer基于检索到的信息生成更准确的回答

关系图

复制代码
用户问题
    ↓
[RAG检索] → 找到相关文档
    ↓
[构建Prompt] → Prompt = 系统提示 + 检索到的文档 + 用户问题
    ↓
[Transformer处理] → 基于Prompt生成回答
    ↓
最终回答

3.2 完整关系图

复制代码
┌─────────────────────────────────────────────────────────┐
│                    Agent系统                              │
└─────────────────────────────────────────────────────────┘
                            │
        ┌───────────────────┼───────────────────┐
        │                   │                   │
        ▼                   ▼                   ▼
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│   Prompt     │    │     LLM      │    │     RAG      │
│  (提示词)    │    │ (Transformer)│    │   (检索)     │
└──────┬───────┘    └──────┬──────┘    └──────┬───────┘
       │                    │                   │
       │                    │                   │
       │    ┌───────────────┘                   │
       │    │                                    │
       │    ▼                                    │
       │  ┌──────────────┐                      │
       │  │ Transformer  │                      │
       │  │  (底层架构)  │                      │
       │  └──────────────┘                      │
       │                                        │
       └────────────────────────────────────────┘
                        │
                        ▼
                  ┌──────────┐
                  │  Agent   │
                  │ (协调层)  │
                  └──────────┘

3.3 数据流向详解

场景1: 简单问答(不使用RAG)
复制代码
用户输入: "你好"
    ↓
[构建Prompt]
  Prompt = "你是一个友好的助手。\n用户:你好"
    ↓
[调用LLM(Transformer)]
  LLM接收Prompt → Transformer处理 → 生成回答
    ↓
Agent回答: "你好!有什么可以帮助你的?"
场景2: 知识问答(使用RAG)
复制代码
用户输入: "图书馆开放时间?"
    ↓
[RAG检索]
  查询向量化 → 相似度搜索 → 找到相关文档
  "图书馆开放时间是周一至周五 9:00-21:00"
    ↓
[构建Prompt]
  Prompt = """
  你是一个图书馆助手。
  
  检索到的信息:
  图书馆开放时间是周一至周五 9:00-21:00
  
  用户问题:图书馆开放时间?
  """
    ↓
[调用LLM(Transformer)]
  Transformer基于Prompt(包含检索信息)生成回答
    ↓
Agent回答: "图书馆开放时间是周一至周五 9:00-21:00"

3.4 模块职责总结

模块 职责 输入 输出 与Transformer的关系
Transformer 底层架构,处理文本 Token序列 Token概率分布 核心引擎
LLM 封装Transformer,提供API 文本消息 文本回答 LLM = Transformer + 参数
Prompt 指导Transformer行为 用户意图 格式化指令 Prompt是Transformer的输入
RAG 提供外部知识 用户查询 相关文档 RAG结果作为Prompt的一部分
Agent 协调所有模块 用户输入 最终回答 Agent调用LLM(Transformer)

4. 模块间交互流程详解

4.1 完整交互流程图

复制代码
┌─────────────────────────────────────────────────────────────┐
│  步骤0: 用户输入                                             │
│  "图书馆开放时间是多少?"                                    │
└────────────────────┬────────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────────┐
│  步骤1: Agent接收用户输入                                    │
│  agent.invoke("图书馆开放时间是多少?")                       │
└────────────────────┬────────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────────┐
│  步骤2: 判断是否需要RAG检索                                  │
│  should_retrieve() → True                                   │
└────────────────────┬────────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────────┐
│  步骤3: RAG检索模块                                          │
│  ┌──────────────────────────────────────┐                  │
│  │ 3.1 查询向量化                        │                  │
│  │ "图书馆开放时间" → [0.1, 0.3, ...]  │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 3.2 相似度搜索                        │                  │
│  │ 在向量数据库中查找最相似的文档        │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 3.3 返回相关文档                      │                  │
│  │ Doc1: "图书馆开放时间:周一至周五..." │                  │
│  └──────────────────────────────────────┘                  │
└────────────────────┬────────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────────┐
│  步骤4: 构建Prompt                                           │
│  ┌──────────────────────────────────────┐                  │
│  │ 4.1 系统提示                          │                  │
│  │ "你是一个图书馆助手..."               │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 4.2 添加RAG检索结果                  │                  │
│  │ "检索到的信息:图书馆开放时间..."     │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 4.3 添加用户问题                     │                  │
│  │ "用户问题:图书馆开放时间是多少?"    │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 最终Prompt:                           │                  │
│  │ SystemMessage + 检索信息 + 用户问题   │                  │
│  └──────────────────────────────────────┘                  │
└────────────────────┬────────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────────┐
│  步骤5: 调用LLM(Transformer)                              │
│  ┌──────────────────────────────────────┐                  │
│  │ 5.1 LLM接收Prompt                    │                  │
│  │ messages = [SystemMessage, ...]      │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 5.2 Transformer内部处理                │                  │
│  │ - Tokenization: 分词                  │                  │
│  │ - Embedding: 词向量化                 │                  │
│  │ - Attention: 注意力计算                │                  │
│  │ - Generation: 逐token生成             │                  │
│  └──────────────────────────────────────┘                  │
│  ┌──────────────────────────────────────┐                  │
│  │ 5.3 返回生成的回答                     │                  │
│  │ AIMessage("图书馆开放时间是...")      │                  │
│  └──────────────────────────────────────┘                  │
└────────────────────┬────────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────────┐
│  步骤6: Agent返回结果                                        │
│  response = "图书馆开放时间是周一至周五 9:00-21:00"          │
└─────────────────────────────────────────────────────────────┘

4.2 关键交互点详解

交互点1: RAG → Prompt
python 复制代码
# RAG检索结果
rag_results = [
    "图书馆开放时间:周一至周五 9:00-21:00",
    "周末开放时间:10:00-18:00"
]

# 将RAG结果整合到Prompt中
prompt = f"""
你是一个图书馆助手。

检索到的相关信息:
{chr(10).join(rag_results)}

用户问题:图书馆开放时间是多少?
"""
交互点2: Prompt → LLM
python 复制代码
# Prompt转换为消息格式
messages = [
    SystemMessage(content="你是一个图书馆助手..."),
    HumanMessage(content="图书馆开放时间是多少?")
]

# 调用LLM(内部调用Transformer)
response = llm.invoke(messages)
交互点3: LLM → Transformer
python 复制代码
# LLM内部调用Transformer的过程(简化版)
def llm_invoke(messages):
    # 1. 将消息转换为文本
    text = format_messages(messages)
    
    # 2. Transformer处理
    tokens = tokenize(text)  # 分词
    embeddings = embed(tokens)  # 向量化
    hidden_states = transformer_layers(embeddings)  # Transformer层处理
    output = generate(hidden_states)  # 生成
    
    # 3. 返回结果
    return decode(output)

4.3 多轮对话的交互流程

复制代码
第一轮对话:
用户: "你好"
    ↓
[构建Prompt] → "你是一个助手。用户:你好"
    ↓
[Transformer] → "你好!有什么可以帮助你的?"
    ↓
[保存对话历史]

第二轮对话:
用户: "图书馆在哪?"
    ↓
[构建Prompt] → "你是一个助手。
                历史对话:
                - 用户:你好
                - 助手:你好!有什么可以帮助你的?
                用户:图书馆在哪?"
    ↓
[Transformer] → 基于完整上下文生成回答
    ↓
"图书馆位于校园中心..."

5. 完整实现代码解析

5.1 代码结构说明

完整代码在 agent_transformer_demo.py 中,包含三个类:

  1. SimpleAgent - 基础Agent(只用Transformer/LLM)
  2. RAGAgent - RAG增强Agent(RAG + Transformer)
  3. CompleteAgentWorkflow - 完整工作流(所有模块协作)

5.2 关键代码片段解析

片段1: 初始化LLM(Transformer的封装)
python 复制代码
from langchain_openai import ChatOpenAI

# 这里初始化的是LLM,它内部封装了Transformer
llm = ChatOpenAI(
    model="deepseek-chat",  # 基于Transformer的模型
    api_key=api_key,
    base_url="https://api.deepseek.com",
    temperature=0.7,  # 控制随机性
    max_tokens=2000   # 最大输出长度
)

# 当我们调用llm.invoke()时,实际发生的是:
# 1. 将消息转换为文本格式
# 2. 发送到API(或本地模型)
# 3. Transformer处理文本
# 4. 返回生成的文本

关键理解

  • ChatOpenAI 是对Transformer模型的封装
  • llm.invoke() 内部调用Transformer
  • 我们不需要直接操作Transformer,通过LLM API即可
片段2: 构建Prompt
python 复制代码
from langchain_core.messages import SystemMessage, HumanMessage

# Prompt的构建方式
system_prompt = "你是一个专业的图书馆助手。"
user_question = "图书馆开放时间是多少?"

# 方式1: 简单Prompt
messages = [
    SystemMessage(content=system_prompt),
    HumanMessage(content=user_question)
]

# 方式2: 带RAG结果的Prompt
rag_context = "检索到的信息:图书馆开放时间是周一至周五 9:00-21:00"
messages = [
    SystemMessage(content=f"{system_prompt}\n\n{rag_context}"),
    HumanMessage(content=user_question)
]

# 调用LLM(Transformer处理这个Prompt)
response = llm.invoke(messages)

关键理解

  • Prompt = 系统提示 + 上下文 + 用户问题
  • RAG结果作为上下文的一部分加入Prompt
  • Transformer根据完整的Prompt生成回答
片段3: RAG检索与Prompt整合
python 复制代码
from langchain_community.vectorstores import Chroma

# 1. RAG检索
vectorstore = Chroma(...)
docs = vectorstore.similarity_search("图书馆开放时间", k=2)
# 返回: ["图书馆开放时间:周一至周五 9:00-21:00", ...]

# 2. 将RAG结果整合到Prompt
context = "\n\n".join([doc.page_content for doc in docs])
prompt = f"""
你是一个图书馆助手。

检索到的相关信息:
{context}

用户问题:图书馆开放时间是多少?
"""

# 3. 调用Transformer
messages = [SystemMessage(content=prompt)]
response = llm.invoke(messages)

关键理解

  • RAG检索 → 找到相关文档
  • 文档内容 → 加入Prompt作为上下文
  • Prompt → 输入给Transformer
  • Transformer → 基于上下文生成回答
片段4: 完整工作流
python 复制代码
class CompleteAgentWorkflow:
    def process(self, user_input: str):
        # 步骤1: 判断是否需要RAG
        if self._should_retrieve(user_input):
            # 步骤2: RAG检索
            context = self._retrieve_context(user_input)
        else:
            context = ""
        
        # 步骤3: 构建Prompt(包含RAG结果)
        messages = self._build_messages(user_input, context)
        
        # 步骤4: 调用LLM(Transformer处理)
        response = self.llm.invoke(messages)
        
        # 步骤5: 返回结果
        return response.content

关键理解

  • Agent协调RAG、Prompt、LLM三个模块
  • RAG提供知识 → Prompt整合信息 → LLM(Transformer)生成回答
  • 这是一个完整的端到端流程

6. 实战演练:一步步构建Agent

6.1 第一步:最简单的Agent(只用Transformer)

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 1. 初始化LLM(Transformer)
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key="your-api-key",
    base_url="https://api.deepseek.com"
)

# 2. 构建Prompt(最简单的形式)
messages = [HumanMessage(content="你好")]

# 3. 调用Transformer
response = llm.invoke(messages)
print(response.content)  # "你好!有什么可以帮助你的?"

理解要点

  • LLM = Transformer的封装
  • Prompt = 用户输入
  • 调用LLM = 调用Transformer

6.2 第二步:添加系统Prompt

python 复制代码
from langchain_core.messages import SystemMessage, HumanMessage

# 1. 初始化LLM
llm = ChatOpenAI(...)

# 2. 构建Prompt(包含系统提示)
messages = [
    SystemMessage(content="你是一个专业的图书馆助手。"),
    HumanMessage(content="图书馆开放时间是多少?")
]

# 3. 调用Transformer
response = llm.invoke(messages)

理解要点

  • SystemMessage = 系统提示,告诉Transformer扮演什么角色
  • HumanMessage = 用户问题
  • Transformer根据系统提示和用户问题生成回答

6.3 第三步:添加RAG检索

python 复制代码
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document

# 1. 初始化RAG系统
embeddings = HuggingFaceEmbeddings(...)
vectorstore = Chroma(embedding_function=embeddings)

# 2. 添加知识库
docs = [Document(page_content="图书馆开放时间:周一至周五 9:00-21:00")]
vectorstore.add_documents(docs)

# 3. 检索相关文档
query = "图书馆开放时间是多少?"
retrieved_docs = vectorstore.similarity_search(query, k=1)

# 4. 构建Prompt(包含RAG结果)
context = retrieved_docs[0].page_content
messages = [
    SystemMessage(content=f"你是一个图书馆助手。\n\n检索到的信息:{context}"),
    HumanMessage(content=query)
]

# 5. 调用Transformer
response = llm.invoke(messages)

理解要点

  • RAG检索 → 找到相关文档
  • 文档内容 → 加入SystemMessage
  • Prompt = 系统提示 + RAG结果 + 用户问题
  • Transformer基于完整Prompt生成回答

6.4 第四步:完整Agent(所有模块协作)

python 复制代码
class CompleteAgent:
    def __init__(self, api_key):
        # 初始化所有模块
        self.llm = ChatOpenAI(...)  # LLM(Transformer)
        self.vectorstore = Chroma(...)  # RAG
        self.conversation_history = []  # 对话历史
    
    def chat(self, user_input):
        # 1. RAG检索
        docs = self.vectorstore.similarity_search(user_input, k=2)
        context = "\n\n".join([d.page_content for d in docs])
        
        # 2. 构建Prompt
        messages = [
            SystemMessage(content=f"检索到的信息:{context}"),
            *self.conversation_history,  # 历史对话
            HumanMessage(content=user_input)
        ]
        
        # 3. 调用Transformer
        response = self.llm.invoke(messages)
        
        # 4. 保存历史
        self.conversation_history.append(HumanMessage(content=user_input))
        self.conversation_history.append(response)
        
        return response.content

理解要点

  • Agent协调RAG、Prompt、LLM三个模块
  • 完整流程:用户输入 → RAG检索 → 构建Prompt → Transformer处理 → 返回回答

7. 常见问题与优化

7.1 概念澄清

Q1: Transformer和LLM是什么关系?

A:

  • Transformer = 架构(设计图)

  • LLM = 基于Transformer架构训练好的模型(建好的房子)

  • 我们通过LLM API调用Transformer的能力

    Transformer架构(设计图)
    ↓ [训练过程]
    LLM模型(建好的房子)
    ↓ [API封装]
    我们可以使用的服务

Q2: Prompt和Transformer怎么交互?

A:

  • Prompt是输入给Transformer的文本

  • Transformer读取Prompt,理解意图,生成回答

  • 就像给AI下指令,它根据指令执行

    Prompt: "你是一个助手。用户:你好"
    ↓ [输入给Transformer]
    Transformer处理
    ↓ [生成回答]
    回答: "你好!有什么可以帮助你的?"

Q3: RAG和Transformer怎么配合?

A:

  • RAG检索相关文档

  • 文档内容作为Prompt的一部分

  • Transformer基于包含RAG结果的Prompt生成回答

    用户问题

    [RAG检索] → 找到文档

    [构建Prompt] → Prompt = 系统提示 + RAG文档 + 用户问题

    [Transformer] → 基于完整Prompt生成回答

7.2 性能优化

优化1: Prompt优化
python 复制代码
# ❌ 不好的Prompt
prompt = "回答这个问题:图书馆开放时间?"

# ✅ 好的Prompt
prompt = """
你是一个专业的图书馆助手。
请基于以下信息回答问题。

检索到的信息:
图书馆开放时间:周一至周五 9:00-21:00

用户问题:图书馆开放时间是多少?

请用专业、友好的方式回答。
"""
优化2: RAG优化
python 复制代码
# 增加检索数量
docs = vectorstore.similarity_search(query, k=5)  # 从3增加到5

# 使用重排序
# 先检索Top-10,再重排序选择Top-3
优化3: 缓存机制
python 复制代码
from functools import lru_cache

@lru_cache(maxsize=100)
def cached_llm_call(prompt: str):
    """缓存相同的Prompt调用"""
    return llm.invoke(prompt)

📊 总结

核心概念关系

复制代码
Transformer(架构)
    ↓
LLM(模型实现)
    ↓
通过Prompt调用
    ↓
RAG提供知识增强
    ↓
Agent协调所有模块

数据流向

复制代码
用户输入
    ↓
[RAG检索] → 相关文档
    ↓
[构建Prompt] → Prompt = 系统提示 + RAG结果 + 用户问题
    ↓
[LLM/Transformer处理] → 生成回答
    ↓
Agent返回结果

关键理解

  1. Transformer = 底层架构,是LLM的基础
  2. LLM = Transformer的封装,我们通过LLM API调用Transformer
  3. Prompt = 给Transformer的指令和上下文
  4. RAG = 提供外部知识,结果加入Prompt
  5. Agent = 协调所有模块,实现完整工作流

下一步学习

  • 📖 深入学习Transformer架构细节(Attention机制等)
  • 🔧 优化Prompt工程(如何写出更好的Prompt)
  • 🚀 扩展RAG能力(重排序、多跳检索等)
  • 📈 性能优化(缓存、批处理、流式输出等)

完整项目代码:

python 复制代码
"""
Agent Transformer 完整演示代码
包含:基础Agent、RAG增强Agent、完整工作流
"""
import os
from typing import List, Optional
from langchain_openai import ChatOpenAI
from langchain_core.messages import (
    BaseMessage, 
    HumanMessage, 
    AIMessage, 
    SystemMessage
)
from langchain_core.documents import Document
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma


# ============================================================================
# 第一部分:基础Agent演示
# ============================================================================

class SimpleAgent:
    """简化版Agent - 展示Transformer核心流程"""
    
    def __init__(self, api_key: str, model: str = "deepseek-chat"):
        """
        初始化Agent
        
        Args:
            api_key: LLM API密钥
            model: 模型名称,默认使用deepseek-chat
        """
        # 初始化Transformer模型(通过LangChain封装)
        self.llm = ChatOpenAI(
            model=model,
            api_key=api_key,
            base_url="https://api.deepseek.com",
            temperature=0.7,
            max_tokens=2000
        )
        
        # 对话历史
        self.conversation_history: List[BaseMessage] = []
    
    def chat(self, user_input: str, context: Optional[str] = None) -> str:
        """
        与Agent对话
        
        Args:
            user_input: 用户输入
            context: 可选的上下文信息(来自RAG检索)
        
        Returns:
            Agent的回答
        """
        # 步骤1: 构建消息列表
        messages = []
        
        # 如果有上下文,添加系统消息
        if context:
            system_prompt = f"""你是一个智能助手。请基于以下上下文信息回答用户问题:

上下文信息:
{context}

请基于上下文信息,用专业、友好的方式回答用户的问题。"""
            messages.append(SystemMessage(content=system_prompt))
        
        # 添加对话历史
        messages.extend(self.conversation_history)
        
        # 添加当前用户输入
        messages.append(HumanMessage(content=user_input))
        
        # 步骤2: 调用Transformer
        print("🔄 正在调用Transformer模型...")
        response = self.llm.invoke(messages)
        
        # 步骤3: 保存对话历史
        self.conversation_history.append(HumanMessage(content=user_input))
        self.conversation_history.append(response)
        
        # 步骤4: 返回回答
        return response.content
    
    def reset(self):
        """重置对话历史"""
        self.conversation_history = []
        print("✅ 对话历史已重置")


# ============================================================================
# 第二部分:RAG增强Agent演示
# ============================================================================

class RAGAgent:
    """RAG增强的Agent - 结合检索和Transformer"""
    
    def __init__(self, api_key: str):
        """
        初始化RAG Agent
        
        Args:
            api_key: LLM API密钥
        """
        # 1. 初始化嵌入模型(用于向量化)
        print("📦 初始化嵌入模型...")
        self.embeddings = HuggingFaceEmbeddings(
            model_name="sentence-transformers/all-MiniLM-L6-v2",
            model_kwargs={'device': 'cpu'}
        )
        
        # 2. 初始化向量数据库
        print("📦 初始化向量数据库...")
        self.vectorstore = Chroma(
            persist_directory="./demo_vector_db",
            embedding_function=self.embeddings
        )
        
        # 3. 初始化Transformer模型
        print("📦 初始化Transformer模型...")
        self.llm = ChatOpenAI(
            model="deepseek-chat",
            api_key=api_key,
            base_url="https://api.deepseek.com",
            temperature=0.7,
            max_tokens=2000
        )
        
        print("✅ RAG Agent初始化完成!\n")
    
    def add_knowledge(self, documents: List[Document]):
        """
        添加知识到向量数据库
        
        Args:
            documents: 文档列表
        """
        print(f"📚 添加 {len(documents)} 个文档到知识库...")
        self.vectorstore.add_documents(documents)
        print("✅ 文档添加完成!\n")
    
    def chat(self, query: str, k: int = 3) -> str:
        """
        使用RAG增强的对话
        
        Args:
            query: 用户查询
            k: 检索的文档数量
        
        Returns:
            Agent的回答
        """
        print(f"🔍 检索相关文档(Top-{k})...")
        
        # 步骤1: 检索相关文档
        docs = self.vectorstore.similarity_search(query, k=k)
        
        if not docs:
            print("⚠️  未找到相关文档,将使用Transformer的通用知识回答")
            context = ""
        else:
            print(f"✅ 找到 {len(docs)} 个相关文档")
            # 构建上下文
            context = "\n\n".join([
                f"[文档{i+1}]\n{doc.page_content}" 
                for i, doc in enumerate(docs)
            ])
        
        # 步骤2: 构建提示
        system_prompt = f"""你是一个智能助手。请基于以下检索到的文档内容回答用户问题。

检索到的文档内容:
{context if context else "(未找到相关文档,请基于你的知识回答)"}

回答要求:
1. 优先使用检索到的文档内容
2. 如果文档中没有相关信息,可以基于你的知识补充
3. 保持回答准确、专业、友好
4. 如果引用了文档内容,可以说明来源
"""
        
        # 步骤3: 调用Transformer
        print("🔄 调用Transformer生成回答...")
        messages = [
            SystemMessage(content=system_prompt),
            HumanMessage(content=query)
        ]
        
        response = self.llm.invoke(messages)
        
        print("✅ 回答生成完成!\n")
        return response.content


# ============================================================================
# 第三部分:完整工作流演示
# ============================================================================

class CompleteAgentWorkflow:
    """完整Agent工作流 - 端到端演示"""
    
    def __init__(self, api_key: str):
        """
        初始化完整Agent工作流
        
        Args:
            api_key: LLM API密钥
        """
        print("🚀 初始化完整Agent工作流...")
        print()
        
        # 1. 初始化RAG系统
        print("  [1/4] 初始化RAG系统...")
        self.embeddings = HuggingFaceEmbeddings(
            model_name="sentence-transformers/all-MiniLM-L6-v2",
            model_kwargs={'device': 'cpu'}
        )
        self.vectorstore = Chroma(
            persist_directory="./demo_vector_db",
            embedding_function=self.embeddings
        )
        print("  ✅ RAG系统就绪")
        
        # 2. 初始化Transformer
        print("  [2/4] 初始化Transformer模型...")
        self.llm = ChatOpenAI(
            model="deepseek-chat",
            api_key=api_key,
            base_url="https://api.deepseek.com",
            temperature=0.7,
            max_tokens=2000
        )
        print("  ✅ Transformer就绪")
        
        # 3. 初始化对话历史
        print("  [3/4] 初始化对话历史...")
        self.conversation_history = []
        print("  ✅ 对话历史就绪")
        
        # 4. 初始化知识库
        print("  [4/4] 初始化知识库...")
        self._init_knowledge_base()
        print("  ✅ 知识库就绪")
        
        print("\n✅ 完整Agent工作流初始化完成!\n")
    
    def _init_knowledge_base(self):
        """初始化知识库"""
        docs = [
            Document(page_content="""
            RAG(Retrieval-Augmented Generation)是检索增强生成技术。
            工作流程:1) 用户查询 2) 检索相关文档 3) 构建上下文 4) Transformer生成回答
            """),
            Document(page_content="""
            Transformer使用自注意力机制处理序列数据。
            核心组件:Multi-Head Attention、Feed-Forward Network、Layer Normalization
            """),
            Document(page_content="""
            Agent工作流包括:输入处理、检索增强、Transformer生成、输出格式化
            """),
        ]
        self.vectorstore.add_documents(docs)
    
    def process(self, user_input: str, verbose: bool = True) -> str:
        """
        处理用户输入 - 完整工作流
        
        Args:
            user_input: 用户输入
            verbose: 是否显示详细步骤
        
        Returns:
            Agent的回答
        """
        if verbose:
            print("=" * 70)
            print(f"📥 用户输入: {user_input}")
            print("=" * 70)
            print()
        
        # 步骤1: 判断是否需要检索
        if verbose:
            print("[步骤1] 判断是否需要检索...")
        should_retrieve = self._should_retrieve(user_input)
        
        if verbose:
            print(f"  → 需要检索: {should_retrieve}")
            print()
        
        # 步骤2: 检索相关文档(如果需要)
        context = ""
        if should_retrieve:
            if verbose:
                print("[步骤2] 检索相关文档...")
            context = self._retrieve_context(user_input)
            if verbose:
                print(f"  → 检索到 {len(context.split('[文档'))-1 if '[文档' in context else 0} 个相关文档")
                print()
        
        # 步骤3: 构建消息列表
        if verbose:
            print("[步骤3] 构建消息列表...")
        messages = self._build_messages(user_input, context)
        if verbose:
            print(f"  → 消息数量: {len(messages)}")
            print()
        
        # 步骤4: 调用Transformer
        if verbose:
            print("[步骤4] 调用Transformer生成回答...")
        response = self.llm.invoke(messages)
        if verbose:
            print("  → Transformer处理完成")
            print()
        
        # 步骤5: 保存对话历史
        if verbose:
            print("[步骤5] 保存对话历史...")
        self.conversation_history.append(HumanMessage(content=user_input))
        self.conversation_history.append(AIMessage(content=response.content))
        if verbose:
            print("  → 对话历史已更新")
            print()
        
        # 步骤6: 返回结果
        if verbose:
            print("=" * 70)
            print(f"📤 Agent回答: {response.content}")
            print("=" * 70)
            print()
        
        return response.content
    
    def _should_retrieve(self, query: str) -> bool:
        """判断是否需要检索"""
        # 简单策略:如果对话历史为空或查询包含特定关键词,则检索
        if not self.conversation_history:
            return True
        
        # 如果查询包含"什么是"、"如何"等,可能需要检索
        retrieval_keywords = ["什么是", "如何", "怎么", "介绍", "解释"]
        return any(keyword in query for keyword in retrieval_keywords)
    
    def _retrieve_context(self, query: str, k: int = 3) -> str:
        """检索相关文档"""
        docs = self.vectorstore.similarity_search(query, k=k)
        
        if not docs:
            return ""
        
        context_parts = []
        for i, doc in enumerate(docs, 1):
            context_parts.append(f"[文档{i}]\n{doc.page_content}")
        
        return "\n\n".join(context_parts)
    
    def _build_messages(self, user_input: str, context: str) -> List:
        """构建消息列表"""
        messages = []
        
        # 如果有上下文,添加系统消息
        if context:
            system_prompt = f"""你是一个智能助手。请基于以下检索到的文档内容回答用户问题。

检索到的文档内容:
{context}

回答要求:
1. 优先使用检索到的文档内容
2. 保持回答准确、专业、友好
"""
            messages.append(SystemMessage(content=system_prompt))
        
        # 添加对话历史(最近3轮)
        recent_history = self.conversation_history[-6:] if len(self.conversation_history) > 6 else self.conversation_history
        messages.extend(recent_history)
        
        # 添加当前用户输入
        messages.append(HumanMessage(content=user_input))
        
        return messages
    
    def reset(self):
        """重置对话历史"""
        self.conversation_history = []
        print("✅ 对话历史已重置\n")


# ============================================================================
# 主程序:演示所有功能
# ============================================================================

def demo_simple_agent(api_key: str):
    """演示1: 基础Agent"""
    print("=" * 70)
    print("🤖 演示1: 简化版Agent演示")
    print("=" * 70)
    agent = SimpleAgent(api_key=api_key)
    
    # 示例1: 第一次对话(无上下文)
    print("\n【示例1】基础对话(无上下文)")
    print("-" * 70)
    response1 = agent.chat("你好,我是小明")
    print(f"你: 你好,我是小明")
    print(f"Agent: {response1}")
    
    # 示例2: 带上下文的对话
    print("\n【示例2】带上下文的对话(模拟RAG检索)")
    print("-" * 70)
    context = """
    RAG(Retrieval-Augmented Generation)是检索增强生成技术。
    它结合了信息检索和文本生成,通过检索相关文档来增强生成质量。
    RAG的主要优势包括:
    1. 提供准确的信息来源
    2. 减少模型幻觉
    3. 可以接入外部知识库
    """
    response2 = agent.chat("什么是RAG?", context=context)
    print(f"你: 什么是RAG?")
    print(f"Agent: {response2}")
    
    # 示例3: 利用历史上下文的对话
    print("\n【示例3】多轮对话(利用历史上下文)")
    print("-" * 70)
    response3 = agent.chat("它有什么优势?")
    print(f"你: 它有什么优势?")
    print(f"Agent: {response3}")
    
    # 示例4: 重置对话
    print("\n【示例4】重置对话历史")
    print("-" * 70)
    agent.reset()
    response4 = agent.chat("你还记得我是谁吗?")
    print(f"你: 你还记得我是谁吗?")
    print(f"Agent: {response4}")
    
    print("\n" + "=" * 70)
    print("✅ 演示1完成!")
    print("=" * 70)
    print("\n")


def demo_rag_agent(api_key: str):
    """演示2: RAG增强Agent"""
    print("=" * 70)
    print("🤖 演示2: RAG增强Agent演示")
    print("=" * 70)
    print()
    
    # 初始化Agent
    agent = RAGAgent(api_key=api_key)
    
    # 添加知识库
    knowledge_docs = [
        Document(page_content="""
        RAG(Retrieval-Augmented Generation)是检索增强生成技术。
        它结合了信息检索和文本生成,通过检索相关文档来增强生成质量。
        RAG的主要优势包括:
        1. 提供准确的信息来源,减少模型幻觉
        2. 可以接入外部知识库,扩展模型知识
        3. 支持实时更新知识,无需重新训练模型
        """),
        Document(page_content="""
        Transformer是一种基于注意力机制的深度学习架构。
        它由编码器(Encoder)和解码器(Decoder)组成。
        Transformer的核心是自注意力机制(Self-Attention),
        能够捕捉序列中不同位置之间的依赖关系。
        """),
        Document(page_content="""
        Agent(智能体)是能够感知环境、做出决策并执行任务的自主系统。
        在AI领域,Agent通常指能够理解用户意图、调用工具、完成任务的应用。
        常见的Agent类型包括:对话Agent、工具调用Agent、多模态Agent等。
        """),
        Document(page_content="""
        LangChain是一个用于构建LLM应用的框架。
        它提供了链(Chain)、代理(Agent)、记忆(Memory)等组件。
        LangGraph是LangChain的扩展,用于构建复杂的工作流。
        """),
    ]
    
    agent.add_knowledge(knowledge_docs)
    
    # 示例对话
    queries = [
        "什么是RAG?",
        "Transformer的核心是什么?",
        "Agent有哪些类型?",
        "LangChain和LangGraph有什么区别?"
    ]
    
    for i, query in enumerate(queries, 1):
        print(f"【示例{i}】")
        print("-" * 70)
        print(f"你: {query}")
        print()
        response = agent.chat(query)
        print(f"Agent: {response}")
        print()
    
    print("=" * 70)
    print("✅ 演示2完成!")
    print("=" * 70)
    print("\n")


def demo_complete_workflow(api_key: str):
    """演示3: 完整工作流"""
    print("=" * 70)
    print("🤖 演示3: 完整Agent工作流演示")
    print("=" * 70)
    print()
    
    # 初始化Agent
    agent = CompleteAgentWorkflow(api_key=api_key)
    
    # 示例对话
    queries = [
        "什么是RAG?",
        "它如何工作?",
        "Transformer的核心是什么?"
    ]
    
    for i, query in enumerate(queries, 1):
        print(f"\n【对话轮次 {i}】")
        print()
        agent.process(query, verbose=True)
    
    # 重置对话
    print("\n" + "=" * 70)
    print("🔄 重置对话历史")
    print("=" * 70)
    agent.reset()
    
    # 继续对话
    print("\n【重置后的对话】")
    agent.process("你还记得我们刚才聊了什么吗?", verbose=True)
    
    print("=" * 70)
    print("✅ 演示3完成!")
    print("=" * 70)


# ============================================================================
# 主入口
# ============================================================================

if __name__ == "__main__":
    # 从环境变量获取API密钥
    api_key = os.getenv("DEEPSEEK_API_KEY", "your-api-key")
    
    if api_key == "your-api-key":
        print("⚠️  请设置环境变量 DEEPSEEK_API_KEY")
        print("   例如: export DEEPSEEK_API_KEY='your-actual-key'")
        print("   或者: set DEEPSEEK_API_KEY=your-actual-key  (Windows)")
        exit(1)
    
    print("\n" + "=" * 70)
    print("🎯 Agent Transformer 完整演示")
    print("=" * 70)
    print("\n本演示包含三个部分:")
    print("  1. 基础Agent演示(SimpleAgent)")
    print("  2. RAG增强Agent演示(RAGAgent)")
    print("  3. 完整工作流演示(CompleteAgentWorkflow)")
    print("\n" + "=" * 70)
    print()
    
    try:
        # 运行所有演示
        demo_simple_agent(api_key)
        demo_rag_agent(api_key)
        demo_complete_workflow(api_key)
        
        print("\n" + "=" * 70)
        print("🎉 所有演示完成!")
        print("=" * 70)
        print("\n💡 提示:")
        print("  - 查看 agent_transformer_guide.md 了解详细原理")
        print("  - 修改代码中的参数进行自定义实验")
        print("  - 添加自己的知识库文档进行测试")
        print()
        
    except KeyboardInterrupt:
        print("\n\n👋 演示已中断")
    except Exception as e:
        print(f"\n❌ 发生错误: {e}")
        import traceback
        traceback.print_exc()
相关推荐
羊仔AI探索2 小时前
前端已死,未来已来,谷歌Gemini 3 Pro杀回来了!
前端·人工智能·ai·aigc
永远都不秃头的程序员(互关)2 小时前
【无标题】
人工智能
轻竹办公PPT2 小时前
2026 年 AI PPT 工具市场观察:国产工具与海外竞品的本土化对决,谁更懂中文职场
人工智能·python·powerpoint
咚咚王者2 小时前
人工智能之核心基础 机器学习 第二十章 深度学习入门
人工智能·深度学习·机器学习
roman_日积跬步-终至千里2 小时前
【架构-选型逻辑】如何让业务逻辑与开源项目核心逻辑精准对齐——从功能匹配到逻辑对齐的思维转换
架构·开源
Godspeed Zhao2 小时前
从零开始学AI5——数学应知应会0
人工智能
腾讯云大数据2 小时前
【数据湖仓】腾讯云发布面向AI的数据湖方案:TCLake+EMR打造AI-Ready数据底座
人工智能·云计算·腾讯云
橘子师兄2 小时前
C++AI大模型接入SDK—API接入大模型思路
开发语言·数据结构·c++·人工智能
羞儿2 小时前
mAP, AUOCR, AUPR怎么计算、怎么用
人工智能·计算机视觉·指标计算