Skip to content

章节3:企业级应用开发

本章导学

AI Agent 技术在企业中的落地是当前最受关注的方向之一。本章将深入5个典型的企业级应用场景:知识库问答系统(RAG+Agent)、智能客服与坐席助手、文档处理与合同审核Agent、代码助手与研发效能Agent、数据分析师Agent。每个场景都会给出架构设计和核心代码实现,帮助你掌握从技术到产品的完整路径。


学习目标

  • 掌握基于RAG+Agent的企业知识库问答系统架构
  • 理解智能客服系统的自助+人工转接设计模式
  • 能实现文档处理与合同审核的自动化流程
  • 了解代码助手Agent的研发效能提升方案
  • 学会构建自然语言驱动的数据分析Agent

3.1 企业知识库问答系统(RAG+Agent)

3.1.1 系统架构概述

企业知识库问答系统是企业AI落地的"第一选择"。核心架构采用RAG(Retrieval-Augmented Generation)+ Agent模式。

用户提问


┌──────────────┐
│  查询理解模块  │ <- Agent:分析意图、改写查询、分解复杂问题
└──────┬───────┘


┌──────────────┐
│  检索模块     │ <- RAG:向量检索 + 关键词检索 + 重排序
│  (ChromaDB)  │
└──────┬───────┘


┌──────────────┐
│  增强生成模块  │ <- Agent:整合上下文、过滤冗余、生成回答
├──────────────┤
│  引用溯源模块  │ <- 展示信息来源,提升可信度
└──────┬───────┘


   最终回答 + 引用

3.1.2 核心代码实现

1)文档加载与向量化

python
# pip install langchain langchain-community chromadb sentence-transformers

from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
import os

class KnowledgeBase:
    """企业知识库构建器"""
    
    def __init__(self, persist_dir="./chroma_db"):
        self.persist_dir = persist_dir
        # 使用中文优化的嵌入模型
        self.embeddings = HuggingFaceEmbeddings(
            model_name="BAAI/bge-large-zh-v1.5",
            model_kwargs={"device": "cpu"},
            encode_kwargs={"normalize_embeddings": True}
        )
    
    def load_documents(self, data_dir: str) -> list:
        """加载企业文档"""
        loader = DirectoryLoader(
            data_dir,
            glob="**/*.md",
            loader_cls=TextLoader,
            loader_kwargs={"encoding": "utf-8"}
        )
        documents = loader.load()
        print(f"加载了 {len(documents)} 个文档")
        return documents
    
    def chunk_documents(self, documents: list) -> list:
        """文档分块"""
        splitter = RecursiveCharacterTextSplitter(
            chunk_size=500,      # 每块约500字
            chunk_overlap=50,    # 重叠50字保持上下文连贯
            separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""]
        )
        chunks = splitter.split_documents(documents)
        print(f"切分为 {len(chunks)} 个文本块")
        return chunks
    
    def build_vectorstore(self, chunks: list) -> Chroma:
        """构建向量数据库"""
        vectorstore = Chroma.from_documents(
            documents=chunks,
            embedding=self.embeddings,
            persist_directory=self.persist_dir
        )
        vectorstore.persist()
        print(f"向量数据库已保存到: {self.persist_dir}")
        return vectorstore
    
    def load_vectorstore(self) -> Chroma:
        """加载已有向量数据库"""
        return Chroma(
            persist_directory=self.persist_dir,
            embedding_function=self.embeddings
        )

# 使用示例
kb = KnowledgeBase()
# docs = kb.load_documents("./企业文档库")
# chunks = kb.chunk_documents(docs)
# vectorstore = kb.build_vectorstore(chunks)

2)RAG检索增强生成

python
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate

