AIGC期间 | 从零到一,打造你的专属AI Chat应用!

打印 上一主题 下一主题

主题 1476|帖子 1476|积分 4428


   文章泉源:IT阅读排行榜
  
  本文摘编自《大模型项目实战:多领域智能应用开发》,高强文 著,机器工业出版社出版,经出版方授权发布,转载请标明文章泉源。
  
目标

基于大语言模型的 Chat 应用,是一种利用自然语言处置处罚技能来进行对话交互的智能应用。
大语言模型通过大量数据的学习和训练,可以或许明白自然语言表达的语义,具备智能对话的本领。当用户向 Chat 应用提出问题时,Chat 应用就会利用其学习到的知识和自然语言处置处罚技能来明白用户的意图,然后推理生成相应的答案。
我们的目标是使用 React.js 开发一个通用的 Chat 应 用步伐,提供对话 Web 界面,调用 ChatGLM3 项目的 OpenAI 兼容接口,编译并部署到 Nginx。
功能概要

(1)Chat 交互界面

该应用使用 Chat 对话模式的界面,接收用户的输入内容,并将其显示到聊天记载中。大语言模型返回的结果会回写到聊天记载中。用户与大模型交换的文本用左右位置或图标进行区分。
(2)流式接口

这是指 OpenAI 兼容的流式调用方式,最早由 ChatGPT 使用,现在已成为大语言模型 Chat 应用究竟上的接口标准。流式访问是一种服务端逐步推送数据、客户端逐步接收结果并显示的方法,适用于处置处罚大量数据或长时间运行的任务。
(3)多轮会话

多轮对话是指模型把当前的问题及上文的问答情况整合到一起,形成关于问题的上下文形貌。由于在多轮会话中输入的 token 较长,问题的上下文形貌得比较清楚,相干语境也构建得相对完备,所以相比于单轮对话,多轮会话生成的答案更为公道。
其缺点在于随着对话轮数的增长,输入的 token 越来越长,会影响大语言模型的运算效率。所以在详细实现 Chat 应用时,要对汗青对话记载进行一定的限定,以防止输入 token 过长导致模型的生成性能降落。
(4)打字效果

ChatGPT 采用了模仿打字的视觉效果实现行文本的逐步生成,既保证用户能在第一时间获取生成的部分文本信息,不会觉得等候时间很长,也淘汰了大模型一次性生成长文本导致算力过载的情况。因此,这次所开发的应用也采用了此技能来显示文本的生成过程。
打字效果的实现基于 SSE 服务端推送技能。SSE 是一种 HTML5 技能,允许服务器向客户端推送数据,而不需要客户端主动请求。它能在服务端有新消息时,将消息实时推送到前 端,从而实现动态打字的聊天效果。
系统架构

Chat 应用是一个 B/S 结构的应用。服务端由大语言模型的 OpenAI API 服务提供,客户端使用 React.js 编写,部署于 Nginx。客户端通过欣赏器访问页面,在欣赏器中执行 JavaScript 代码,以将用户的输入发送至服务端,渲染页面显示服务端返回的结果。其架构图见图 1。

                                         图                            1                            C                            h                            a                            t                            应用架构图                                  图 1 Chat 应用架构图                     图1Chat应用架构图
(1)大模型服务层

模型推理服务由大语言模型的代码完成,如在 ChatGLM3-6B 模型的 modeling_chatglm.py 文件中,stream_chat 函数实现了流式推理。模型 API 服务则由 ChatGLM3 项目源码中的openai_api_demo/api_server.py 提供。
(2)应用服务层

在开发情况下由 npm 模仿一个本地应用服务,承担页面下载和请求代理的职责。而在正式运行情况中,这两个职责是由 Nginx 的页面部署服务和代理转发功能来完成的。Nginx 在配置上还要支持 SSE 推流模式。
(3)客户端欣赏器层

通过运行在欣赏器中的 HTML5 和 JavaScript 代码来与应用服务层交互。JavaScript 发出的 HTTP/HTTPS 请求经应用服务层转发到模型 API 服务。
运行原理


  • 欣赏器负责展现页面,调用 OpenAI 兼容接口来获取生成内容。
  • Nginx 提供页面内容以及代理调用 OpenAI 兼容接口。
  • 页面请求和接口调用在一个域名或IP:端口内,这样可以制止跨域问题。跨域问题是指在 Web 开发中,当一个网站的客户端(前端)需要调用服务端(后端)的 API 时,请求的 URL 与页面的 URL 来自差别的域名,导致安全风险,而被欣赏器拦截。
  • openai_api.py 用于装载模型,提供 API 服务。
