# 交易流水分析项目 - LangChain & LangGraph Agent开发练习手册

## 📚 练习目标

通过这个项目，掌握以下核心技能：
- ✅ LangChain基础使用（模型、提示词、输出解析）
- ✅ LangGraph状态机工作流设计
- ✅ Agent架构设计与实现
- ✅ 多Agent协作系统
- ✅ API调用与错误处理
- ✅ 数据处理与文件管理
- ✅ 日志记录与调试

## 🏗️ 项目架构概览

```
交易流水分析系统
├── 规划Agent (PlanningAgent)
│   ├── 分析用户需求
│   ├── 决策下一步行动
│   └── 分配计算任务
├── 大纲生成Agent (OutlineAgent)
│   ├── 生成分析报告结构
│   ├── 选择相关指标
│   └── 输出JSON格式大纲
├── 指标计算Agent (MetricCalculationAgent)
│   ├── 调用外部API
│   ├── 处理计算结果
│   └── 错误处理与重试
└── 工作流编排器 (CompleteAgentFlow)
    ├── 状态管理
    ├── 条件路由
    └── 执行控制
```

## 🚀 练习路线图

### Phase 1: 环境搭建与基础概念

#### 练习1.1: 环境配置
**目标**: 掌握Python项目环境搭建

**任务**:
1. 创建新的虚拟环境
2. 安装基础依赖包
3. 配置API密钥环境变量
4. 验证安装成功

**代码示例**:
```bash
# 创建虚拟环境
python -m venv tx_flow_env
source tx_flow_env/bin/activate  # Linux/Mac
# 或 tx_flow_env\Scripts\activate  # Windows

# 安装依赖
pip install langchain langgraph pydantic python-dotenv

# 设置环境变量
echo "DEEPSEEK_API_KEY=your-key-here" > .env
```

**验证代码**:
```python
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv('DEEPSEEK_API_KEY')
print(f"API Key loaded: {api_key is not None}")
```

#### 练习1.2: LangChain基础
**目标**: 理解LangChain核心组件

**任务**:
1. 创建ChatOpenAI实例
2. 设计简单的提示词模板
3. 发送请求并处理响应
4. 解析JSON输出

**代码示例**:
```python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 初始化模型
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key="your-api-key",
    base_url="https://api.deepseek.com",
    temperature=0.1
)

# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的助手，请用JSON格式回答。"),
    ("user", "请分析这个数据: {data}")
])

# 链式调用
chain = prompt | llm
result = chain.invoke({"data": "示例数据"})
print(result.content)
```

### Phase 2: Agent开发基础

#### 练习2.1: 简单Agent实现
**目标**: 掌握Agent基本结构

**任务**:
1. 创建基础Agent类
2. 实现初始化方法
3. 添加API调用跟踪
4. 实现简单的问答功能

**代码示例**:
```python
from typing import List, Dict, Any
from datetime import datetime
from langchain_openai import ChatOpenAI

class BaseAgent:
    """基础Agent类"""

    def __init__(self, api_key: str, base_url: str = "https://api.deepseek.com"):
        self.llm = ChatOpenAI(
            model="deepseek-chat",
            api_key=api_key,
            base_url=base_url,
            temperature=0.1
        )
        # API调用跟踪
        self.api_calls: List[Dict[str, Any]] = []

    def call_llm(self, messages: List[Dict[str, str]]) -> str:
        """调用大模型并记录"""
        start_time = datetime.now()

        try:
            response = self.llm.invoke(messages)
            end_time = datetime.now()

            # 记录API调用
            self.api_calls.append({
                "timestamp": end_time.isoformat(),
                "duration": (end_time - start_time).total_seconds(),
                "success": True,
                "response": response.content
            })

            return response.content

        except Exception as e:
            end_time = datetime.now()
            self.api_calls.append({
                "timestamp": end_time.isoformat(),
                "duration": (end_time - start_time).total_seconds(),
                "success": False,
                "error": str(e)
            })
            raise
```