class RAGEngine:
    """RAG检索增强生成引擎"""
    
    def __init__(self, vectorstore, model="gpt-4"):
        self.vectorstore = vectorstore
        self.llm = ChatOpenAI(model=model, temperature=0.1)
        self.retriever = vectorstore.as_retriever(
            search_type="similarity",
            search_kwargs={"k": 5}  # 检索Top-5相关片段
        )
        
        # 企业问答专用Prompt
        self.prompt = PromptTemplate(
            template="""你是一家企业的AI知识库助手。请基于以下提供的知识片段,
准确回答用户的问题。如果知识片段不足以回答,请明确说明。

知识片段:
{context}

用户问题:{question}

要求:
1. 只基于提供的知识片段回答
2. 如果知识不足,请说"根据现有知识库,我无法完整回答这个问题"
3. 请注明信息来源

回答:""",
            input_variables=["context", "question"]
        )
    
    def query(self, question: str) -> dict:
        """查询知识库"""
        chain = RetrievalQA.from_chain_type(
            llm=self.llm,
            chain_type="stuff",
            retriever=self.retriever,
            chain_type_kwargs={"prompt": self.prompt},
            return_source_documents=True
        )
        
        result = chain.invoke({"query": question})
        
        return {
            "answer": result["result"],
            "sources": [
                doc.metadata.get("source", "未知来源")
                for doc in result["source_documents"]
            ]
        }

# 使用示例
# engine = RAGEngine(kb.load_vectorstore())
# response = engine.query("公司的年假政策是什么?")
# print(response["answer"])
# print("来源:", response["sources"])

3)Agent增强版(带意图识别和多轮检索)

python
from openai import OpenAI
import json

class AgenticRAGEngine:
    """Agent增强版RAG引擎"""
    
    def __init__(self, vectorstore, model="gpt-4"):
        self.vectorstore = vectorstore
        self.llm = OpenAI(model=model)
        self.retriever = vectorstore.as_retriever(
            search_type="similarity",
            search_kwargs={"k": 3}
        )
    
    def analyze_intent(self, question: str) -> dict:
        """分析用户意图"""
        response = self.llm.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": """分析用户问题的意图,输出JSON格式:
{
    "intent": "knowledge_query|multi_step_query|ambiguous",
    "sub_questions": ["子问题1", "子问题2"],
    "requires_clarification": false,
    "clarification_question": "需要澄清的问题(如有)"
}"""},
                {"role": "user", "content": question}
            ],
            response_format={"type": "json_object"}
        )
        return json.loads(response.choices[0].message.content)
    
    def query(self, question: str) -> str:
        """带Agent增强的查询"""
        # 1. 分析意图
        intent = self.analyze_intent(question)
        
        # 2. 如果是复杂问题,分解为子问题
        if intent["intent"] == "multi_step_query":
            answers = []
            for sub_q in intent.get("sub_questions", [question]):
                # 检索
                docs = self.retriever.get_relevant_documents(sub_q)
                context = "\n".join([d.page_content for d in docs])
                # 生成
                response = self.llm.chat.completions.create(
                    model="gpt-4",
                    messages=[
                        {"role": "system", "content": f"基于上下文回答问题:\n{context}"},
                        {"role": "user", "content": sub_q}
                    ]
                )
                answers.append(response.choices[0].message.content)
            
            return "\n\n".join(answers)
        
        # 3. 简单查询直接检索
        docs = self.retriever.get_relevant_documents(question)
        context = "\n".join([d.page_content for d in docs])
        
        response = self.llm.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": f"你是企业知识库助手,基于上下文回答:\n{context}"},
                {"role": "user", "content": question}
            ]
        )
        return response.choices[0].message.content

3.1.3 企业级RAG架构关键优化

优化项说明实现方式
混合检索向量检索+关键词检索互补Elasticsearch + ChromaDB
重排序(Rerank)精排Top-K结果Cohere/dashscope Rerank API
HyDE假设性文档增强检索LLM先生成假设答案再检索
查询改写将用户问句改写为更易检索的形式LLM Query Rewrite
多轮对话维护对话历史和上下文Session管理+历史摘要

3.2 智能客服与坐席助手

3.2.1 系统设计

企业级智能客服系统的核心是自助服务+人工转接的双轨模式。

用户提问


┌──────────────┐
│  智能分流模块  │ <- Agent:分析问题类型、紧急程度、客户等级
└──────┬───────┘

   ┌───┴────────┐
   │             │
   ▼             ▼
┌────────┐  ┌──────────┐
│ FAQ自助  │  │  人工坐席  │
│ (RAG+Bot)│  │  (辅助模式)│
└────────┘  └────┬─────┘


           ┌──────────┐
           │  坐席助手  │ <- Agent:实时建议、知识推荐、话术生成
           ├──────────┤
           │  工单系统  │ <- 未解决问题自动生成工单
           └──────────┘

3.2.2 核心代码实现

python
from openai import OpenAI
import json
from enum import Enum

class IntentType(str, Enum):
    FAQ = "faq"                # 常见问题
    TROUBLESHOOTING = "troubleshooting"  # 故障排查
    ORDER = "order_query"      # 订单查询
    COMPLAINT = "complaint"    # 投诉
    HUMAN = "need_human"       # 需要人工
    GENERAL = "general"        # 一般咨询

class SmartCustomerService:
    """智能客服系统"""
    
    def __init__(self, knowledge_base=None):
        self.client = OpenAI()
        self.knowledge_base = knowledge_base
    
    def classify_intent(self, message: str, history: list = None) -> IntentType:
        """意图识别与分流"""
        prompt = f"""用户消息:{message}