开发

(1)Node.js 安装

React.js 步伐的开发调试要在 Node.js 情况下进行。从 https://nodejs.org/ 中下载并安装 Node.js,然后在下令行运行node -v下令来测试它是否安装成功。
(2)chat-app 新建

1)新建应用新建一个名为 chat-app 的 React.js 应用,下令如下。
  1. npm install -g create-react-app
  2. create-react-app chat-app
  3. cd chat-app
复制代码
2)安装组件chat-app 用到两个第三方组件,一个是作为 Chat 界面的 ChatUI 框架,另一个是调用模型 API 服务的 Node.js 组件—openai-node。
  1. npm i --save @chatui/core
  2. npm i --save openai
复制代码
源代码

实现 Chat 页面和业务逻辑的代码在 src/app.js 中。它只有 61 行代码,下面完备展示出来。
  1. import './App.css';
  2. import React from 'react';
  3. import '@chatui/core/es/styles/index.less';
  4. import Chat, { Bubble, useMessages } from '@chatui/core';
  5. import '@chatui/core/dist/index.css';
  6. import OpenAI from 'openai';
  7. const openai = new OpenAI({
  8. apiKey: 'EMPTY', dangerouslyAllowBrowser: true,
  9. baseURL: "http://server-llm-dev:8000/v1"
  10. });
  11. var message_history = [];
  12. function App() {
  13. const { messages, appendMsg, setTyping, updateMsg } = useMessages([]);
  14. async function chat_stream(prompt, _msgId) {
  15. message_history.push({ role: 'user', content: prompt });
  16. const stream = openai.beta.chat.completions.stream({
  17. model: 'ChatGLM3-6B',
  18. messages: message_history,
  19. stream: true,
  20. });
  21. var snapshot = "";
  22. for await (const chunk of stream) {
  23. snapshot = snapshot + chunk.choices[0]?.delta?.content || '';
  24. updateMsg(_msgId, {
  25. type: "text",
  26. content: { text: snapshot.trim() }
  27. });
  28. }
  29. message_history.push({ "role": "assistant", "content": snapshot });
  30. }
  31. function handleSend(type, val) {
  32. if (type === 'text' && val.trim()) {
  33. appendMsg({
  34. type: 'text',
  35. content: { text: val },
  36. position: 'right',
  37. });
  38. const msgID = new Date().getTime();
  39. setTyping(true);
  40. appendMsg({
  41. _id: msgID,
  42. type: 'text',
  43. content: { text: '' },
  44. });
  45. chat_stream(val, msgID);
  46. }
  47. }
  48. function renderMessageContent(msg) {
  49. const { content } = msg;
  50. return <Bubble content={content.text} />;
  51. }
  52. return (
  53. <Chat
  54. navbar={{ title: 'chat-app' }}
  55. messages={messages}
  56. renderMessageContent={renderMessageContent}
  57. onSend={handleSend}
  58. />
  59. );
  60. }
  61. export default App;
复制代码
测试

(1)启动大模型 API 服务

安装 ChatGLM3-6B 模型。API 服务则由 ChatGLM3 代码库的 openai_api_demo/api_server.py 提供。在这个文件中,/v1/embeddings 接口依赖一个较小文本向量模型 BAAI/bge-large-zh-v1.5。虽然本次开发应用步伐中不会用到它,但为了保证步伐能正常运行,建议先下载这个模型。
  1. cd ChatGLM3
  2. conda activate ChatGLM3
  3. wget https://aliendao.cn/model_download.py
  4. python model_download.py --e --repo_id BAAI/bge-large-zh-v1.5 \
  5. --token YPY8KHDQ2NAHQ2SG
复制代码
设定模型及文本向量模型文件所在位置,启动 API 服务,监听 8000 端口。
  1. MODEL_PATH=./dataroot/models/THUDM/chatglm3-6b \
  2. EMBEDDING_PATH=./dataroot/models/BAAI/bge-large-zh-v1.5 \
  3. python openai_api_demo/api_server.py