#### 练习2.2: 提示词工程
**目标**: 掌握提示词设计技巧

**任务**:
1. 设计结构化输出提示词
2. 使用JSON模式输出
3. 处理输出解析错误
4. 实现重试机制

**代码示例**:
```python
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser

class AnalysisResult(BaseModel):
    """分析结果结构"""
    summary: str = Field(description="分析摘要")
    key_points: List[str] = Field(description="关键要点")
    confidence: float = Field(description="置信度", ge=0, le=1)

def create_analysis_prompt() -> ChatPromptTemplate:
    """创建分析提示词"""

    parser = JsonOutputParser(pydantic_object=AnalysisResult)

    template = """你是一个专业的数据分析师，请分析以下数据并按JSON格式输出。

数据: {data}

要求:
1. 提供简洁的分析摘要
2. 列出3-5个关键要点
3. 给出分析置信度(0-1之间)

{format_instructions}

请确保输出有效的JSON格式。"""

    return ChatPromptTemplate.from_template(
        template,
        partial_variables={"format_instructions": parser.get_format_instructions()}
    )
```

### Phase 3: LangGraph工作流

#### 练习3.1: 基础状态机
**目标**: 理解状态机概念

**任务**:
1. 定义状态结构
2. 创建基础节点
3. 实现简单路由
4. 测试状态转换

**代码示例**:
```python
from typing import TypedDict, Annotated, List
from langgraph.graph import StateGraph, START, END

class WorkflowState(TypedDict):
    """工作流状态"""
    question: str
    current_step: str
    results: Annotated[List[str], "add"]  # 使用注解支持列表追加

def planning_node(state: WorkflowState) -> WorkflowState:
    """规划节点"""
    print(f"📋 规划阶段 - 问题: {state['question']}")

    # 简单的决策逻辑
    if "分析" in state["question"]:
        next_step = "analyze"
    else:
        next_step = "answer"

    return {
        **state,
        "current_step": next_step,
        "results": ["规划完成"]
    }

def analysis_node(state: WorkflowState) -> WorkflowState:
    """分析节点"""
    print("🔍 分析阶段")
    return {
        **state,
        "results": ["分析完成"]
    }

def answer_node(state: WorkflowState) -> WorkflowState:
    """回答节点"""
    print("💬 回答阶段")
    return {
        **state,
        "results": ["回答完成"]
    }

# 创建工作流
workflow = StateGraph(WorkflowState)

# 添加节点
workflow.add_node("planning", planning_node)
workflow.add_node("analysis", analysis_node)
workflow.add_node("answer", answer_node)

# 设置入口
workflow.set_entry_point("planning")

# 添加边
workflow.add_edge("analysis", END)
workflow.add_edge("answer", END)

# 添加条件边
def route_from_planning(state: WorkflowState) -> str:
    return state["current_step"]

workflow.add_conditional_edges(
    "planning",
    route_from_planning,
    {
        "analyze": "analysis",
        "answer": "answer"
    }
)

# 编译并运行
app = workflow.compile()

result = app.invoke({
    "question": "请分析这个数据",
    "current_step": "",
    "results": []
})

print("最终结果:", result)
```

#### 练习3.2: 条件路由与循环
**目标**: 掌握复杂工作流设计

**任务**:
1. 实现条件判断路由
2. 添加循环逻辑
3. 处理错误状态
4. 实现状态回退

### Phase 4: 多Agent协作系统

#### 练习4.1: Agent通信
**目标**: 实现Agent间数据传递

**任务**:
1. 设计Agent接口
2. 实现数据传递机制
3. 处理依赖关系
4. 实现结果聚合

#### 练习4.2: 错误处理与重试
**目标**: 构建健壮的Agent系统

**任务**:
1. 实现重试机制
2. 处理部分失败
3. 实现降级策略
4. 添加监控和告警

### Phase 5: 实际项目实现

