《60天AI学习计划启动 | Day 18: 实际应用场景 - AI 应用实战》

Day 18: 实际应用场景 - AI 应用实战

学习目标


核心学习内容

1. 典型应用场景

常见场景:

  • 智能客服:自动回答用户问题
  • 代码助手:代码生成、审查、优化
  • 文档助手:文档生成、问答、总结
  • 数据分析:数据查询、分析、可视化
  • 内容生成:文章、文案、创意内容

2. 场景实现要点

关键要素:

  • 领域知识注入
  • 上下文管理
  • 错误处理
  • 用户体验优化

实践作业

作业1:实现智能客服系统

src/applications/customer-service.js:

import { ChatOpenAI } from '@langchain/openai';
import { ConversationSummaryMemory } from 'langchain/memory';
import { LLMChain } from 'langchain/chains';
import { PromptTemplate } from '@langchain/core/prompts';
import { logger } from '../utils/logger.js';

/**
 * 智能客服系统
 */
export class CustomerService {
  constructor() {
    this.llm = new ChatOpenAI({
      temperature: 0.7,
      openAIApiKey: process.env.OPENAI_API_KEY
    });

    this.knowledgeBase = new Map();
    this.initializeKnowledgeBase();
  }

  /**
   * 初始化知识库
   */
  initializeKnowledgeBase() {
    // 常见问题库
    this.knowledgeBase.set('退货', {
      question: '如何退货?',
      answer: '您可以在订单页面申请退货,我们会在24小时内处理。',
      category: '订单'
    });

    this.knowledgeBase.set('退款', {
      question: '退款多久到账?',
      answer: '退款通常在3-5个工作日内到账。',
      category: '订单'
    });

    this.knowledgeBase.set('物流', {
      question: '如何查询物流?',
      answer: '您可以在订单详情页查看物流信息。',
      category: '物流'
    });
  }

  /**
   * 创建客服 Chain
   */
  createServiceChain(sessionId) {
    const memory = new ConversationSummaryMemory({
      llm: this.llm,
      returnMessages: true,
      memoryKey: 'history'
    });

    const prompt = PromptTemplate.fromTemplate(
      `你是一个专业的客服助手,友好、耐心、专业。

服务原则:
1. 礼貌用语,使用"您"
2. 准确回答,不确定时说明
3. 提供解决方案,不只是解释
4. 必要时转人工客服

知识库:
{knowledgeBase}

对话历史:
{history}

用户问题:{question}

请提供专业、友好的回答:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt,
      memory: memory
    });

    return chain;
  }

  /**
   * 处理客户问题
   */
  async handleQuestion(sessionId, question) {
    try {
      // 1. 检索知识库
      const knowledge = this.searchKnowledgeBase(question);

      // 2. 创建 Chain
      const chain = this.createServiceChain(sessionId);

      // 3. 生成回答
      const result = await chain.call({
        question: question,
        knowledgeBase: this.formatKnowledgeBase(knowledge)
      });

      // 4. 评估是否需要转人工
      const needHuman = await this.evaluateNeedHuman(question, result.text);

      return {
        answer: result.text,
        needHuman: needHuman,
        knowledge: knowledge
      };
    } catch (error) {
      logger.error('客服处理错误:', error);
      return {
        answer: '抱歉,我暂时无法回答,请稍后重试或联系人工客服。',
        needHuman: true
      };
    }
  }

  /**
   * 搜索知识库
   */
  searchKnowledgeBase(question) {
    const questionLower = question.toLowerCase();
    const matched = [];

    this.knowledgeBase.forEach((item, key) => {
      if (questionLower.includes(key.toLowerCase()) ||
          questionLower.includes(item.category.toLowerCase())) {
        matched.push(item);
      }
    });

    return matched;
  }

  /**
   * 格式化知识库
   */
  formatKnowledgeBase(knowledge) {
    if (knowledge.length === 0) {
      return '暂无相关知识';
    }

    return knowledge.map((item, index) => 
      `${index + 1}. Q: ${item.question}\n   A: ${item.answer}`
    ).join('\n\n');
  }

  /**
   * 评估是否需要转人工
   */
  async evaluateNeedHuman(question, answer) {
    const prompt = `评估以下客服对话是否需要转人工:

问题:${question}
回答:${answer}

如果问题复杂、涉及敏感信息、或无法解决,需要转人工。
返回 JSON:{"needHuman": true/false, "reason": "原因"}

评估:`;

    const response = await this.llm.invoke(prompt);
    
    try {
      const jsonMatch = response.content.match(/\{[\s\S]*\}/);
      if (jsonMatch) {
        const eval = JSON.parse(jsonMatch[0]);
        return eval.needHuman || false;
      }
    } catch (e) {
      // 默认不转人工
    }

    return false;
  }
}

作业2:实现代码助手

src/applications/code-assistant.js:

import { ChatOpenAI } from '@langchain/openai';
import { LLMChain } from 'langchain/chains';
import { PromptTemplate } from '@langchain/core/prompts';
import { logger } from '../utils/logger.js';

/**
 * 代码助手
 */
export class CodeAssistant {
  constructor() {
    this.llm = new ChatOpenAI({
      temperature: 0.3, // 代码生成需要较低温度
      openAIApiKey: process.env.OPENAI_API_KEY
    });
  }

  /**
   * 生成代码
   */
  async generateCode(requirement, language = 'javascript') {
    const prompt = PromptTemplate.fromTemplate(
      `你是一个专业的{language}开发专家。

需求:{requirement}

请生成:
1. 完整的代码实现
2. 详细注释
3. 使用说明
4. 注意事项

代码:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      requirement: requirement,
      language: language
    });