历史对话:{history or '无'}

请判断用户意图,只返回以下类型之一:
- faq: 常见问题咨询
- troubleshooting: 需要故障排查指导
- order_query: 订单或账户查询
- complaint: 投诉或不满
- need_human: 明确要求人工服务
- general: 一般性咨询
"""
        response = self.client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": prompt}]
        )
        intent_str = response.choices[0].message.content.strip().lower()
        
        for intent in IntentType:
            if intent.value in intent_str:
                return intent
        return IntentType.GENERAL
    
    def auto_reply(self, message: str, intent: IntentType) -> dict:
        """自助回复"""
        # FAQ走RAG
        if intent == IntentType.FAQ and self.knowledge_base:
            context = self.knowledge_base.retrieve(message)
        else:
            context = ""
        
        response = self.client.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": f"""你是企业智能客服。
{context if context else '请根据通用知识回答。'}
回复要求:
1. 礼貌、专业、简洁
2. 如果无法解决,主动提供转人工选项
3. 故障排查请给出步骤
4. 投诉问题先道歉再解决"""},
                {"role": "user", "content": message}
            ]
        )
        
        answer = response.choices[0].message.content
        
        # 判断是否需要转人工
        needs_handoff = any([
            intent == IntentType.COMPLAINT,
            intent == IntentType.HUMAN,
            "转人工" in answer,
            "无法解决" in answer
        ])
        
        return {
            "answer": answer,
            "needs_handoff": needs_handoff,
            "intent": intent.value
        }
    
    def agent_assistant(self, customer_msg: str, history: list) -> str:
        """坐席助手:为人工坐席提供实时建议"""
        response = self.client.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": """你是一名AI坐席助手,为客服人员提供实时支持。
