1772702706
This commit is contained in:
@@ -1,102 +0,0 @@
|
||||
# 总体目标
|
||||
|
||||
1、支持 IBS 动态数据查询(工单进展、域名配置、运营数据、订购数据等);
|
||||
2、智能分析 CDN 优质客户;
|
||||
3、团队纵向扩展:支持融合 CDN 配置一键下发下发、DNS动态数据查询等
|
||||
|
||||
# 公司现状
|
||||
|
||||
基于 vLLM 推理引擎部署 DeepSeek-R1-Distill-Qwen-32B
|
||||
|
||||
> 32K tokens(32768 约 2.4 万字中文)
|
||||
> 使用 vLLM 框架,注意需开启工具调用相关配置。
|
||||
|
||||
RAGFlow v0.18.0 2025-04-23(知识库)
|
||||
|
||||
> 最新 v0.24.0
|
||||
> 完全支持 MCP v0.20.0
|
||||
> 依赖 MySQL、ES、Redis、MinIO
|
||||
|
||||
# 概念
|
||||
|
||||
bge 向量模型。
|
||||
|
||||
Function Calling / Tool Call / Tool Calling
|
||||
|
||||
[LangGraph](https://docs.langchain.com/oss/python/langgraph/overview) 个人理解为拖拽
|
||||
|
||||
**MCP** 服务端 + **ReAct Agent** 智能体 + **RAGFlow** 知识库
|
||||
|
||||
**MCP**(Model Context Protocol,模型上下文协议)是一种用于将 AI 应用连接到外部系统的开源标准。
|
||||
|
||||
> 通俗点理解
|
||||
> 列出能力:服务器告诉客户端它提供哪些 tools/resources/prompts,以及每个 tool 的参数结构
|
||||
> 调用工具:客户端发起 call tool,带上符合 schema 的参数
|
||||
> 返回结果:服务器返回结构化结果(文本/数据/错误),客户端再交给模型继续推理
|
||||
|
||||
**ReAct**: Synergizing Reasoning and Acting in Language Models
|
||||
|
||||
> Question: 用户问题
|
||||
>
|
||||
> Thought: 我需要查一下数据
|
||||
> Action: 调用查询工具(search API)
|
||||
> Observation: 返回查询结果
|
||||
>
|
||||
> Thought: 根据结果我可以推理答案
|
||||
> Action: 再调用一个工具 / 或直接回答
|
||||
>
|
||||
> Final Answer: 最终结果
|
||||
|
||||
**RAGFlow**(开源的 RAG 工程化平台 / 系统)Python TypeScript
|
||||
|
||||
本质是 RAG(Retrieval-Augmented Generation)检索增强生成
|
||||
|
||||
> 用户问题
|
||||
> ↓
|
||||
> 去知识库检索相关内容
|
||||
> ↓
|
||||
> 把检索结果喂给大模型
|
||||
> ↓
|
||||
> 生成答案
|
||||
|
||||
**DB-GPT** 开源的“AI 原生数据应用开发框架”,用大模型来操作数据库和数据系统。
|
||||
|
||||
# 问题
|
||||
|
||||
鉴权问题:哪个平台能调用哪些工具,哪个平台的哪些用户能调用哪些工具
|
||||
|
||||
AI 平台颁发系统级别 Token 限制你能用的工具。
|
||||
|
||||
也就是比如你在我们平台注册了你的 tool,然后调用我们 AI 接口,需要 MCP server Token 和 用户 Token。
|
||||
|
||||
如果只用户 Token,那么是不是就需要一个 令牌置换 方案。
|
||||
|
||||
你有什么工具?
|
||||
|
||||
我想知道企业A的域名列表。
|
||||
|
||||
我想查询 企业A a.com 近 5 天的峰值。
|
||||
|
||||
# 备注
|
||||
|
||||
RAGFlow 版本升级至少 v0.20.0。(注意一下是否可以开启自身当作 MCP 服务的功能。)
|
||||
|
||||
dify 的整体使用流程流畅很多。
|
||||
|
||||
后期 Tool 多了,我们是否提供 MCP 注册中心。
|
||||
|
||||
Tool 代码的封装。
|
||||
|
||||
dify API 的研究。
|
||||
|
||||
DeepSeek-R1-Distill-Qwen-32B 工具调用。
|
||||
|
||||

|
||||
|
||||
发指令 --》ibs-ai --> RAGflow --> 智能决策 a 工具 b 知识库
|
||||
|
||||
需要 MCP server Token 和 用户 Token。
|
||||
|
||||
后期 Tool 多了,我们是否提供 MCP 注册中心。
|
||||
|
||||
DeepSeek-R1-Distill-Qwen-32B 工具调用。
|
||||
@@ -1,24 +0,0 @@
|
||||
给我增加两个我们项目的 demo 工具。为我的查询峰值智能体做测试准备
|
||||
|
||||
1. 根据企业 ID 获取 企业的所属域名。(入参是企业 ID,响应 10 个域名, a.com, b.com… 固定十个。)但现在企业 ID 只有 企业A ,其他 企业 ID 返回无域名。
|
||||
2. 根据企业 ID 和 域名 获取域名近 5 天的峰值带宽。(峰值带宽可以随机 mock)如果用户无域名 ID 输入返回需要输入域名。
|
||||
|
||||
现在我有一个 ibs-mcp-server :
|
||||
|
||||
queryDomainPeakBandwidth
|
||||
|
||||
根据企业 ID 和域名查询该域名近 5 天的峰值带宽数据(单位:Mbps)
|
||||
|
||||
queryEnterpriseDomains
|
||||
|
||||
根据企业 ID 查询该企业所属的域名列表
|
||||
|
||||
queryWeather
|
||||
|
||||
查询指定城市在指定日期的天气预报,返回天气状况、温度、湿度和风力信息
|
||||
|
||||
你能给我生成一个可以导入 ragflow 的 json agent 么?让我可以直接使用。
|
||||
|
||||
智能体的工作就是可以查训用户的域名,如果用户没有输入域名可以用 queryEnterpriseDomains 给用户提示。
|
||||
|
||||
生成到根目录。注意学习相关语法。
|
||||
@@ -1,72 +0,0 @@
|
||||
# 关于 Node
|
||||
|
||||
| Node.js | Java |
|
||||
| --------------- | ----------- |
|
||||
| Node.js version | JDK version |
|
||||
| V8 Engine | JVM |
|
||||
| npm | Maven |
|
||||
| N-API | JNI |
|
||||
|
||||
## Node.js 版本
|
||||
|
||||
[Node.js — Node.js 版本](https://nodejs.org/zh-cn/about/previous-releases)
|
||||
|
||||
# 学习资料
|
||||
|
||||
https://u19tul1sz9g.feishu.cn/docx/WEWJdSzF5oTnwvxHGGAc0Vojnxe?from=from_copylink
|
||||
|
||||
密码:M6923&65
|
||||
|
||||
# 第一章 开发环境与核心概念
|
||||
|
||||
UI = f(State)
|
||||
|
||||
用户界面仅仅是应用程序状态的一个函数
|
||||
|
||||
初始化环境
|
||||
|
||||
```
|
||||
pnpm create vite@latest basic --template react-ts
|
||||
```
|
||||
|
||||
导入方式:
|
||||
|
||||
具名导入:
|
||||
|
||||
```
|
||||
import { ... } from 'react'
|
||||
```
|
||||
|
||||
默认导入:
|
||||
|
||||
```
|
||||
import ... from 'react'
|
||||
```
|
||||
|
||||
副作用导入:
|
||||
|
||||
```
|
||||
import './index.css'
|
||||
```
|
||||
|
||||
# CSS
|
||||
|
||||
顶级作用域
|
||||
|
||||
```
|
||||
:root {
|
||||
```
|
||||
|
||||
媒体查询
|
||||
|
||||
```
|
||||
@media (prefers-color-scheme: light) {
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
ID 选择器
|
||||
|
||||
```
|
||||
#root
|
||||
```
|
||||
@@ -1,360 +0,0 @@
|
||||
## 1. 对话相关模块与入口
|
||||
|
||||
### 1.1 HTTP 接口入口(后端)
|
||||
|
||||
聊天(SSE 流式):`POST /session/chat`
|
||||
查询会话列表:`POST /session/page/list`
|
||||
查询某会话的历史消息列表:`POST /session/message/list`
|
||||
消息反馈(点赞/点踩/评论):`POST /session/message_feedback`
|
||||
|
||||
### 1.2 鉴权与用户上下文
|
||||
|
||||
对 `/session/**` 路径做拦截:
|
||||
|
||||
Filter:`web/src/main/java/com/cmcc/ai/web/filter/UserAuthFilter.java:31-55`
|
||||
|
||||
---
|
||||
|
||||
## 2. 前端怎么传参(对话接口)
|
||||
|
||||
### 2.1 发送消息:`POST /session/chat`
|
||||
|
||||
```json
|
||||
{
|
||||
"content": "用户输入的文本",
|
||||
"sessionId": 123,
|
||||
"parentMessageId": 456,
|
||||
"contentType": "text",
|
||||
"role": "user"
|
||||
}
|
||||
```
|
||||
|
||||
#### 实际必填/有效字段(按当前后端实现)
|
||||
|
||||
- **必填**:`content`
|
||||
- **可选**:`sessionId`
|
||||
- `sessionId == null`:后端会创建一个新会话
|
||||
- `sessionId != null`:后端按该会话进行多轮
|
||||
|
||||
### 2.2 前端接收方式:SSE
|
||||
|
||||
`core/src/main/java/com/cmcc/ai/core/vo/MessageVO.java:20-72`
|
||||
|
||||
```json
|
||||
{
|
||||
"sessionId": 1,
|
||||
"messageId": 10002,
|
||||
"parentMessageId": 10001,
|
||||
"role": "assistant",
|
||||
"contentType": "text",
|
||||
"msgStatus": "sending",
|
||||
"content": "本次增量 token",
|
||||
"reasoningContent": "(可选)模型推理内容"
|
||||
}
|
||||
```
|
||||
|
||||
当流结束时,后端会发送一条 `msgStatus=finished` 的消息(通常 `content` 为空或为最后一段),并结束 SSE 连接。
|
||||
|
||||
---
|
||||
|
||||
## 3. 后端对话编排流程(从 Controller 到落库)
|
||||
|
||||
核心实现类:
|
||||
|
||||
- `core/src/main/java/com/cmcc/ai/core/service/impl/SessionServiceImpl.java`
|
||||
|
||||
### 3.1 会话创建 / parentMessageId 选择
|
||||
|
||||
入口:`generateChatResponses(TextMessageParam param, Long userId)`
|
||||
|
||||
- `SessionServiceImpl.java:446-464`
|
||||
|
||||
逻辑:
|
||||
|
||||
1. **首次对话**(`param.sessionId == null`)
|
||||
- `parentMessageId` 被强制设为 `0L`(常量 `DEFAULT_PARENT_MSG_ID`)
|
||||
- 创建 `session_info` 记录(summary 取首条消息截断)
|
||||
- 代码:`SessionServiceImpl.java:449-453`
|
||||
|
||||
2. **非首次对话**(`param.sessionId != null`)
|
||||
- 查询该 session 下 `message_info` 的最大 id 作为 `parentMessageId`
|
||||
- 代码:`SessionServiceImpl.java:454-456`
|
||||
- Mapper:`MessageInfoMapper.xml:143-145`(`select max(id)`)
|
||||
|
||||
> 这意味着当前实现的父子关系是“链式”的:每次提问默认挂在上一条消息后面,而不是维护一棵分支对话树。
|
||||
|
||||
### 3.2 历史消息拼接(多轮上下文)
|
||||
|
||||
历史消息查询:
|
||||
|
||||
- `queryHistoryMsg(sessionId)`:`SessionServiceImpl.java:596-607`
|
||||
|
||||
构造规则:
|
||||
|
||||
1. 第一条固定是 **system prompt**
|
||||
- `generateFirstMsg()`:`SessionServiceImpl.java:614-617`
|
||||
- system prompt 来源:系统配置 `OLLAMA_CHART_SYSTEM_MSG`
|
||||
- 若配置不存在则使用默认常量 `SYSTEM_MSG`
|
||||
|
||||
2. 从 DB 查出该 session 的所有历史 `message_content`(按 `mc.id asc`)
|
||||
- SQL:`MessageContentMapper.xml:151-157`
|
||||
- 每条记录映射为 `ChatMessage{role, content}`
|
||||
|
||||
3. 把“本次用户提问”也 append 到 historyMsg(作为最后一条 user 消息)
|
||||
- `aiChatDialog()`:`SessionServiceImpl.java:632-634`
|
||||
|
||||
最终 historyMsg 会被完整送给大模型(多轮上下文就是这么实现的)。
|
||||
|
||||
### 3.3 用户消息落库
|
||||
|
||||
在真正请求大模型之前,用户消息会先落库:
|
||||
|
||||
- 插入 `message_info`(用户侧):`insertMessage(…)`
|
||||
- `SessionServiceImpl.aiChatDialog():628-630`
|
||||
- 插入 `message_content`(用户文本):`insertMessageContent(…)`
|
||||
- `SessionServiceImpl.aiChatDialog():630-631`
|
||||
|
||||
对应表结构见 `web/src/main/resources/init.sql`:
|
||||
|
||||
- `session_info`
|
||||
- `message_info`
|
||||
- `message_content`
|
||||
|
||||
---
|
||||
|
||||
## 4. 调用的哪个 AI 接口?请求长什么样?
|
||||
|
||||
### 4.1 AI 接口地址与模型配置来自哪里
|
||||
|
||||
后端不在配置文件里写死模型与地址,而是从 DB 的 `system_config` 表读取:
|
||||
|
||||
- 读取 service:`SystemConfigServiceImpl.java:31-50`
|
||||
- key 枚举:`common/src/main/java/com/cmcc/ai/enums/SysConfigKeyEnum.java:14-31`
|
||||
|
||||
对话相关的 key:
|
||||
|
||||
- `OLLAMA_MODEL`:模型名
|
||||
- `OLLAMA_CHART_URL`:多轮对话接口地址
|
||||
- `OLLAMA_CHART_SYSTEM_MSG`:system prompt
|
||||
- `API_KEY`:调用上游 AI 服务时的 Authorization(代码里默认按 Bearer 使用,具体值建议视为敏感信息)
|
||||
|
||||
在示例初始化 SQL 中(`init.sql:70-75`),`OLLAMA_CHART_URL` 指向一个 **OpenAI 兼容风格** 的路径:`/v1/chat/completions`。
|
||||
|
||||
> 虽然命名叫 `OLLAMA_*`,但实际对接的上游接口形态更接近 OpenAI/DeepSeek 的 Chat Completions 流式接口。
|
||||
|
||||
### 4.2 后端发给上游 AI 的请求体
|
||||
|
||||
组装请求的代码:
|
||||
|
||||
- `aiChatDialog()`:`SessionServiceImpl.java:648-653`
|
||||
|
||||
请求体类型:`OllamaMutiplePrompt`
|
||||
|
||||
- `common/src/main/java/com/cmcc/ai/model/OllamaMutiplePrompt.java:20-36`
|
||||
|
||||
结构:
|
||||
|
||||
```json
|
||||
{
|
||||
"model": "<来自 system_config.OLLAMA_MODEL>",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "..."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "..."
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "..."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "本次问题"
|
||||
}
|
||||
],
|
||||
"stream": true
|
||||
}
|
||||
```
|
||||
|
||||
HTTP 请求(后端 → 上游 AI):
|
||||
|
||||
- 方法:POST
|
||||
- URL:`system_config.OLLAMA_CHART_URL`
|
||||
- Header:`Authorization: <system_config.API_KEY>`
|
||||
- 代码:`SessionServiceImpl.handleMessageWithWebClient():156-175`
|
||||
- Accept:`text/event-stream`
|
||||
|
||||
---
|
||||
|
||||
## 5. AI 接口返回的什么?后端如何解析?
|
||||
|
||||
上游 AI 返回被按“流式”逐行消费:
|
||||
|
||||
- `bodyToFlux(String.class)`:`SessionServiceImpl.handleMessageWithWebClient():170-178`
|
||||
|
||||
后端假定每一行 `line`:
|
||||
|
||||
- 要么是 `"[DONE]"`
|
||||
- 要么是一个 JSON chunk,可反序列化为 `ChatCompletionChunk`
|
||||
|
||||
解析模型(按 DeepSeek/OpenAI streaming chunk 风格):
|
||||
|
||||
- `common/src/main/java/com/cmcc/ai/model/ChatCompletionChunk.java`
|
||||
- 主要取值:`choices[0].delta.content`
|
||||
- 推理字段:`choices[0].delta.reasoning_content`
|
||||
|
||||
对应解析与映射:
|
||||
|
||||
- `generateDeepSeekChatMessage()`:`SessionServiceImpl.java:272-311`
|
||||
|
||||
映射结果是内部统一的 `MessageVO`:
|
||||
|
||||
- `messageVO.content = delta.content`
|
||||
- `messageVO.reasoningContent = delta.reasoningContent`
|
||||
- `messageVO.msgStatus`:
|
||||
- chunk 中包含 `finish_reason / stop_reason` 或 line 为 `[DONE]` 时,置为 `finished`
|
||||
- 否则为 `sending`
|
||||
|
||||
> 文件里还存在 `generateChatMessage()` 用于解析 `OllamaStreamResponse`(`SessionServiceImpl.java:321-345`),但当前 `handleMessageWithWebClient()` 实际调用的是 `generateDeepSeekChatMessage()`(`SessionServiceImpl.java:184`)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 后端给前端返回的什么?
|
||||
|
||||
### 6.1 SSE 推送的内容
|
||||
|
||||
后端对每个上游 chunk 都会向前端推一个 SSE event:
|
||||
|
||||
- `ServerSentEvent.builder(JSON.toJSONString(message)).build()`
|
||||
- 代码:`SessionServiceImpl.handleMessageWithWebClient():178-189`
|
||||
|
||||
也就是:
|
||||
|
||||
- SSE 的 `data` = `MessageVO` 的 JSON 字符串
|
||||
|
||||
前端收到后:
|
||||
|
||||
- 通过 `messageId` 把同一条 assistant 消息的 token 拼起来
|
||||
- 通过 `msgStatus` 判断是否完成
|
||||
- 通过 `sessionId` 确定归属会话
|
||||
|
||||
### 6.2 对话完成后的落库与状态更新
|
||||
|
||||
后端在发起上游请求时,会先创建一条“assistant message_info(sending)”:
|
||||
|
||||
- `assistantMessage = insertMessage(…, MsgStatusEnum.SENDING)`
|
||||
- 代码:`SessionServiceImpl.handleMessageWithWebClient():162-168`
|
||||
|
||||
流式接收过程中:
|
||||
|
||||
- `contentBuilder` 累积每个 chunk 的 `delta.content`
|
||||
- `generateDeepSeekChatMessage():303-306`
|
||||
|
||||
流结束后(`doFinally`):
|
||||
|
||||
- 正常完成:
|
||||
- `message_content` 插入完整文本(role=assistant)
|
||||
- `message_info.msg_status` 更新为 `finished`
|
||||
- 并触发异步评价(见下一节)
|
||||
- 代码:`SessionServiceImpl.handleMessageWithWebClient():191-195` + `handlerResponseMessage():208-218`
|
||||
- 异常 / 取消:
|
||||
- 仍会尽量保存已累积内容
|
||||
- 并将 `message_info.msg_status` 更新为 `error/cancelled`
|
||||
- 代码:`handlerResponseMessage():219-235`
|
||||
|
||||
### 6.3 非流式查询:历史消息列表接口返回
|
||||
|
||||
- `POST /session/message/list`
|
||||
- 返回:`ApiResponse<List<MessageListVO>>`
|
||||
- `MessageListVO`:`core/src/main/java/com/cmcc/ai/core/vo/MessageListVO.java`
|
||||
- 内含 `contents: List<MessageContentVO>`
|
||||
|
||||
这用于“进入会话后加载历史对话”的场景。
|
||||
|
||||
---
|
||||
|
||||
## 7. 多轮对话是如何实现的?(关键点总结)
|
||||
|
||||
本项目的多轮对话实现方式可以概括为:
|
||||
|
||||
1. 每次用户发消息时:
|
||||
- 先把用户消息写入 DB(`message_info + message_content`)
|
||||
2. 组装“system + 历史 messages + 本次 user message”形成完整 messages 数组
|
||||
- 历史消息来自 DB `message_content`,按 `mc.id asc`
|
||||
3. 把完整 messages 一次性发给上游 `/v1/chat/completions`(stream=true)
|
||||
4. 上游返回流式 chunk:
|
||||
- 后端逐 chunk 转成 `MessageVO`,通过 SSE 推给前端
|
||||
5. 流结束后:
|
||||
- 把 assistant 的完整文本一次性落库
|
||||
|
||||
即:**上下文存储在 DB,每次请求时“全量带上历史”**。
|
||||
|
||||
---
|
||||
|
||||
## 8. 评价(可选链路,和对话强相关)
|
||||
|
||||
对话完成后会触发一次“问答质量评估”的异步调用:
|
||||
|
||||
- 触发点:`handlerResponseMessage()` 的 `ON_COMPLETE` 分支
|
||||
- `SessionServiceImpl.java:209-217`
|
||||
|
||||
调用实现:`EvaluationServiceImpl.evaluationResult()`
|
||||
|
||||
- `core/src/main/java/com/cmcc/ai/core/service/impl/EvaluationServiceImpl.java:115-160`
|
||||
|
||||
它会:
|
||||
|
||||
1. 从 `system_config` 读取:
|
||||
- `EVALUATE_TASK_URL`
|
||||
- `CALLBACK_URL`
|
||||
2. 读取“本次问/答”的 message_content 内容
|
||||
3. POST 到评估系统(请求包含 query/response/callbackUrl)
|
||||
4. 评估系统回调:`POST /evaluation/callback`
|
||||
- Controller:`web/src/main/java/com/cmcc/ai/web/rest/EvaluationCallController.java:36-46`
|
||||
|
||||
这条链路不影响前端展示主流程,但会写入 `evaluation_result` 表并支撑后续统计/导出。
|
||||
|
||||
---
|
||||
|
||||
## 9. 给前端的最小对接清单(建议)
|
||||
|
||||
### 9.1 发起对话
|
||||
|
||||
- `POST /session/chat`
|
||||
- body:
|
||||
|
||||
```json
|
||||
{ "content": "...", "sessionId": 123 }
|
||||
```
|
||||
|
||||
### 9.2 处理 SSE
|
||||
|
||||
- 每个 event 的 `data` 是 JSON 字符串(`MessageVO`)
|
||||
- 用 `content` 做增量拼接
|
||||
- 用 `msgStatus` 判断完成
|
||||
- **首次对话**从第一条 event 里取 `sessionId`,用于后续多轮
|
||||
|
||||
### 9.3 加载历史
|
||||
|
||||
- `POST /session/message/list`
|
||||
- body:
|
||||
|
||||
```json
|
||||
{ "sessionId": 123 }
|
||||
```
|
||||
|
||||
(后端只读取 `sessionId` 字段:`SessionController.java:78-83`)
|
||||
|
||||
---
|
||||
|
||||
## 10. 关键代码定位索引
|
||||
|
||||
- 对话接口:`web/…/SessionController.java:98-105`
|
||||
- 对话编排:`core/…/SessionServiceImpl.java:446-654`
|
||||
- 上游流式请求与解析:`core/…/SessionServiceImpl.java:149-196` + `272-311`
|
||||
- 历史消息查询 SQL:`core/…/MessageContentMapper.xml:151-157`
|
||||
- 系统配置 key:`common/…/SysConfigKeyEnum.java:14-31`
|
||||
- 初始化表结构与默认配置:`web/src/main/resources/init.sql`
|
||||
@@ -1,26 +0,0 @@
|
||||
请为我的公司设计一个智能体方案(公司内部 AI 能力中台 / AI 插件市场)。
|
||||
|
||||
目前公司的主要业务是:用户可以通过我们的平台引入域名,域名在平台产生计费计量后,可以查询相关的流量情况或带宽情况。
|
||||
|
||||
我们现在已经有了一个 RAGFlow 流程,但也仅限于实现基础的知识库智能问答。
|
||||
|
||||
我们现在的目标是:
|
||||
|
||||
1. 支持IBS动态数据查询(工单进展、域名配置、运营数据、订购数据等);
|
||||
2. 智能分析CDN优质客户;
|
||||
3. 团队纵向扩展:支持融合CDN配置一键下发下发、DNS动态数据查询
|
||||
4. 实现通过对话查询流量或峰值带宽的效果。
|
||||
5. 构建一个总体的、标准化的智能体框架。
|
||||
6. 我们的后端代码以 Java 为主,希望这个框架是可对接的,后续能方便其他业务组(比如做 DNS 指令下发的团队)接入。
|
||||
7. 实现一键 AI 智能下发。其他小组只需按照我们提供的规范提供接口,就可以接入到我们的智能体中,通过对话框完成业务操作。
|
||||
|
||||
请帮我设计一个完整汇报可行性方案,并给出技术选型建议:
|
||||
|
||||
1. 语言环境:基于 Java 语言。
|
||||
2. 技术选型:是否建议使用 Spring Boot 或 Spring AI?
|
||||
3. 框架评估:目前比较火的 AI 框架,比如 MCP(Model Context Protocol),是否适合我们的业务场景?
|
||||
4. 架构设计:如何设计才能保证后期智能体的高可扩展性?比如其他组提供一个接口规范,我们就能为其提供智能服务。
|
||||
|
||||
比如先说一个简单的流程:我要查流量,那肯定是智能体去编排,决定调用某一个智能体的 Agent 工具,然后发起流量查询等等。这是一个简单的流程。
|
||||
|
||||
比如现在我整个服务已经跑起来了,此时隔壁的项目组给了我一个配置下发的接口,并告诉了我这个接口的参数以及请求地址。我能不能通过“可配置化”的形式,直接在我的页面上把它的地址、需要的参数等信息输入进去,这样我的智能体就拥有了这个能力,而不需要停服务或者进行二次开发。
|
||||
@@ -1,95 +0,0 @@
|
||||
### 第一梯队:句子的绝对核心(没他们开不了机)
|
||||
|
||||
#### 1. 主语 (Subject) —— “男/女主角”
|
||||
|
||||
- **是什么**:整句话的主导者,也就是**“谁”**或者**“什么东西”**。它通常站在句子的最开头。
|
||||
- **谁来演**:通常由**名词**或**代词**(我、你、他)来演。
|
||||
- **例子**:
|
||||
- **I** love apples. (**我**爱苹果。) 👉 “我”是主语。
|
||||
- **The dog** is running. (**狗**在跑。) 👉 “狗”是主语。
|
||||
|
||||
#### 2. 谓语 (Predicate) —— “核心动作”
|
||||
|
||||
- **是什么**:主角(主语)**“做了什么”**动作。可以说,没有谓语就没有英语句子!
|
||||
- **谁来演**:**只能由动词**来演!
|
||||
- **例子**:
|
||||
- I **love** apples. (我**爱**苹果。) 👉 “爱”是谓语。
|
||||
- The dog **bites** the cat. (狗**咬**猫。) 👉 “咬”是谓语。
|
||||
|
||||
#### 3. 宾语 (Object) —— “承受者 / 倒霉蛋”
|
||||
|
||||
- **是什么**:动作的承受者。也就是主角的动作发泄在谁身上了。通常放在谓语(动作)的后面。
|
||||
- **谁来演**:通常由**名词**或**代词**来演。
|
||||
- **例子**:
|
||||
- I love **apples**. (我爱**苹果**。) 👉 “苹果”被爱,是宾语。
|
||||
- The dog bites **the cat**. (狗咬**猫**。) 👉 “猫”被咬,是宾语。
|
||||
|
||||
> **💡 小结一下:主谓宾 (S-V-O)**
|
||||
> **[狗]** (主语/谁) + **[咬]** (谓语/动作) + **[猫]** (宾语/承受者)。
|
||||
> 这就是英语中最常见、最重要的骨架!
|
||||
|
||||
---
|
||||
|
||||
### 第二梯队:说明状态的特殊组合
|
||||
|
||||
#### 4. 表语 (Predicative) —— “身份状态标签”
|
||||
|
||||
- **是什么**:当句子里没有明显的动作(比如跑、跳、吃),而是想说主语**“是什么”**或**“怎么样”**时,用来贴标签的词,就叫表语。
|
||||
- **位置**:它永远跟在 `am/is/are` (系动词) 的后面。
|
||||
- **例子**:
|
||||
- I am **a teacher**. (我是**老师**。) 👉 “老师”说明我的身份,是表语。
|
||||
- She is **beautiful**. (她是**美丽的**。) 👉 “美丽的”说明她的状态,是表语。
|
||||
|
||||
---
|
||||
|
||||
### 第三梯队:让句子变得更丰富的“配角”
|
||||
|
||||
如果你只会主谓宾,句子就像光秃秃的树干(我吃苹果)。要想句子好听,就需要下面这几个“配角”来添枝加叶:
|
||||
|
||||
#### 5. 定语 (Attribute) —— “名词的专属化妆师”
|
||||
|
||||
- **是什么**:用来修饰、限定**名词**的。它告诉你这个东西“是什么样的”、“谁的”、“多少个”。
|
||||
- **谁来演**:主要是**形容词**。
|
||||
- **例子**:
|
||||
- I love **red** apples. (我爱**红色的**苹果。) 👉 “红色的”修饰苹果,是定语。
|
||||
- This is **my** book. (这是**我的**书。) 👉 “我的”修饰书,是定语。
|
||||
|
||||
#### 6. 状语 (Adverbial) —— “电影的背景板”
|
||||
|
||||
- **是什么**:用来交代动作发生的**时间、地点、原因、方式**等。它修饰的是动词(动作)或整个句子。
|
||||
- **谁来演**:通常是**副词**或**介词短语**。
|
||||
- **例子**:
|
||||
- I eat apples **in the morning**. (我**在早上**吃苹果。) 👉 “在早上”交代时间,是时间状语。
|
||||
- The dog runs **fast**. (狗跑得**快**。) 👉 “快”交代跑的方式,是方式状语。
|
||||
|
||||
#### 7. 补语 (Complement) —— “最后的补充说明”
|
||||
|
||||
- **是什么**:有时候有了主语、谓语、宾语,意思还不完整,需要再补充一下。
|
||||
- **例子**:
|
||||
- Apples make me **happy**. (苹果让我**开心**。)
|
||||
- *解释*:如果只说 Apples make me (苹果让我…),话没说完。加上 happy,补充说明“我”的状态,这个 happy 就是宾语补足语(简称宾补)。
|
||||
|
||||
---
|
||||
|
||||
### 👑 终极实战演练(一句话把它们全串起来)
|
||||
|
||||
我们来看一句完整的话,看看大家都在演什么角色:
|
||||
|
||||
> **Yesterday, my cute dog bit a bad thief seriously.**
|
||||
> (昨天,我可爱的狗狠狠地咬了一个坏小偷。)
|
||||
|
||||
我们来拆解一下这部“电影”的卡司阵容:
|
||||
|
||||
1. **dog** (狗) 👉 **主语** (谁干的?狗干的)
|
||||
2. **bit** (咬了) 👉 **谓语** (干了什么动作?咬)
|
||||
3. **thief** (小偷) 👉 **宾语** (谁被咬了?小偷被咬了)
|
||||
4. **my cute** (我的可爱的) 👉 **定语** (给狗化妆:什么样的狗?)
|
||||
5. **a bad** (一个坏的) 👉 **定语** (给小偷化妆:什么样的小偷?)
|
||||
6. **Yesterday** (昨天) 👉 **状语** (背景板:什么时候咬的?)
|
||||
7. **seriously** (狠狠地) 👉 **状语** (背景板:怎么咬的?)
|
||||
|
||||
**给新手的建议:**
|
||||
|
||||
你现在基础比较弱,**绝对不要去死记硬背 4、5、6、7**!
|
||||
|
||||
你现在只需要在看每一句英语的时候,能像侦探一样,准确地把 **“主语(谁)”**、**“谓语(动作)”**、**“宾语(承受者)”** 抓出来,你的英语阅读和造句就能直接及格了!
|
||||
-136
@@ -1,136 +0,0 @@
|
||||
# 第一部分:英语的8大核心“词性”(积木的种类)
|
||||
|
||||
要查字典或学语法,必须先认识词性。每个单词都有自己的“身份”。
|
||||
|
||||
## 1. 名词 (Noun, 缩写: **n.**) —— “名字”
|
||||
|
||||
- **是什么**:人、物品、地点、概念的名称。
|
||||
- **怎么用**:通常作句子的主角(主语)或接收动作的对象(宾语)。
|
||||
- **例子**:
|
||||
- `apple` (苹果), `water` (水), `teacher` (老师), `China` (中国)
|
||||
- **造句**:The **teacher** likes **apples**. (老师喜欢苹果。)
|
||||
|
||||
## 2. 代词 (Pronoun, 缩写: **pron.**) —— “替身演员”
|
||||
|
||||
- **是什么**:用来代替名词,为了说话不啰嗦。(比如不说“李雷吃饭,李雷喝水”,而说“他吃饭,他喝水”)
|
||||
- **怎么用**:用法和名词一样。
|
||||
- **例子**:
|
||||
- `I` (我), `you` (你), `he/she/it` (他/她/它), `they` (他们)
|
||||
- **造句**:**He** likes apples. (**他**喜欢苹果。)
|
||||
|
||||
## 3. 动词 (Verb, 缩写: **v.**) —— “动作或状态” (核心发动机!)
|
||||
|
||||
- **是什么**:表示“做什么”或“是什么”。一个完整的句子**必须**有动词!
|
||||
- **怎么用**:放在主角(主语)后面。
|
||||
- **例子**:
|
||||
- 动作:`run` (跑), `eat` (吃), `study` (学习)
|
||||
- 状态(联系动词):`am / is / are` (是)
|
||||
- **造句**:I **eat** apples. (我**吃**苹果。) / I **am** happy. (我**是**快乐的。)
|
||||
|
||||
## 4. 形容词 (Adjective, 缩写: **adj.**) —— “化妆师”
|
||||
|
||||
- **是什么**:用来修饰**名词**,说明人或事物“怎么样”。
|
||||
- **怎么用**:放在名词前面,或者 `am/is/are` 后面。
|
||||
- **例子**:
|
||||
- `big` (大的), `beautiful` (美丽的), `red` (红色的)
|
||||
- **造句**:A **red** apple. (一个**红色的**苹果。) / The apple is **big**. (这个苹果很**大**。)
|
||||
|
||||
## 5. 副词 (Adverb, 缩写: **adv.**) —— “特效师”
|
||||
|
||||
- **是什么**:用来修饰**动词**、**形容词**。通常表示时间、地点、程度、方式。很多副词以 `-ly` 结尾。
|
||||
- **怎么用**:一般放在动词之后,或形容词之前。
|
||||
- **例子**:
|
||||
- `very` (非常), `quickly` (快速地), `here` (这里), `yesterday` (昨天)
|
||||
- **造句**:I eat **quickly**. (我吃得**很快**。) / It is **very** big. (它**非常**大。)
|
||||
|
||||
## 6. 介词 (Preposition, 缩写: **prep.**) —— “桥梁”
|
||||
|
||||
- **是什么**:表示方位、时间、关系,它不能单独存在,后面必须跟名词。
|
||||
- **怎么用**:和名词手拉手,组成“介词短语”。
|
||||
- **例子**:
|
||||
- `in` (在…里), `on` (在…上), `at` (在…点钟), `with` (和…一起)
|
||||
- **造句**:The apple is **on** the table. (苹果**在**桌子**上**。)
|
||||
|
||||
## 7. 连词 (Conjunction, 缩写: **conj.**) —— “胶水”
|
||||
|
||||
- **是什么**:把单词和单词、句子和句子连在一起。
|
||||
- **怎么用**:放在两个要连接的部分中间。
|
||||
- **例子**:
|
||||
- `and` (和), `but` (但是), `because` (因为), `so` (所以)
|
||||
- **造句**:I like apples **and** bananas. (我喜欢苹果**和**香蕉。)
|
||||
|
||||
## 8. 感叹词 (Interjection, 缩写: **int.**) —— “情绪包”
|
||||
|
||||
- **是什么**:表达惊讶、高兴、痛苦等情绪的词。(最简单,基本不影响语法)。
|
||||
- **例子**:`Wow!` (哇), `Ouch!` (哎哟), `Oh!` (哦)
|
||||
|
||||
# 第二部分:必学的核心语法(怎么拼积木)
|
||||
|
||||
基础差的朋友,千万不要去背什么“虚拟语气”、“非谓语动词”。你只需要掌握两样东西:**句子结构(骨架)**和**时态(时间)**。
|
||||
|
||||
## 第一关:英语的两大“万能骨架”(句型)
|
||||
|
||||
**骨架1:主语 + 谓语(动词) + 宾语 (简称:主谓宾)**
|
||||
|
||||
- **通俗解释**:谁 (主) + 做了什么动作 (谓) + 承受动作的事物 (宾)。
|
||||
- **例子**:
|
||||
- I (我) + love (爱) + you (你).
|
||||
- The dog (狗) + bit (咬了) + him (他).
|
||||
- *注意:英语的语序和中文基本一样。*
|
||||
|
||||
**骨架2:主语 + 系动词(am/is/are) + 表语 (简称:主系表)**
|
||||
|
||||
- **通俗解释**:谁 (主) + 是 (系) + 身份/特征 (表)。当你想描述一个事物的状态时用这个。
|
||||
- **系动词怎么用**:我用 `am`,你用 `are`,`is` 连着他、她、它。
|
||||
- **例子**:
|
||||
- I (我) + am (是) + a student (学生). -> 描述身份
|
||||
- She (她) + is (是) + beautiful (美丽的). -> 描述特征
|
||||
|
||||
## 第二关:英语的四大基础“时态”(时间机器)
|
||||
|
||||
中文说时间,动词不变(我昨天“吃”,我明天“吃”)。但**英语里,不同的时间,动词要跟着变身!** 初学者先拿下这4个最常用的:
|
||||
|
||||
**1. 一般现在时 (习惯、真理)**
|
||||
|
||||
- **什么时候用**:经常发生的动作,或者客观事实。
|
||||
- **怎么变**:动词用原形。(⚠️大坑注意:如果主语是“他/她/它/单个人”,动词后面要加 `s` 或 `es`,这叫“第三人称单数”)。
|
||||
- **例子**:
|
||||
- I **play** games every day. (我每天玩游戏。)
|
||||
- He **plays** games every day. (他每天玩游戏。—— 动词加了s)
|
||||
|
||||
**2. 现在进行时 (此时此刻)**
|
||||
|
||||
- **什么时候用**:正在发生的事情(中文里的“正在…”)。
|
||||
- **怎么变**:am/is/are + 动词加 `ing`。
|
||||
- **例子**:
|
||||
- I **am playing** games now. (我现在**正在玩**游戏。)
|
||||
- She **is sleeping**. (她**正在睡觉**。)
|
||||
|
||||
**3. 一般过去时 (事情已结束)**
|
||||
|
||||
- **什么时候用**:过去发生的事情。
|
||||
- **怎么变**:动词变成过去式(通常是在后面加 `ed`,有些是不规则的需要背,比如 go变成went)。
|
||||
- **例子**:
|
||||
- I **played** games yesterday. (我昨天玩游戏了。—— 加了ed)
|
||||
- I **went** to Beijing last year. (我去年去了北京。—— went是go的过去式)
|
||||
|
||||
**4. 一般将来时 (未来计划)**
|
||||
|
||||
- **什么时候用**:还没发生,将要发生的事情。
|
||||
- **怎么变**:在动词原形前面加 `will` (将会),或者用 `am/is/are going to` (打算)。
|
||||
- **例子**:
|
||||
- I **will play** games tomorrow. (我明天**将会**玩游戏。)
|
||||
- We **are going to eat** pizza. (我们**打算去吃**披萨。)
|
||||
|
||||
# 第三部分:如何把这套指南用起来?(给新手的3条建议)
|
||||
|
||||
1. **先背名词和动词**:
|
||||
不要一开始就背高级形容词。先背日常见到的东西(名词:桌子水杯)和每天做的动作(动词:吃喝拉撒睡)。有这两个,你就能说出最简单的“主谓宾”了。
|
||||
2. **套公式造句(重点练习)**:
|
||||
拿一个最简单的词,用四个时态去造句,锻炼你的大脑反应:
|
||||
- 我每天喝水 (I drink water.)
|
||||
- 我正在喝水 (I am drinking water.)
|
||||
- 我昨天喝水了 (I drank water. *drink的过去式是drank*)
|
||||
- 我明天要喝水 (I will drink water.)
|
||||
3. **大声读出来**:
|
||||
语法不是做选择题做会的,是嘴巴读顺了产生“语感”的。遇到看不懂的句子,就去找它的**主语**和**动词**,找到这两个,句子大意就明白了。
|
||||
Reference in New Issue
Block a user