#### 练习5.1: 数据管理Agent
**目标**: 实现数据加载和预处理

基于项目中的 `data_manager.py`，实现：
1. CSV文件读取
2. 数据验证
3. 格式转换
4. 错误处理

#### 练习5.2: 规划Agent
**目标**: 实现决策制定逻辑

基于项目中的 `planning_agent.py`，实现：
1. 状态分析
2. 决策制定
3. 任务分配
4. 结果输出

#### 练习5.3: 大纲生成Agent
**目标**: 实现结构化内容生成

基于项目中的 `outline_agent.py`，实现：
1. 提示词设计
2. JSON输出解析
3. 内容验证
4. 错误重试

#### 练习5.4: 指标计算Agent
**目标**: 实现外部API调用

基于项目中的 `rules_engine_metric_calculation_agent.py`，实现：
1. HTTP请求处理
2. 响应解析
3. 错误处理
4. 结果缓存

### Phase 6: 系统集成与优化

#### 练习6.1: 工作流编排
**目标**: 集成所有组件

基于项目中的 `complete_agent_flow_rule.py`，实现：
1. 组件组装
2. 状态管理
3. 执行控制
4. 结果汇总

#### 练习6.2: 日志与监控
**目标**: 添加可观测性

基于项目中的日志系统，实现：
1. 结构化日志
2. 性能监控
3. 错误追踪
4. 结果统计

## 🏆 进阶挑战

### 挑战1: 扩展新功能
- 添加数据可视化Agent
- 实现报告生成Agent
- 添加用户交互界面

### 挑战2: 性能优化
- 实现并发处理
- 添加缓存机制
- 优化API调用

### 挑战3: 错误恢复
- 实现自动重试策略
- 添加备用方案
- 实现优雅降级

### 挑战4: 配置管理
- 支持动态配置加载
- 实现环境切换
- 添加配置验证

## 📚 学习资源

### 官方文档
- [LangChain文档](https://python.langchain.com/)
- [LangGraph文档](https://langchain-ai.github.io/langgraph/)
- [Pydantic文档](https://docs.pydantic.dev/)

### 推荐书籍
- "Building LLM Applications with LangChain"
- "Prompt Engineering Guide"
- "Designing Data-Intensive Applications"

### 社区资源
- LangChain GitHub Issues
- Stack Overflow
- Reddit r/LangChain

## 🎯 练习建议

1. **循序渐进**: 按照Phase顺序逐步学习
2. **动手实践**: 每学一个概念就动手实现
3. **调试练习**: 学会使用断点和日志调试
4. **代码审查**: 学习阅读和理解现有代码
5. **文档编写**: 为自己的代码编写文档
6. **测试驱动**: 学习编写单元测试

## 🚀 快速开始

```bash
# 1. 克隆项目
git clone <repository-url>
cd tx_flow_analysis

# 2. 创建环境
python -m venv venv
source venv/bin/activate

# 3. 安装依赖
pip install -r requirements.txt

# 4. 配置环境变量
cp env_example.txt .env
# 编辑 .env 文件

# 5. 开始练习！
```bash
# 运行基础Agent示例
python examples/basic_agent.py

# 运行状态机示例
python examples/state_machine.py
```

# 6. 练习项目结构
```
examples/
├── basic_agent.py          # 基础Agent示例（LLM调用、提示词设计）
├── state_machine.py        # LangGraph状态机示例（工作流设计、条件路由）
├── advanced_agent.py       # 高级Agent功能（结构化输出、错误处理、重试机制）
└── multi_agent.py          # 多Agent协作系统（任务分配、结果传递）
```
```

## 💡 学习提示

- **不懂就问**: 遇到问题及时求助
- **多动手**: 理论学习后立即实践
- **记笔记**: 记录学习心得和坑点
- **分享交流**: 加入技术社区交流
- **持之以恒**: Agent开发需要时间积累

祝你在LangChain和LangGraph的学习之路上取得成功！🚀