基于对话历史和当前客户消息,输出:
1. 问题总结(一句话)
2. 建议回复(话术)
3. 知识库推荐(相关FAQ链接或知识点)
4. 客户情绪分析(积极/中性/消极/愤怒)"""},
                {"role": "user", "content": f"历史对话:{history}\n当前消息:{customer_msg}"}
            ]
        )
        return response.choices[0].message.content
    
    def handle(self, message: str, history: list = None):
        """完整处理流程"""
        # 1. 意图识别
        intent = self.classify_intent(message, history)
        print(f"[智能分流] 意图:{intent.value}")
        
        # 2. 自助回复
        result = self.auto_reply(message, intent)
        
        # 3. 如果需要转人工
        if result["needs_handoff"]:
            # 生成工单摘要
            handoff_summary = f"问题类型:{intent.value}\n客户问题:{message}\n自助回复:{result['answer'][:100]}..."
            print(f"[转人工] 已生成工单摘要")
            result["handoff_summary"] = handoff_summary
        
        return result

# 使用示例
cs = SmartCustomerService()
result = cs.handle("我想退掉昨天买的那个产品,质量太差了!")
print(f"回复:{result['answer']}")
print(f"需要转人工:{result['needs_handoff']}")

3.2.3 关键指标

指标说明行业基准
自助解决率用户不转人工即解决的问题比例>70%
首响时间用户发送到第一次回复的时间<5秒
解决率用户问题被成功解决的比例>85%
满意度用户对服务的评分>4.0/5.0
转人工率从机器人转到人工的比例<30%

3.3 文档处理与合同审核Agent

3.3.1 系统架构

上传文档


┌──────────────┐
│  文档解析模块  │ <- PDF/Word/Excel多格式解析
├──────────────┤
│  内容提取     │ <- OCR、表格提取、图片识别
└──────┬───────┘


┌──────────────┐
│  合同审核Agent │
│  - 关键条款提取 │
│  - 风险点识别  │
│  - 合规检查   │
│  - 建议修改   │
└──────┬───────┘


┌──────────────┐
│  审核报告生成  │ <- 结构化审核报告 + 标注版本
└──────────────┘

3.3.2 核心代码实现

python
# pip install python-docx PyPDF2 openpyxl

import os
from openai import OpenAI
import json

class DocumentProcessor:
    """文档处理器:支持多格式解析"""
    
    def extract_text(self, file_path: str) -> str:
        """提取文档文本内容"""
        ext = os.path.splitext(file_path)[1].lower()
        
        if ext == ".pdf":
            return self._extract_pdf(file_path)
        elif ext == ".docx":
            return self._extract_docx(file_path)
        elif ext == ".txt":
            return self._read_txt(file_path)
        else:
            raise ValueError(f"不支持的文件格式: {ext}")
    
    def _extract_pdf(self, file_path: str) -> str:
        from PyPDF2 import PdfReader
        reader = PdfReader(file_path)
        text = ""
        for page in reader.pages:
            text += page.extract_text() + "\n"
        return text
    
    def _extract_docx(self, file_path: str) -> str:
        from docx import Document
        doc = Document(file_path)
        text = "\n".join([p.text for p in doc.paragraphs])
        return text
    
    def _read_txt(self, file_path: str) -> str:
        with open(file_path, "r", encoding="utf-8") as f:
            return f.read()


class ContractReviewAgent:
    """合同审核Agent"""
    
    CHECKLIST = [
        "合同主体信息是否完整",
        "合同金额和支付条款是否明确",
        "违约责任条款是否合理",
        "保密条款是否存在",
        "争议解决方式是否明确",
        "合同期限和终止条件",
        "知识产权归属",
        "不可抗力条款"
    ]
    
    def __init__(self, model="gpt-4"):
        self.client = OpenAI()
        self.model = model
    
    def review(self, contract_text: str) -> dict:
        """审核合同"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": f"""你是一名专业的企业法务顾问。
请审核以下合同内容,输出JSON格式的审核报告:

{{
    "basic_info": {{
        "contract_name": "合同名称",
        "parties": ["甲方", "乙方"],
        "contract_type": "合同类型"
    }},
    "checklist": [
        {{
            "item": "检查项",
            "status": "pass|warn|fail",
            "detail": "具体分析",
            "suggestion": "修改建议"
        }}
    ],
    "risk_points": [
        {{
            "risk": "风险描述",
            "severity": "high|medium|low",
            "clause": "相关条款",
            "recommendation": "应对建议"
        }}
    ],
    "overall_assessment": "总体评估",
    "suggested_actions": ["建议操作1", "建议操作2"]
}}

请逐一检查以下要点:
{chr(10).join(f'- {item}' for item in CHECKLIST)}"""},
                {"role": "user", "content": contract_text}
            ],
            response_format={"type": "json_object"},
            temperature=0.2
        )
        
        return json.loads(response.choices[0].message.content)
    
    def generate_report(self, review_result: dict) -> str:
        """生成可读的审核报告"""
        report = f"""
========================================
            合同审核报告
========================================

### 基本信息
- 合同名称:{review_result['basic_info'].get('contract_name', '未识别')}
- 签约双方:{', '.join(review_result['basic_info'].get('parties', ['未识别']))}
- 合同类型:{review_result['basic_info'].get('contract_type', '未识别')}

### 逐项检查结果
"""
        for item in review_result.get("checklist", []):
            icon = {"pass": "✅", "warn": "⚠️", "fail": "❌"}
            status_icon = icon.get(item["status"], "❓")
            report += f"\n{status_icon} **{item['item']}**\n"
            report += f"  分析:{item.get('detail', '')}\n"
            if item.get("suggestion"):
                report += f"  建议:{item.get('suggestion', '')}\n"
        
        report += "\n### 风险点\n"
        for risk in review_result.get("risk_points", []):
            severity_icon = {"high": "🔴", "medium": "🟡", "low": "🟢"}
            report += f"\n{severity_icon.get(risk['severity'], '⚪')} **{risk['risk']}** (严重程度: {risk['severity']})\n"
            report += f"  相关条款:{risk.get('clause', '')}\n"
            report += f"  应对建议:{risk.get('recommendation', '')}\n"
        
        report += f"\n### 总体评估\n{review_result.get('overall_assessment', '')}\n"
        
        report += "\n### 建议操作\n"
        for action in review_result.get("suggested_actions", []):
            report += f"- {action}\n"
        
        return report