    return {
      code: this.extractCode(result.text),
      explanation: result.text
    };
  }

  /**
   * 审查代码
   */
  async reviewCode(code, language = 'javascript') {
    const prompt = PromptTemplate.fromTemplate(
      `审查以下{language}代码:

\`\`\`{language}
{code}
\`\`\`

请提供:
1. 代码质量问题
2. 性能优化建议
3. 安全性问题
4. 最佳实践建议

审查结果:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      code: code,
      language: language
    });

    return {
      review: result.text,
      issues: this.extractIssues(result.text)
    };
  }

  /**
   * 优化代码
   */
  async optimizeCode(code, language = 'javascript', goal = '性能') {
    const prompt = PromptTemplate.fromTemplate(
      `优化以下{language}代码,目标:{goal}

原始代码:
\`\`\`{language}
{code}
\`\`\`

请提供:
1. 优化后的代码
2. 优化说明
3. 性能对比

优化结果:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      code: code,
      language: language,
      goal: goal
    });

    return {
      optimizedCode: this.extractCode(result.text),
      explanation: result.text
    };
  }

  /**
   * 解释代码
   */
  async explainCode(code, language = 'javascript') {
    const prompt = PromptTemplate.fromTemplate(
      `详细解释以下{language}代码的功能和原理:

\`\`\`{language}
{code}
\`\`\`

请说明:
1. 代码功能
2. 关键逻辑
3. 技术要点
4. 应用场景

解释:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      code: code,
      language: language
    });

    return result.text;
  }

  /**
   * 生成测试用例
   */
  async generateTests(code, language = 'javascript', framework = 'jest') {
    const prompt = PromptTemplate.fromTemplate(
      `为以下{language}代码生成{framework}测试用例:

\`\`\`{language}
{code}
\`\`\`

请生成:
1. 单元测试
2. 边界测试
3. 异常测试

测试代码:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      code: code,
      language: language,
      framework: framework
    });

    return {
      tests: this.extractCode(result.text),
      explanation: result.text
    };
  }

  /**
   * 提取代码
   */
  extractCode(text) {
    const codeMatch = text.match(/```[\w]*\n([\s\S]*?)```/);
    if (codeMatch) {
      return codeMatch[1].trim();
    }
    return text;
  }

  /**
   * 提取问题
   */
  extractIssues(text) {
    const issues = [];
    const lines = text.split('\n');
    
    lines.forEach(line => {
      if (line.match(/问题|Issue|Bug|错误/i)) {
        issues.push(line.trim());
      }
    });

    return issues;
  }
}

作业3:实现文档助手

src/applications/document-assistant.js:

import { ChatOpenAI } from '@langchain/openai';
import { LLMChain } from 'langchain/chains';
import { PromptTemplate } from '@langchain/core/prompts';
import { ragService } from '../services/rag.js';
import { logger } from '../utils/logger.js';

/**
 * 文档助手
 */
export class DocumentAssistant {
  constructor() {
    this.llm = new ChatOpenAI({
      temperature: 0.7,
      openAIApiKey: process.env.OPENAI_API_KEY
    });
  }

  /**
   * 生成文档
   */
  async generateDocument(code, docType = 'api') {
    const templates = {
      api: `为以下代码生成 API 文档:

代码:
{code}

文档要求:
1. API 概述
2. 参数说明
3. 返回值说明
4. 使用示例
5. 错误处理

文档:`,
      readme: `为以下项目生成 README:

代码:
{code}

README 要求:
1. 项目介绍
2. 功能特性
3. 安装使用
4. API 文档
5. 贡献指南

README:`,
      comment: `为以下代码生成详细注释:

代码:
{code}

注释要求:
1. 函数说明
2. 参数说明
3. 返回值说明
4. 使用示例

注释:`
    };

    const template = templates[docType] || templates.api;

    const prompt = PromptTemplate.fromTemplate(template);
    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({ code });
    return result.text;
  }

  /**
   * 文档问答(基于 RAG)
   */
  async answerQuestion(question) {
    return await ragService.answerQuestion(question);
  }

  /**
   * 文档总结
   */
  async summarizeDocument(content, maxLength = 500) {
    const prompt = PromptTemplate.fromTemplate(
      `总结以下文档内容,控制在{maxLength}字以内:

文档:
{content}

总结要求:
1. 核心要点
2. 关键信息
3. 重要结论

总结:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      content: content,
      maxLength: maxLength
    });

    return result.text;
  }

  /**
   * 文档翻译
   */
  async translateDocument(content, targetLang = 'en') {
    const prompt = PromptTemplate.fromTemplate(
      `将以下内容翻译为{targetLang}:

内容:
{content}

翻译要求:
1. 准确翻译
2. 保持格式
3. 专业术语准确

翻译:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      content: content,
      targetLang: targetLang
    });

    return result.text;
  }
}

作业4:实现数据分析助手

src/applications/data-analyst.js:

import { ChatOpenAI } from '@langchain/openai';
import { LLMChain } from 'langchain/chains';
import { PromptTemplate } from '@langchain/core/prompts';
import { logger } from '../utils/logger.js';

/**
 * 数据分析助手
 */
export class DataAnalyst {
  constructor() {
    this.llm = new ChatOpenAI({
      temperature: 0.3, // 数据分析需要准确性
      openAIApiKey: process.env.OPENAI_API_KEY
    });
  }

  /**
   * 分析数据
   */
  async analyzeData(data, question) {
    const prompt = PromptTemplate.fromTemplate(
      `分析以下数据,回答:{question}

数据:
{data}

请提供:
1. 数据概览(总数、平均值等)
2. 趋势分析
3. 异常检测
4. 结论和建议

分析结果:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      data: this.formatData(data),
      question: question
    });

    return {
      analysis: result.text,
      insights: this.extractInsights(result.text)
    };
  }

  /**
   * 生成 SQL 查询
   */
  async generateSQL(requirement, schema) {
    const prompt = PromptTemplate.fromTemplate(
      `根据以下需求生成 SQL 查询:

需求:{requirement}

数据库结构:
{schema}

请生成:
1. SQL 查询语句
2. 查询说明
3. 预期结果

SQL:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      requirement: requirement,
      schema: schema
    });

    return {
      sql: this.extractSQL(result.text),
      explanation: result.text
    };
  }

  /**
   * 数据可视化建议
   */
  async suggestVisualization(data, question) {
    const prompt = PromptTemplate.fromTemplate(
      `为以下数据分析建议合适的可视化方案:

数据:
{data}

分析问题:{question}

请建议:
1. 图表类型(柱状图、折线图等)
2. 数据维度
3. 可视化要点

建议:`
    );

    const chain = new LLMChain({
      llm: this.llm,
      prompt: prompt
    });

    const result = await chain.call({
      data: this.formatData(data),
      question: question
    });

    return result.text;
  }

  /**
   * 格式化数据
   */
  formatData(data) {
    if (Array.isArray(data)) {
      if (data.length > 10) {
        return JSON.stringify(data.slice(0, 10), null, 2) + 
               `\n... (共 ${data.length} 条记录)`;
      }
      return JSON.stringify(data, null, 2);
    }
    return JSON.stringify(data, null, 2);
  }

  /**
   * 提取洞察
   */
  extractInsights(text) {
    const insights = [];
    const lines = text.split('\n');
    
    lines.forEach(line => {
      if (line.match(/结论|建议|洞察|发现/i)) {
        insights.push(line.trim());
      }
    });

    return insights;
  }

  /**
   * 提取 SQL
   */
  extractSQL(text) {
    const sqlMatch = text.match(/```sql\n([\s\S]*?)```/i) ||
                     text.match(/SELECT[\s\S]*?;/i);
    if (sqlMatch) {
      return sqlMatch[1] || sqlMatch[0];
    }
    return text;
  }
}

作业5:创建应用 API

src/routes/applications.js:

import express from 'express';
import { CustomerService } from '../applications/customer-service.js';
import { CodeAssistant } from '../applications/code-assistant.js';
import { DocumentAssistant } from '../applications/document-assistant.js';
import { DataAnalyst } from '../applications/data-analyst.js';
import { logger } from '../utils/logger.js';

export const applicationsRouter = express.Router();

// 初始化应用
const customerService = new CustomerService();
const codeAssistant = new CodeAssistant();
const documentAssistant = new DocumentAssistant();
const dataAnalyst = new DataAnalyst();

// 智能客服
applicationsRouter.post('/customer-service/ask', async (req, res) => {
  try {
    const { question, sessionId } = req.body;

    if (!question || !sessionId) {
      return res.status(400).json({
        success: false,
        error: '问题和会话ID不能为空'
      });
    }

    const result = await customerService.handleQuestion(sessionId, question);

    res.json({
      success: true,
      data: result
    });
  } catch (error) {
    logger.error('客服错误:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

// 代码生成
applicationsRouter.post('/code/generate', async (req, res) => {
  try {
    const { requirement, language } = req.body;

    if (!requirement) {
      return res.status(400).json({
        success: false,
        error: '需求不能为空'
      });
    }

    const result = await codeAssistant.generateCode(
      requirement,
      language || 'javascript'
    );

    res.json({
      success: true,
      data: result
    });
  } catch (error) {
    logger.error('代码生成错误:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

// 代码审查
applicationsRouter.post('/code/review', async (req, res) => {
  try {
    const { code, language } = req.body;

    if (!code) {
      return res.status(400).json({
        success: false,
        error: '代码不能为空'
      });
    }

    const result = await codeAssistant.reviewCode(
      code,
      language || 'javascript'
    );

    res.json({
      success: true,
      data: result
    });
  } catch (error) {
    logger.error('代码审查错误:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

// 文档生成
applicationsRouter.post('/document/generate', async (req, res) => {
  try {
    const { code, docType } = req.body;

    if (!code) {
      return res.status(400).json({
        success: false,
        error: '代码不能为空'
      });
    }

    const result = await documentAssistant.generateDocument(
      code,
      docType || 'api'
    );

    res.json({
      success: true,
      data: { document: result }
    });
  } catch (error) {
    logger.error('文档生成错误:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

// 数据分析
applicationsRouter.post('/data/analyze', async (req, res) => {
  try {
    const { data, question } = req.body;

    if (!data || !question) {
      return res.status(400).json({
        success: false,
        error: '数据和问题不能为空'
      });
    }

    const result = await dataAnalyst.analyzeData(data, question);

    res.json({
      success: true,
      data: result
    });
  } catch (error) {
    logger.error('数据分析错误:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

遇到的问题

问题1:领域知识不足

解决方案:

// 构建领域知识库
const knowledgeBase = {
  '前端开发': ['Vue', 'React', 'JavaScript'],
  '后端开发': ['Node.js', 'Python', 'Java']
};

// 在 Prompt 中注入知识
const prompt = `你是${domain}专家,知识库:${knowledgeBase[domain]}`;

问题2:上下文过长

解决方案:

// 使用摘要记忆
const memory = new ConversationSummaryMemory({
  llm: llm,
  maxTokenLimit: 2000
});

学习总结

今日收获

  1. ✅ 理解 AI 应用实际场景
  2. ✅ 实现典型应用案例
  3. ✅ 掌握场景实现要点
  4. ✅ 性能优化实践
  5. ✅ 最佳实践总结

关键知识点

  • 场景化应用,针对具体需求
  • 领域知识,提升准确性
  • 用户体验,优化交互
  • 错误处理,增强稳定性

应用场景对比

智能客服:需要知识库、转人工机制
代码助手:需要代码理解、准确性
文档助手:需要格式处理、RAG
数据分析:需要数据理解、SQL生成

明日计划

明天将学习:

期待明天的学习! 🚀


参考资源


代码仓库

项目已更新:

  • ✅ 智能客服系统
  • ✅ 代码助手
  • ✅ 文档助手
  • ✅ 数据分析助手
  • ✅ 应用 API

GitHub 提交: Day 18 - 实际应用场景


标签: #AI学习 #实际应用 #智能客服 #代码助手 #学习笔记


写在最后

今天学习了 AI 应用的实际场景,通过具体案例加深理解。
这些应用场景都是实际工作中常见的需求。明天将继续学习性能优化和最佳实践!

继续加油! 💪


快速检查清单

完成这些,第十八天就达标了!

posted @ 2025-12-16 16:45  XiaoZhengTou  阅读(1)  评论(0)    收藏  举报