复制代码
(2)测试 chat-app

客户端步伐目录下运行npm start下令,以启动客户端的开发情况服务。在欣赏器中打开http://localhost:3000,运行结果如图 2 所示。

                                         图                            2                            c                            h                            a                            t                            −                            a                            p                            p                            运行                                  图 2 chat-app 运行                     图2chat−app运行
运行发现,在 chat-app 应用中,用户可以进行流式人机对话。该应用同时支持多轮对话,也实现了打字的视觉效果。
也就是说,该应用达到了原先设定的目标。
(3)界面美化

chat-app 是一个通用的 Chat 应用客户端,通过改变步伐中的apiKey和baseURL参数,可以毗连任意一个兼容 OpenAI 接口的大语言模型推理服务,当然包括在正确设置apiKey的情况下毗连 OpenAI 的服务。
此时,chat-app 的界面还需要进一步美化。比如,将输入框从一行变为多行以便于输入。
需要在 app.js 文件的同级目录下建一个 chatui-theme.css 文件,内容如下。
  1. .ChatFooter .Composer-input {
  2. background: white;
  3. max-height: 160px;
  4. border: 1px solid darkgray;
  5. min-height: 80px;
  6. height: auto;
  7. }
复制代码
在 app.js 文件中的第 6 行代码import OpenAI from ’openai’;后增长一行 下令,如下所示。
  1. import './chatui-theme.css';
复制代码
重新用npm start下令运行步伐,就可以看到输入框变成多行了。
应用发布

在步伐开发调试过程中,应用依赖于 Node.js,并以“ npm start”的方式运行。
对此,可以通过编译过程,将 React.js 步伐编译成离开 Node.js 的 HTML5 和 JavaScript 文件,部署到 Nginx 等应用服务器中运行。
(1)编译

运行以下下令编译源代码,将编译结果存放在 build 目录下。
  1. npm run build
复制代码
(2)发布

将 build 目录下的所有文件复制到 Nginx 的 html 目录下即可完成部署。
如果是 Windows操作系统,则 html 在 Nginx 的目录下;如果是 Linux 操作系统,其目录则可能是/usr/local/share/nginx/html 或 /usr/local/nginx/html。
(3)运行

首次运行 Nginx 时,在 Windows 上直接运行 nginx.exe,在 Linux 上则要运行sudo nginx下令。
如果 Nginx 已运行,那么配置文件会发生改变,需要重启。可以执行以下下令。
  1. sudo nginx -s reload
复制代码
对于该下令,在 Windows 或 Linux 上的情势几乎是一样的,区别在于因为涉及权限问题,对于 Linux 系统,需要在下令前加sudo。
(4)应用升级

借助欣赏器的缓存机制可以淘汰页面、JavaScript 代码的下载量。因为它会对相同请求 URL 的 HTML5 页面、JavaScript 代码进行缓存。然而,每次执行npm build下令产生的文件名是固定的,这样即使代码有调整,且 Nginx 的 html 目录下的文件已更新,但由于 URL 未发生变化,欣赏器仍会从缓存中加载旧版本。
为相识决这个问题,可修改 package.json 中的 version参数值,提高版本号,以编译出差别的文件名。这样欣赏器会由于 URL发生变化而忽略缓存,加载文件的最新版本。
(5)SSE 配置

启动 Nginx 服务后,就可以使用诸如http://127.0.0.1这样不带端口的 URL 访问页面,但是可能会存在跨域问题。因为页面临应 Nginx 所在盘算机的 80 端口,JavaScript 调用的是 API 服务器的 8000 端口,两者的 IP 和端口是不一样的。
如果 API 服务端不处置处罚跨域问题的话,chat-app 调 API 服务就会报跨域错误。解决的方法是在 Nginx 的 80 端口上配置一个 API 服务的路径代理。因为要支持 SSE,这个代理配置要与一般的路径代理有一定的区别。
举例来说,在 baseURL 为http://server-llm-dev:8000/v1的情况下,在 Nginx 的 conf/nginx.conf 中的 server 模块下增长一个location,如下所示。
  1. location /v1 {
  2. proxy_http_version 1.1;
  3. proxy_set_header Connection "";
  4. proxy_set_header X-Real-IP $remote_addr;
  5. proxy_set_header Host $host;
  6. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  7. # SSE 连接时的超时时间
  8. proxy_read_timeout 86400s;
  9. # 取消缓冲
  10. proxy_buffering off;
  11. # 关闭代理缓存
  12. proxy_cache off;
  13. # 禁用分块传输编码
  14. chunked_transfer_encoding off;
  15. # 反向代理到 SSE 应用的地址和端口
  16. proxy_pass http://server-llm-dev:8000/v1;
  17. }