# 使用示例
# processor = DocumentProcessor()
# text = processor.extract_text("合同文件.docx")
# agent = ContractReviewAgent()
# result = agent.review(text)
# report = agent.generate_report(result)
# print(report)

3.3.3 文档Agent的高级能力

能力技术实现应用场景
多文档对比交叉比对+差异检测合同版本对比
表格提取OCR+结构化提取财务报表分析
关键信息抽取NER+LLM提取发票/表单信息
合规检查规则引擎+LLM行业合规审核
自动归档元数据提取+分类文档管理系统

3.4 代码助手与研发效能Agent

3.4.1 核心功能

企业研发效能Agent涵盖以下场景:

功能描述技术实现
代码生成根据需求生成代码片段LLM + 上下文感知
代码审查自动检查代码质量和安全问题静态分析 + LLM Review
Bug修复自动诊断和修复代码缺陷错误日志分析 + 补丁生成
文档生成从代码生成API文档和注释AST解析 + LLM
架构建议根据需求推荐技术方案系统设计知识库 + LLM

3.4.2 核心代码实现

python
from openai import OpenAI
import json
import ast
import subprocess

class CodeAssistantAgent:
    """代码助手Agent"""
    
    def __init__(self, model="gpt-4"):
        self.client = OpenAI()
        self.model = model
    
    def generate_code(self, requirements: str, language: str = "python") -> str:
        """根据需求生成代码"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": f"""你是一名高级{language}工程师。
请根据需求生成高质量代码。要求:
1. 包含完整的函数/类定义
2. 添加详细的文档字符串
3. 包含类型注解
4. 遵循PEP 8规范
5. 包含错误处理"""},
                {"role": "user", "content": f"需求:{requirements}"}
            ]
        )
        return response.choices[0].message.content
    
    def review_code(self, code: str) -> dict:
        """代码审查"""
        # 先做静态分析
        static_issues = self._static_analysis(code)
        
        # 再用LLM做深度审查
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": """你是一名资深代码审查专家。请审查以下代码,输出JSON格式:

{
    "overall_rating": "A/B/C/D",
    "issues": [
        {
            "type": "bug|security|performance|style|maintainability",
            "severity": "critical|major|minor",
            "line": 行号,
            "description": "问题描述",
            "suggestion": "修改建议"
        }
    ],
    "strengths": ["代码优势1", "代码优势2"],
    "summary": "总体评价"
}"""},
                {"role": "user", "content": f"代码:\n```python\n{code}\n```"}
            ],
            response_format={"type": "json_object"}
        )
        
        llm_review = json.loads(response.choices[0].message.content)
        llm_review["static_issues"] = static_issues
        return llm_review
    
    def _static_analysis(self, code: str) -> list:
        """静态代码分析"""
        issues = []
        try:
            tree = ast.parse(code)
            # 检查缺少文档字符串
            for node in ast.walk(tree):
                if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
                    if not ast.get_docstring(node):
                        issues.append({
                            "type": "style",
                            "line": node.lineno,
                            "description": f"缺少文档字符串: {node.name}"
                        })
        except SyntaxError as e:
            issues.append({
                "type": "bug",
                "line": e.lineno or 0,
                "description": f"语法错误: {e.msg}"
            })
        return issues
    
    def fix_bug(self, code: str, error_message: str) -> str:
        """自动修复Bug"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": "你是一名代码调试专家。请修复以下代码中的Bug。"},
                {"role": "user", "content": f"代码:\n{code}\n\n错误信息:{error_message}\n\n请输出修复后的完整代码:"}
            ]
        )
        return response.choices[0].message.content
    
    def generate_tests(self, code: str) -> str:
        """生成单元测试"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": "你是一名测试工程师。请为以下代码生成pytest单元测试,要求覆盖正常路径和边界情况。"},
                {"role": "user", "content": f"代码:\n{code}"}
            ]
        )
        return response.choices[0].message.content

# 使用示例
agent = CodeAssistantAgent()

# 生成代码
code = agent.generate_code("实现一个LRU缓存类,支持get和put操作,容量限制为maxsize")
print(code)

# 审查代码
review = agent.review_code("""
def add(a,b):
    return a+b
""")
print(json.dumps(review, ensure_ascii=False, indent=2))

3.4.3 企业研发效能指标

指标说明提升效果
代码编写效率单位时间完成的功能点提升30-50%
Bug率每千行代码缺陷数降低20-40%
代码审查周期PR从提交到合并的时间缩短50-70%
文档覆盖率有文档的代码比例提升至80%+
新人上手时间新开发者达到生产效率的时间缩短40-60%

3.5 数据分析师Agent

3.5.1 系统设计

python
自然语言查询


┌──────────────┐
│ NL2SQL模块   │ <- Agent: 自然语言转SQL查询
├──────────────┤
│  SQL执行引擎  │ <- 安全执行 + 结果缓存
├──────────────┤
│  结果解释模块  │ <- Agent: 将数据结果转化为自然语言
├──────────────┤
│  可视化建议   │ <- Agent: 推荐最佳可视化方式
└──────┬───────┘


   问答结果 + 图表

3.5.2 核心代码实现

python
from openai import OpenAI
import json
import sqlite3
import pandas as pd

class DataAnalystAgent:
    """数据分析师Agent"""
    
    def __init__(self, db_path: str, model="gpt-4"):
        self.client = OpenAI()
        self.model = model
        self.db_path = db_path
        self.schema = self._get_schema()
    
    def _get_schema(self) -> str:
        """获取数据库结构"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()
        
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
        tables = cursor.fetchall()
        
        schema = []
        for table in tables:
            table_name = table[0]
            cursor.execute(f"PRAGMA table_info({table_name})")
            columns = cursor.fetchall()
            col_desc = ", ".join([f"{col[1]} ({col[2]})" for col in columns])
            schema.append(f"表 {table_name}: ({col_desc})")
        
        conn.close()
        return "\n".join(schema)
    
    def nl2sql(self, question: str) -> str:
        """自然语言转SQL"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": f"""你是一个数据库查询专家。
数据库结构如下:
{self.schema}