复制代码
重启 Nginx,将 app.js 中的 baseURL 由http://server-llm-dev:8000/v1更改为http://127.0.0.1/ v1。
重新编译部署后,即可发现跨域问题得以解决。
   文章泉源:IT阅读排行榜
  
  本文摘编自《大模型项目实战:多领域智能应用开发》,高强文 著,机器工业出版社出版,经出版方授权发布,转载请标明文章泉源。
                                          ▼延伸阅读                                  ▼延伸阅读                     ▼延伸阅读

                                         《大模型项目实战:多领域智能应用开发》                                  《大模型项目实战:多领域智能应用开发》                     《大模型项目实战:多领域智能应用开发》
                                         高强文著                                  高强文 著                     高强文著
                                         从模型明白到高级应用开发真正解决实操问题                                  从模型明白到高级应用开发真正解决实操问题                     从模型明白到高级应用开发真正解决实操问题
                                         10                            大场景案例覆盖主流开发需求                                  10大场景案例覆盖主流开发需求                     10大场景案例覆盖主流开发需求
   获取方式:https://item.jd.com/14810472.html
  内容简介:

本书系统地讲解了大语言模型的实战应用过程,涵盖基础知识、常见操作和应用开发3个方面,帮助大语言模型的使用者、应用开发者循规蹈矩地掌握大模型的原理、操作以及多个场景下的应用开发技能。
目录

  1. 前 言
  2. 基础篇
  3. 第1章 大语言模型的基础知识  3
  4. 1.1 大语言模型概述  4
  5.     1.1.1 基本情况  4
  6.     1.1.2 发展历史  4
  7.     1.1.3 发展现状  6
  8.     1.1.4 发展趋势  7
  9. 1.2 基本原理  7
  10.     1.2.1 Transformer架构  8
  11.     1.2.2 编码器与解码器  8
  12.     1.2.3 自注意力机制  9
  13. 1.3 应用开发技术  11
  14.     1.3.1 Python  11
  15.     1.3.2 React.js  11
  16. 1.4 训练方法  12
  17.     1.4.1 FFT  12
  18.     1.4.2 RLHF  13
  19.     1.4.3 P-Tuning  13
  20.     1.4.4 LoRA  13
  21. 1.5 常见现象  13
  22.     1.5.1 幻觉  14
  23.     1.5.2 灾难性遗忘  14
  24.     1.5.3 涌现  14
  25.     1.5.4 价值对齐  15
  26. 第2章 大语言模型应用架构  16
  27. 2.1 整体架构  16
  28. 2.2 基础设施  17
  29.     2.2.1 硬件部分  17
  30.     2.2.2 操作系统  18
  31. 2.3 基础软件  18
  32.     2.3.1 CUDA  18
  33.     2.3.2 PyTorch  18
  34.     2.3.3 Anaconda  19
  35.     2.3.4 Nginx  19
  36. 2.4 应用软件  20
  37.     2.4.1 大语言模型文件  20
  38.     2.4.2 Transformers库  20
  39.     2.4.3 服务程序  20
  40.     2.4.4 API  21
  41.     2.4.5 客户端程序  21
  42. 第3章 大语言模型应用的工作模式  22
  43. 3.1 硬件部署  22
  44. 3.2 应用软件部署  23
  45. 3.3 运行模式  24
  46.     3.3.1 模型API服务的工作模式  24
  47.     3.3.2 模型API服务的运行过程  25
  48.     3.3.3 前后端交互方法  26
  49.     3.3.4 前端实现  27
  50. 操作篇
  51. 第4章 应用环境搭建  31
  52. 4.1 基础设施  31
  53.     4.1.1 服务器要求  31
  54.     4.1.2 操作系统准备  31
  55.     4.1.3 推理卡安装  32
  56. 4.2 基础软件安装  32
  57.     4.2.1 Linux  32
  58.     4.2.2 Windows  40
  59. 4.3 其他软件安装  41
  60.     4.3.1 Nginx  41
  61.     4.3.2 Git  42
  62. 第5章 大语言模型安装  43
  63. 5.1 ChatGLM安装  43
  64.     5.1.1 ChatGLM3模型介绍  43
  65.     5.1.2 ChatGLM3-6B安装  44
  66.     5.1.3 编程验证  45
  67. 5.2 Qwen-VL安装  47
  68.     5.2.1 Qwen模型介绍  47
  69.     5.2.2 Qwen-VL-Chat-Int4安装  47
  70.     5.2.3 编程验证  49
  71. 5.3 LLaMA2安装  50
  72.     5.3.1 LLaMA2模型介绍  50
  73.     5.3.2 Llama-2-7b-chat安装  51
  74.     5.3.3 运行验证  51
  75. 5.4 Gemma安装  54
  76.     5.4.1 Gemma模型介绍  54
  77.     5.4.2 Gemma-2B安装  55
  78.     5.4.3 编程验证  55
  79. 5.5 Whisper安装  57
  80.     5.5.1 Whisper-large-v3介绍  57
  81.     5.5.2 Whisper-large-v3安装  57
  82.     5.5.3 编程验证  58
  83. 第6章 大语言模型微调  60
  84. 6.1 ChatGLM微调  60
  85.     6.1.1 微调方法介绍  61
  86.     6.1.2 微调环境准备  61
  87.     6.1.3 语料准备  62
  88.     6.1.4 模型下载  65
  89.     6.1.5 微调过程  65
  90.     6.1.6 微调模型测试  67
  91. 6.2 LLaMA2微调  68
  92.     6.2.1 微调方法介绍  68
  93.     6.2.2 微调环境准备  69
  94.     6.2.3 语料准备  70
  95.     6.2.4 模型下载  71
  96.     6.2.5 微调过程  71
  97.     6.2.6 PEFT微调模型测试  73
  98.     6.2.7 模型合并  74
  99.     6.2.8 合并后模型测试  74
  100. 6.3 Gemma微调  74
  101.     6.3.1 微调方法介绍  74
  102.     6.3.2 微调环境准备  75
  103.     6.3.3 模型下载  75
  104.     6.3.4 微调程序开发  75
  105.     6.3.5 语料文件下载  77
  106.     6.3.6 微调与测试过程  78
  107. 第7章 大语言模型量化  79
  108. 7.1 量化介绍  79
  109. 7.2 llama.cpp量化过程  80
  110.     7.2.1 llama.cpp编译  80
  111.     7.2.2 模型GGUF格式转换  81
  112.     7.2.3 模型下载  81
  113.     7.2.4 量化过程  81
  114.     7.2.5 量化模型测试  82
  115.     7.2.6 Web方式运行  82
  116. 7.3 gemma.cpp量化过程  83
  117.     7.3.1 gemma.cpp源码下载  83
  118.     7.3.2 gemma.cpp编译  83
  119.     7.3.3 量化模型下载  84
  120.     7.3.4 推理  84
  121. 第8章 多模态模型应用  86
  122. 8.1 Stable Diffusion介绍  86
  123. 8.2 Stable Diffusion部署  87
  124.     8.2.1 代码获取  87
  125.     8.2.2 Python虚拟环境准备  87
  126.     8.2.3 依赖库安装  87
  127.     8.2.4 模型下载  88
  128.     8.2.5 服务运行  88
  129. 8.3 Stable Diffusion应用  88
  130.     8.3.1 文生图应用  89
  131.     8.3.2 图生图应用  90
  132. 开发篇
  133. 第9章 Chat应用  94
  134. 9.1 目标  94
  135. 9.2 原理  94
  136.     9.2.1 功能概要  94
  137.     9.2.2 系统架构  95
  138.     9.2.3 运行原理  96
  139. 9.3 开发过程  96
  140.     9.3.1 Node.js安装  96
  141.     9.3.2 chat-app新建  96
  142.     9.3.3 源代码  97
  143.     9.3.4 测试  98
  144.     9.3.5 应用发布  99
  145. 第10章 辅助编程应用  102
  146. 10.1 目标  103
  147. 10.2 原理  103
  148.     10.2.1 功能概要  103
  149.     10.2.2 系统架构  103
  150.     10.2.3 运行原理  104
  151. 10.3 开发过程  104
  152.     10.3.1 开发环境准备  104
  153.     10.3.2 测试模型准备  105
  154.     10.3.3 API服务实现  106
  155.     10.3.4 测试  110
  156. 第11章 VS Code插件  112
  157. 11.1 目标  112
  158. 11.2 原理  112
  159.     11.2.1 功能概要  112
  160.     11.2.2 系统架构  113
  161.     11.2.3 运行原理  114
  162. 11.3 开发过程  114
  163.     11.3.1 环境准备与项目创建  115
  164.     11.3.2 插件开发  115
  165.     11.3.3 插件发布  118
  166. 第12章 检索增强生成应用  121
  167. 12.1 目标  121
  168. 12.2 原理  122
  169.     12.2.1 功能概要  122
  170.     12.2.2 系统架构  123
  171.     12.2.3 运行原理  124
  172. 12.3 开发过程  125
  173.     12.3.1 大语言模型安装  125
  174.     12.3.2 依赖库安装  125
  175.     12.3.3 向量化模型下载  126
  176.     12.3.4 源代码  126
  177.     12.3.5 测试  128
  178. 第13章 PDF翻译应用  130
  179. 13.1 目标  130
  180. 13.2 原理  130
  181.     13.2.1 功能概要  130
  182.     13.2.2 系统架构  131
  183.     13.2.3 运行原理  131
  184. 13.3 开发过程  135
  185.     13.3.1 大语言模型安装  135
  186.     13.3.2 依赖环境安装  135
  187.     13.3.3 下载英译中模型  135
  188.     13.3.4 源代码  136
  189.     13.3.5 测试  138
  190. 第14章 智能代理应用  140
  191. 14.1 目标  140
  192. 14.2 原理  141
  193.     14.2.1 AI Agent  141
  194.     14.2.2 AutoGen  141
  195. 14.3 开发过程  143
  196.     14.3.1 大语言模型安装  143
  197.     14.3.2 Docker安装  144
  198.     14.3.3 虚拟环境准备  145
  199.     14.3.4 运行环境验证  145
  200.     14.3.5 多代理会话应用开发  146
  201. 第15章 语音模型应用  149
  202. 15.1 目标  149
  203. 15.2 原理  149
  204.     15.2.1 功能概要  149
  205.     15.2.2 系统架构  150
  206.     15.2.3 运行原理  151
  207. 15.3 开发过程  152
  208.     15.3.1 运行环境安装  152
  209.     15.3.2 模型下载  153
  210.     15.3.3 Demo运行  153
  211.     15.3.4 服务端开发  154
  212.     15.3.5 客户端开发  160
  213.     15.3.6 测试  163
  214. 第16章 数字人应用  166
  215. 16.1 目标  166
  216. 16.2 原理  167
  217.     16.2.1 功能概要  167
  218.     16.2.2 系统架构  167
  219.     16.2.3 运行原理  168
  220. 16.3 开发过程  169
  221.     16.3.1 环境准备  169
  222.     16.3.2 源代码  173
  223.     16.3.3 测试  177
  224. 第17章 提示词生成应用:从零训练模型  179
  225. 17.1 目标  179
  226. 17.2 原理  180
  227.     17.2.1 GPT-2  180
  228.     17.2.2 训练流程与应用架构  181
  229.     17.2.3 训练方法与运行原理  182
  230. 17.3 开发与训练过程  185
  231.     17.3.1 语料整理  186
  232.     17.3.2 训练  188
  233.     17.3.3 推理与服务  196
  234.     17.3.4 测试  202
  235. 第18章 AI小镇应用  204
  236. 18.1 目标  204
  237. 18.2 原理  205
  238.     18.2.1 功能概要  205
  239.     18.2.2 系统架构  206
  240.     18.2.3 运行原理  207
  241. 18.3 开发过程  209
  242.     18.3.1 大语言模型安装  210
  243.     18.3.2 开发环境搭建  210
  244.     18.3.3 地图制作  210
  245.     18.3.4 app.js  211
  246.     18.3.5 BootScene.js  213
  247.     18.3.6 GameScene.js  213
  248.     18.3.7 ChatUtils.js  218
  249.     18.3.8 测试  219
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表