请将用户的自然语言问题转换为SQL查询。
只输出SQL语句,不要加任何解释。"""},
                {"role": "user", "content": f"问题:{question}"}
            ]
        )
        return response.choices[0].message.content.strip()
    
    def execute_sql(self, sql: str) -> dict:
        """安全执行SQL查询"""
        # 安全检查:只允许SELECT
        if not sql.strip().upper().startswith("SELECT"):
            return {"error": "只允许执行SELECT查询", "data": None}
        
        try:
            conn = sqlite3.connect(self.db_path)
            df = pd.read_sql_query(sql, conn)
            conn.close()
            
            return {
                "data": df.to_dict(orient="records"),
                "columns": df.columns.tolist(),
                "rows": len(df)
            }
        except Exception as e:
            return {"error": str(e), "data": None}
    
    def explain_result(self, question: str, sql: str, result: dict) -> str:
        """解释查询结果"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": """你是一名数据分析师。
请用通俗易懂的语言解释查询结果。包含:
1. 核心发现(关键数据点)
2. 数据解读(趋势、异常、洞察)
3. 业务建议(基于数据的行动建议)"""},
                {"role": "user", "content": f"""
用户问题:{question}
SQL查询:{sql}
查询结果(共{result['rows']}条):
{json.dumps(result['data'][:10], ensure_ascii=False, indent=2)}
""" if result['data'] else f"查询无结果或出错"}
            ]
        )
        return response.choices[0].message.content
    
    def suggest_chart(self, result: dict) -> dict:
        """推荐可视化方式"""
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": """分析数据并推荐最佳可视化方式。
输出JSON格式:
{
    "chart_type": "bar|line|pie|scatter|table",
    "x_axis": "x轴字段",
    "y_axis": "y轴字段",
    "title": "图表标题",
    "reason": "选择理由"
}"""},
                {"role": "user", "content": f"数据列:{result['columns']}\n数据样例:{json.dumps(result['data'][:5], ensure_ascii=False)}"}
            ],
            response_format={"type": "json_object"}
        )
        return json.loads(response.choices[0].message.content)
    
    def ask(self, question: str) -> dict:
        """完整的数据分析流程"""
        print(f"问题:{question}")
        
        # 1. NL2SQL
        sql = self.nl2sql(question)
        print(f"SQL:{sql}")
        
        # 2. 执行
        result = self.execute_sql(sql)
        if result.get("error"):
            return {"error": result["error"]}
        
        # 3. 结果解释
        explanation = self.explain_result(question, sql, result)
        
        # 4. 可视化建议
        chart_suggestion = self.suggest_chart(result) if result["rows"] > 0 else None
        
        return {
            "sql": sql,
            "data": result["data"][:20],  # 限制返回条数
            "explanation": explanation,
            "chart": chart_suggestion
        }


# ========= 快速开始:创建示例数据库 =========
def create_sample_db():
    """创建示例销售数据库"""
    conn = sqlite3.connect("sales.db")
    cursor = conn.cursor()
    
    cursor.execute("""
    CREATE TABLE IF NOT EXISTS sales (
        id INTEGER PRIMARY KEY,
        product TEXT,
        category TEXT,
        amount REAL,
        quantity INTEGER,
        sale_date TEXT,
        region TEXT
    )
    """)
    
    sample_data = [
        ("笔记本电脑", "电子产品", 5999, 10, "2025-01-15", "华东"),
        ("手机", "电子产品", 3999, 25, "2025-01-20", "华南"),
        ("办公椅", "家具", 1299, 8, "2025-02-10", "华东"),
        ("显示器", "电子产品", 2499, 15, "2025-02-18", "华北"),
        ("键盘", "配件", 399, 30, "2025-03-05", "华南"),
    ]
    
    cursor.executemany(
        "INSERT INTO sales (product, category, amount, quantity, sale_date, region) VALUES (?, ?, ?, ?, ?, ?)",
        sample_data
    )
    
    conn.commit()
    conn.close()
    print("示例数据库已创建:sales.db")

# 使用示例
# create_sample_db()  # 首次运行取消注释
# agent = DataAnalystAgent("sales.db")
# result = agent.ask("各产品类别的总销售额是多少?")
# print(result["explanation"])

3.5.3 安全与权限控制

安全措施说明实现方式
查询白名单只允许SELECT操作SQL语法解析校验
行级权限不同用户只能看特定数据WHERE条件自动注入
查询超时防止慢查询SQL超时设置(<30s)
结果脱敏敏感字段自动隐藏列级脱敏规则
审计日志记录所有查询操作日志系统

小结与练习

知识小结

  1. RAG+Agent知识库:文档向量化→混合检索→增强生成,是企业AI落地的首选方案
  2. 智能客服系统:意图识别→自助回复→转人工,双轨设计兼顾效率与体验
  3. 合同审核Agent:多格式解析→结构化审核→风险识别,提升法务效率
  4. 代码助手Agent:代码生成→审查→修复→测试,贯穿研发全流程
  5. 数据分析Agent:NL2SQL→执行→解释→可视化,降低数据使用门槛

练习

练习1:搭建企业知识库

选择你熟悉的技术文档(至少5篇),实现:
1. 文档加载和分块
2. 向量数据库构建(ChromaDB)
3. RAG问答接口
4. 添加引用溯源功能

练习2:智能客服系统

实现一个客服Demo,包含:
1. 意图识别(至少4种意图)
2. FAQ自助回复(基于知识库)
3. 转人工逻辑
4. 坐席助手的建议生成

练习3:合同审核工具

实现一个简单的合同审核工具:
1. 支持PDF/DOCX格式上传
2. 提取合同关键条款
3. 识别风险点(至少5类)
4. 生成审核报告

练习4:数据分析Agent

连接一个数据库(SQLite/MySQL),实现:
1. 自然语言转SQL
2. 安全查询执行
3. 结果解释
4. 可视化建议
用3个不同的问题测试效果。

下一章预告:章节4-生产级部署工程 - 从开发到生产环境的完整部署方案

Python 学习资料