接入谷歌搜索

将 FastGPT 接入谷歌搜索

工具调用模式 接入谷歌搜索 - 图1工具调用模式 接入谷歌搜索 - 图2
非工具调用模式 接入谷歌搜索 - 图3非工具调用模式 接入谷歌搜索 - 图4

如上图,利用「HTTP请求」模块,你可以外接一个搜索引擎作为 AI 回复的参考资料。这里以调用 Google Search API 为例。注意:本文主要是为了介绍 「HTTP请求」模块,具体的搜索效果需要依赖提示词和搜索引擎,尤其是【搜索引擎】,简单的搜索引擎无法获取更详细的内容,这部分可能需要更多的调试。

注册 Google Search API

参考这篇文章接入谷歌搜索 - 图5,每天可以免费使用 100 次。

写一个 Google Search 接口

这里用 Laf接入谷歌搜索 - 图6 快速实现一个接口,即写即发布,无需部署。务必打开 POST 请求方式。

Laf 谷歌搜索Demo

  1. import cloud from '@lafjs/cloud'
  2. const googleSearchKey = "xxx"
  3. const googleCxId = "3740cxxx"
  4. const baseurl = "https://www.googleapis.com/customsearch/v1"
  5. type RequestType = {
  6. searchKey: string
  7. }
  8. export default async function (ctx: FunctionContext) {
  9. const { searchKey } = ctx.body as RequestType
  10. console.log(ctx.body)
  11. if (!searchKey) {
  12. return {
  13. prompt: ""
  14. }
  15. }
  16. try {
  17. const { data } = await cloud.fetch.get(baseurl, {
  18. params: {
  19. q: searchKey,
  20. cx: googleCxId,
  21. key: googleSearchKey,
  22. c2coff: 1,
  23. start: 1,
  24. end: 20,
  25. dateRestrict: 'm[1]',
  26. }
  27. })
  28. const result = data.items.map((item) => item.snippet).join('\n');
  29. return { prompt: result }
  30. } catch (err) {
  31. console.log(err)
  32. ctx.response.status(500)
  33. return {
  34. message: "异常"
  35. }
  36. }
  37. }

模块编排 - 工具调用模式

利用工具模块,则无需多余的操作,直接由模型决定是否调用谷歌搜索,并生成检索词即可。

复制下面配置,进入「高级编排」,在右上角的 “…” 中选择「导入配置」,导入后修改「HTTP 请求」模块 - 请求地址 的值。

编排配置

  1. {
  2. "nodes": [
  3. {
  4. "nodeId": "userGuide",
  5. "name": "系统配置",
  6. "intro": "可以配置应用的系统参数",
  7. "avatar": "/imgs/workflow/userGuide.png",
  8. "flowNodeType": "userGuide",
  9. "position": {
  10. "x": 262.2732338817093,
  11. "y": -476.00241136598146
  12. },
  13. "inputs": [
  14. {
  15. "key": "welcomeText",
  16. "renderTypeList": [
  17. "hidden"
  18. ],
  19. "valueType": "string",
  20. "label": "core.app.Welcome Text",
  21. "value": ""
  22. },
  23. {
  24. "key": "variables",
  25. "renderTypeList": [
  26. "hidden"
  27. ],
  28. "valueType": "any",
  29. "label": "core.app.Chat Variable",
  30. "value": []
  31. },
  32. {
  33. "key": "questionGuide",
  34. "valueType": "boolean",
  35. "renderTypeList": [
  36. "hidden"
  37. ],
  38. "label": "core.app.Question Guide",
  39. "value": false
  40. },
  41. {
  42. "key": "tts",
  43. "renderTypeList": [
  44. "hidden"
  45. ],
  46. "valueType": "any",
  47. "label": "",
  48. "value": {
  49. "type": "web"
  50. }
  51. },
  52. {
  53. "key": "whisper",
  54. "renderTypeList": [
  55. "hidden"
  56. ],
  57. "valueType": "any",
  58. "label": "",
  59. "value": {
  60. "open": false,
  61. "autoSend": false,
  62. "autoTTSResponse": false
  63. }
  64. },
  65. {
  66. "key": "scheduleTrigger",
  67. "renderTypeList": [
  68. "hidden"
  69. ],
  70. "valueType": "any",
  71. "label": "",
  72. "value": null
  73. }
  74. ],
  75. "outputs": []
  76. },
  77. {
  78. "nodeId": "448745",
  79. "name": "流程开始",
  80. "intro": "",
  81. "avatar": "/imgs/workflow/userChatInput.svg",
  82. "flowNodeType": "workflowStart",
  83. "position": {
  84. "x": 295.8944548701009,
  85. "y": 110.81336038514848
  86. },
  87. "inputs": [
  88. {
  89. "key": "userChatInput",
  90. "renderTypeList": [
  91. "reference",
  92. "textarea"
  93. ],
  94. "valueType": "string",
  95. "label": "用户问题",
  96. "required": true,
  97. "toolDescription": "用户问题"
  98. }
  99. ],
  100. "outputs": [
  101. {
  102. "id": "userChatInput",
  103. "key": "userChatInput",
  104. "label": "core.module.input.label.user question",
  105. "valueType": "string",
  106. "type": "static"
  107. }
  108. ]
  109. },
  110. {
  111. "nodeId": "NOgbnBzUwDgT",
  112. "name": "工具调用(实验)",
  113. "intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
  114. "avatar": "/imgs/workflow/tool.svg",
  115. "flowNodeType": "tools",
  116. "showStatus": true,
  117. "position": {
  118. "x": 1028.8358722416106,
  119. "y": -500.8755882990822
  120. },
  121. "inputs": [
  122. {
  123. "key": "model",
  124. "renderTypeList": [
  125. "settingLLMModel",
  126. "reference"
  127. ],
  128. "label": "core.module.input.label.aiModel",
  129. "valueType": "string",
  130. "llmModelType": "all",
  131. "value": "FastAI-plus"
  132. },
  133. {
  134. "key": "temperature",
  135. "renderTypeList": [
  136. "hidden"
  137. ],
  138. "label": "",
  139. "value": 0,
  140. "valueType": "number",
  141. "min": 0,
  142. "max": 10,
  143. "step": 1
  144. },
  145. {
  146. "key": "maxToken",
  147. "renderTypeList": [
  148. "hidden"
  149. ],
  150. "label": "",
  151. "value": 2000,
  152. "valueType": "number",
  153. "min": 100,
  154. "max": 4000,
  155. "step": 50
  156. },
  157. {
  158. "key": "systemPrompt",
  159. "renderTypeList": [
  160. "textarea",
  161. "reference"
  162. ],
  163. "max": 3000,
  164. "valueType": "string",
  165. "label": "core.ai.Prompt",
  166. "description": "core.app.tip.chatNodeSystemPromptTip",
  167. "placeholder": "core.app.tip.chatNodeSystemPromptTip",
  168. "value": "你是谷歌搜索机器人,根据当前问题和对话记录生成搜索词。你需要自行判断是否需要进行网络实时查询:\n- 如果需查询则生成搜索词。\n- 如果不需要查询则不返回字段。"
  169. },
  170. {
  171. "key": "history",
  172. "renderTypeList": [
  173. "numberInput",
  174. "reference"
  175. ],
  176. "valueType": "chatHistory",
  177. "label": "core.module.input.label.chat history",
  178. "required": true,
  179. "min": 0,
  180. "max": 30,
  181. "value": 6
  182. },
  183. {
  184. "key": "userChatInput",
  185. "renderTypeList": [
  186. "reference",
  187. "textarea"
  188. ],
  189. "valueType": "string",
  190. "label": "用户问题",
  191. "required": true,
  192. "value": [
  193. "448745",
  194. "userChatInput"
  195. ]
  196. }
  197. ],
  198. "outputs": []
  199. },
  200. {
  201. "nodeId": "GMELVPxHfpg5",
  202. "name": "HTTP 请求",
  203. "intro": "调用谷歌搜索,查询相关内容",
  204. "avatar": "/imgs/workflow/http.png",
  205. "flowNodeType": "httpRequest468",
  206. "showStatus": true,
  207. "position": {
  208. "x": 1013.2159795348916,
  209. "y": 210.8685573380423
  210. },
  211. "inputs": [
  212. {
  213. "key": "system_addInputParam",
  214. "renderTypeList": [
  215. "addInputParam"
  216. ],
  217. "valueType": "dynamic",
  218. "label": "",
  219. "required": false,
  220. "description": "core.module.input.description.HTTP Dynamic Input",
  221. "editField": {
  222. "key": true,
  223. "valueType": true
  224. }
  225. },
  226. {
  227. "valueType": "string",
  228. "renderTypeList": [
  229. "reference"
  230. ],
  231. "key": "query",
  232. "label": "query",
  233. "toolDescription": "谷歌搜索检索词",
  234. "required": true,
  235. "canEdit": true,
  236. "editField": {
  237. "key": true,
  238. "description": true
  239. }
  240. },
  241. {
  242. "key": "system_httpMethod",
  243. "renderTypeList": [
  244. "custom"
  245. ],
  246. "valueType": "string",
  247. "label": "",
  248. "value": "POST",
  249. "required": true
  250. },
  251. {
  252. "key": "system_httpReqUrl",
  253. "renderTypeList": [
  254. "hidden"
  255. ],
  256. "valueType": "string",
  257. "label": "",
  258. "description": "core.module.input.description.Http Request Url",
  259. "placeholder": "https://api.ai.com/getInventory",
  260. "required": false,
  261. "value": "https://xxxxxx.laf.dev/google_search"
  262. },
  263. {
  264. "key": "system_httpHeader",
  265. "renderTypeList": [
  266. "custom"
  267. ],
  268. "valueType": "any",
  269. "value": [],
  270. "label": "",
  271. "description": "core.module.input.description.Http Request Header",
  272. "placeholder": "core.module.input.description.Http Request Header",
  273. "required": false
  274. },
  275. {
  276. "key": "system_httpParams",
  277. "renderTypeList": [
  278. "hidden"
  279. ],
  280. "valueType": "any",
  281. "value": [],
  282. "label": "",
  283. "required": false
  284. },
  285. {
  286. "key": "system_httpJsonBody",
  287. "renderTypeList": [
  288. "hidden"
  289. ],
  290. "valueType": "any",
  291. "value": "{\n \"searchKey\": \"{{query}}\"\n}",
  292. "label": "",
  293. "required": false
  294. }
  295. ],
  296. "outputs": [
  297. {
  298. "id": "system_addOutputParam",
  299. "key": "system_addOutputParam",
  300. "type": "dynamic",
  301. "valueType": "dynamic",
  302. "label": "",
  303. "editField": {
  304. "key": true,
  305. "valueType": true
  306. }
  307. },
  308. {
  309. "id": "httpRawResponse",
  310. "key": "httpRawResponse",
  311. "label": "原始响应",
  312. "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
  313. "valueType": "any",
  314. "type": "static"
  315. },
  316. {
  317. "id": "M5YmxaYe8em1",
  318. "type": "dynamic",
  319. "key": "prompt",
  320. "valueType": "string",
  321. "label": "prompt"
  322. }
  323. ]
  324. }
  325. ],
  326. "edges": [
  327. {
  328. "source": "448745",
  329. "target": "NOgbnBzUwDgT",
  330. "sourceHandle": "448745-source-right",
  331. "targetHandle": "NOgbnBzUwDgT-target-left"
  332. },
  333. {
  334. "source": "NOgbnBzUwDgT",
  335. "target": "GMELVPxHfpg5",
  336. "sourceHandle": "selectedTools",
  337. "targetHandle": "selectedTools"
  338. }
  339. ]
  340. }

模块编排 - 非工具调用方式

复制下面配置,进入「高级编排」,在右上角的 “…” 中选择「导入配置」,导入后修改「HTTP 请求」模块 - 请求地址 的值。

编排配置

  1. {
  2. "nodes": [
  3. {
  4. "nodeId": "userGuide",
  5. "name": "系统配置",
  6. "intro": "可以配置应用的系统参数",
  7. "avatar": "/imgs/workflow/userGuide.png",
  8. "flowNodeType": "userGuide",
  9. "position": {
  10. "x": 126.6166221945532,
  11. "y": -456.00079128406236
  12. },
  13. "inputs": [
  14. {
  15. "key": "welcomeText",
  16. "renderTypeList": [
  17. "hidden"
  18. ],
  19. "valueType": "string",
  20. "label": "core.app.Welcome Text",
  21. "value": ""
  22. },
  23. {
  24. "key": "variables",
  25. "renderTypeList": [
  26. "hidden"
  27. ],
  28. "valueType": "any",
  29. "label": "core.app.Chat Variable",
  30. "value": []
  31. },
  32. {
  33. "key": "questionGuide",
  34. "valueType": "boolean",
  35. "renderTypeList": [
  36. "hidden"
  37. ],
  38. "label": "core.app.Question Guide",
  39. "value": false
  40. },
  41. {
  42. "key": "tts",
  43. "renderTypeList": [
  44. "hidden"
  45. ],
  46. "valueType": "any",
  47. "label": "",
  48. "value": {
  49. "type": "web"
  50. }
  51. },
  52. {
  53. "key": "whisper",
  54. "renderTypeList": [
  55. "hidden"
  56. ],
  57. "valueType": "any",
  58. "label": "",
  59. "value": {
  60. "open": false,
  61. "autoSend": false,
  62. "autoTTSResponse": false
  63. }
  64. },
  65. {
  66. "key": "scheduleTrigger",
  67. "renderTypeList": [
  68. "hidden"
  69. ],
  70. "valueType": "any",
  71. "label": "",
  72. "value": null
  73. }
  74. ],
  75. "outputs": []
  76. },
  77. {
  78. "nodeId": "448745",
  79. "name": "流程开始",
  80. "intro": "",
  81. "avatar": "/imgs/workflow/userChatInput.svg",
  82. "flowNodeType": "workflowStart",
  83. "position": {
  84. "x": 189.99351048246606,
  85. "y": 50.36949968375285
  86. },
  87. "inputs": [
  88. {
  89. "key": "userChatInput",
  90. "renderTypeList": [
  91. "reference",
  92. "textarea"
  93. ],
  94. "valueType": "string",
  95. "label": "用户问题",
  96. "required": true,
  97. "toolDescription": "用户问题"
  98. }
  99. ],
  100. "outputs": [
  101. {
  102. "id": "userChatInput",
  103. "key": "userChatInput",
  104. "label": "core.module.input.label.user question",
  105. "valueType": "string",
  106. "type": "static"
  107. }
  108. ]
  109. },
  110. {
  111. "nodeId": "TWD5BAqIIFaj",
  112. "name": "判断器",
  113. "intro": "根据一定的条件,执行不同的分支。",
  114. "avatar": "/imgs/workflow/ifElse.svg",
  115. "flowNodeType": "ifElseNode",
  116. "showStatus": true,
  117. "position": {
  118. "x": 1187.4821088468154,
  119. "y": -143.83989103517257
  120. },
  121. "inputs": [
  122. {
  123. "key": "condition",
  124. "valueType": "string",
  125. "label": "",
  126. "renderTypeList": [
  127. "hidden"
  128. ],
  129. "required": false,
  130. "value": "And"
  131. },
  132. {
  133. "key": "ifElseList",
  134. "renderTypeList": [
  135. "hidden"
  136. ],
  137. "valueType": "any",
  138. "label": "",
  139. "value": [
  140. {
  141. "variable": [
  142. "lG52GzzMm65z",
  143. "6yF19MRD3nuB"
  144. ],
  145. "condition": "isEmpty",
  146. "value": ""
  147. }
  148. ]
  149. }
  150. ],
  151. "outputs": [
  152. {
  153. "id": "IF",
  154. "key": "IF",
  155. "label": "IF",
  156. "valueType": "any",
  157. "type": "source"
  158. },
  159. {
  160. "id": "ELSE",
  161. "key": "ELSE",
  162. "label": "ELSE",
  163. "valueType": "any",
  164. "type": "source"
  165. }
  166. ]
  167. },
  168. {
  169. "nodeId": "1ljV0oTq4zeC",
  170. "name": "HTTP 请求",
  171. "intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
  172. "avatar": "/imgs/workflow/http.png",
  173. "flowNodeType": "httpRequest468",
  174. "showStatus": true,
  175. "position": {
  176. "x": 1992.0328696814468,
  177. "y": 127.08080019458595
  178. },
  179. "inputs": [
  180. {
  181. "key": "DYNAMIC_INPUT_KEY",
  182. "renderTypeList": [
  183. "addInputParam"
  184. ],
  185. "valueType": "dynamic",
  186. "label": "",
  187. "required": false,
  188. "description": "core.module.input.description.HTTP Dynamic Input",
  189. "editField": {
  190. "key": true,
  191. "valueType": true
  192. }
  193. },
  194. {
  195. "key": "searchKey",
  196. "valueType": "string",
  197. "label": "searchKey",
  198. "renderTypeList": [
  199. "reference"
  200. ],
  201. "description": "",
  202. "canEdit": true,
  203. "editField": {
  204. "key": true,
  205. "valueType": true
  206. },
  207. "value": [
  208. "lG52GzzMm65z",
  209. "6yF19MRD3nuB"
  210. ]
  211. },
  212. {
  213. "key": "system_httpMethod",
  214. "renderTypeList": [
  215. "custom"
  216. ],
  217. "valueType": "string",
  218. "label": "",
  219. "value": "POST",
  220. "required": true
  221. },
  222. {
  223. "key": "system_httpReqUrl",
  224. "renderTypeList": [
  225. "hidden"
  226. ],
  227. "valueType": "string",
  228. "label": "",
  229. "description": "core.module.input.description.Http Request Url",
  230. "placeholder": "https://api.ai.com/getInventory",
  231. "required": false,
  232. "value": "https://xxxxxx.laf.dev/google_search"
  233. },
  234. {
  235. "key": "system_httpHeader",
  236. "renderTypeList": [
  237. "custom"
  238. ],
  239. "valueType": "any",
  240. "value": [],
  241. "label": "",
  242. "description": "core.module.input.description.Http Request Header",
  243. "placeholder": "core.module.input.description.Http Request Header",
  244. "required": false
  245. },
  246. {
  247. "key": "system_httpParams",
  248. "renderTypeList": [
  249. "hidden"
  250. ],
  251. "valueType": "any",
  252. "value": [],
  253. "label": "",
  254. "required": false
  255. },
  256. {
  257. "key": "system_httpJsonBody",
  258. "renderTypeList": [
  259. "hidden"
  260. ],
  261. "valueType": "any",
  262. "value": "{\n \"searchKey\": \"{{searchKey}}\"\n}",
  263. "label": "",
  264. "required": false
  265. },
  266. {
  267. "key": "system_addInputParam",
  268. "renderTypeList": [
  269. "addInputParam"
  270. ],
  271. "valueType": "dynamic",
  272. "label": "",
  273. "required": false,
  274. "description": "core.module.input.description.HTTP Dynamic Input",
  275. "editField": {
  276. "key": true,
  277. "valueType": true
  278. }
  279. }
  280. ],
  281. "outputs": [
  282. {
  283. "id": "system_addOutputParam",
  284. "key": "system_addOutputParam",
  285. "type": "dynamic",
  286. "valueType": "dynamic",
  287. "label": "",
  288. "editField": {
  289. "key": true,
  290. "valueType": true
  291. }
  292. },
  293. {
  294. "id": "httpRawResponse",
  295. "key": "httpRawResponse",
  296. "label": "原始响应",
  297. "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
  298. "valueType": "any",
  299. "type": "static"
  300. },
  301. {
  302. "id": "yw0oz9XWFXYf",
  303. "type": "dynamic",
  304. "key": "prompt",
  305. "valueType": "string",
  306. "label": "prompt"
  307. }
  308. ]
  309. },
  310. {
  311. "nodeId": "Nc6hBdb3l9Pe",
  312. "name": "AI 对话",
  313. "intro": "AI 大模型对话",
  314. "avatar": "/imgs/workflow/AI.png",
  315. "flowNodeType": "chatNode",
  316. "showStatus": true,
  317. "position": {
  318. "x": 1982.442841318768,
  319. "y": -664.9716343803625
  320. },
  321. "inputs": [
  322. {
  323. "key": "model",
  324. "renderTypeList": [
  325. "settingLLMModel",
  326. "reference"
  327. ],
  328. "label": "core.module.input.label.aiModel",
  329. "valueType": "string",
  330. "value": "gpt-3.5-turbo"
  331. },
  332. {
  333. "key": "temperature",
  334. "renderTypeList": [
  335. "hidden"
  336. ],
  337. "label": "",
  338. "value": 0,
  339. "valueType": "number",
  340. "min": 0,
  341. "max": 10,
  342. "step": 1
  343. },
  344. {
  345. "key": "maxToken",
  346. "renderTypeList": [
  347. "hidden"
  348. ],
  349. "label": "",
  350. "value": 2000,
  351. "valueType": "number",
  352. "min": 100,
  353. "max": 4000,
  354. "step": 50
  355. },
  356. {
  357. "key": "isResponseAnswerText",
  358. "renderTypeList": [
  359. "hidden"
  360. ],
  361. "label": "",
  362. "value": true,
  363. "valueType": "boolean"
  364. },
  365. {
  366. "key": "quoteTemplate",
  367. "renderTypeList": [
  368. "hidden"
  369. ],
  370. "label": "",
  371. "valueType": "string"
  372. },
  373. {
  374. "key": "quotePrompt",
  375. "renderTypeList": [
  376. "hidden"
  377. ],
  378. "label": "",
  379. "valueType": "string"
  380. },
  381. {
  382. "key": "systemPrompt",
  383. "renderTypeList": [
  384. "textarea",
  385. "reference"
  386. ],
  387. "max": 3000,
  388. "valueType": "string",
  389. "label": "core.ai.Prompt",
  390. "description": "core.app.tip.chatNodeSystemPromptTip",
  391. "placeholder": "core.app.tip.chatNodeSystemPromptTip",
  392. "selectedTypeIndex": 1,
  393. "value": [
  394. "1ljV0oTq4zeC",
  395. "httpRawResponse"
  396. ]
  397. },
  398. {
  399. "key": "history",
  400. "renderTypeList": [
  401. "numberInput",
  402. "reference"
  403. ],
  404. "valueType": "chatHistory",
  405. "label": "core.module.input.label.chat history",
  406. "required": true,
  407. "min": 0,
  408. "max": 30,
  409. "value": 6
  410. },
  411. {
  412. "key": "userChatInput",
  413. "renderTypeList": [
  414. "reference",
  415. "textarea"
  416. ],
  417. "valueType": "string",
  418. "label": "用户问题",
  419. "required": true,
  420. "toolDescription": "用户问题",
  421. "value": [
  422. "448745",
  423. "userChatInput"
  424. ]
  425. },
  426. {
  427. "key": "quoteQA",
  428. "renderTypeList": [
  429. "settingDatasetQuotePrompt"
  430. ],
  431. "label": "",
  432. "debugLabel": "知识库引用",
  433. "description": "",
  434. "valueType": "datasetQuote"
  435. }
  436. ],
  437. "outputs": [
  438. {
  439. "id": "history",
  440. "key": "history",
  441. "label": "core.module.output.label.New context",
  442. "description": "core.module.output.description.New context",
  443. "valueType": "chatHistory",
  444. "type": "static"
  445. },
  446. {
  447. "id": "answerText",
  448. "key": "answerText",
  449. "label": "core.module.output.label.Ai response content",
  450. "description": "core.module.output.description.Ai response content",
  451. "valueType": "string",
  452. "type": "static"
  453. }
  454. ]
  455. },
  456. {
  457. "nodeId": "FYLw1BokYUad",
  458. "name": "文本加工",
  459. "intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
  460. "avatar": "/imgs/workflow/textEditor.svg",
  461. "flowNodeType": "pluginModule",
  462. "showStatus": false,
  463. "position": {
  464. "x": 2479.5913201989906,
  465. "y": 288.52613614690904
  466. },
  467. "inputs": [
  468. {
  469. "key": "system_addInputParam",
  470. "valueType": "dynamic",
  471. "label": "动态外部数据",
  472. "renderTypeList": [
  473. "addInputParam"
  474. ],
  475. "required": false,
  476. "description": "",
  477. "canEdit": false,
  478. "value": "",
  479. "editField": {
  480. "key": true
  481. },
  482. "dynamicParamDefaultValue": {
  483. "inputType": "reference",
  484. "valueType": "string",
  485. "required": true
  486. }
  487. },
  488. {
  489. "key": "q",
  490. "valueType": "string",
  491. "label": "q",
  492. "renderTypeList": [
  493. "reference"
  494. ],
  495. "required": true,
  496. "description": "",
  497. "canEdit": true,
  498. "editField": {
  499. "key": true
  500. },
  501. "value": [
  502. "448745",
  503. "userChatInput"
  504. ]
  505. },
  506. {
  507. "key": "response",
  508. "valueType": "string",
  509. "label": "response",
  510. "renderTypeList": [
  511. "reference"
  512. ],
  513. "required": true,
  514. "description": "",
  515. "canEdit": true,
  516. "editField": {
  517. "key": true
  518. },
  519. "value": [
  520. "1ljV0oTq4zeC",
  521. "yw0oz9XWFXYf"
  522. ]
  523. },
  524. {
  525. "key": "文本",
  526. "valueType": "string",
  527. "label": "文本",
  528. "renderTypeList": [
  529. "textarea"
  530. ],
  531. "required": true,
  532. "description": "",
  533. "canEdit": false,
  534. "value": "请使用下面<data> </data>中的数据作为你的知识。请直接输出答案,不要提及你是从<data> </data>中获取的知识。\n\n当前时间:{{cTime}}\n\n<data>\n{{response}}\n</data>\n\n我的问题:\"{{q}}\"",
  535. "editField": {
  536. "key": true
  537. },
  538. "maxLength": "",
  539. "dynamicParamDefaultValue": {
  540. "inputType": "reference",
  541. "valueType": "string",
  542. "required": true
  543. }
  544. }
  545. ],
  546. "outputs": [
  547. {
  548. "id": "text",
  549. "type": "static",
  550. "key": "text",
  551. "valueType": "string",
  552. "label": "text",
  553. "description": ""
  554. }
  555. ],
  556. "pluginId": "community-textEditor"
  557. },
  558. {
  559. "nodeId": "EX0g9oK3sCOC",
  560. "name": "AI 对话",
  561. "intro": "AI 大模型对话",
  562. "avatar": "/imgs/workflow/AI.png",
  563. "flowNodeType": "chatNode",
  564. "showStatus": true,
  565. "position": {
  566. "x": 3199.17223136331,
  567. "y": -100.06379812849427
  568. },
  569. "inputs": [
  570. {
  571. "key": "model",
  572. "renderTypeList": [
  573. "settingLLMModel",
  574. "reference"
  575. ],
  576. "label": "core.module.input.label.aiModel",
  577. "valueType": "string",
  578. "value": "gpt-3.5-turbo"
  579. },
  580. {
  581. "key": "temperature",
  582. "renderTypeList": [
  583. "hidden"
  584. ],
  585. "label": "",
  586. "value": 0,
  587. "valueType": "number",
  588. "min": 0,
  589. "max": 10,
  590. "step": 1
  591. },
  592. {
  593. "key": "maxToken",
  594. "renderTypeList": [
  595. "hidden"
  596. ],
  597. "label": "",
  598. "value": 2000,
  599. "valueType": "number",
  600. "min": 100,
  601. "max": 4000,
  602. "step": 50
  603. },
  604. {
  605. "key": "isResponseAnswerText",
  606. "renderTypeList": [
  607. "hidden"
  608. ],
  609. "label": "",
  610. "value": true,
  611. "valueType": "boolean"
  612. },
  613. {
  614. "key": "quoteTemplate",
  615. "renderTypeList": [
  616. "hidden"
  617. ],
  618. "label": "",
  619. "valueType": "string"
  620. },
  621. {
  622. "key": "quotePrompt",
  623. "renderTypeList": [
  624. "hidden"
  625. ],
  626. "label": "",
  627. "valueType": "string"
  628. },
  629. {
  630. "key": "systemPrompt",
  631. "renderTypeList": [
  632. "textarea",
  633. "reference"
  634. ],
  635. "max": 3000,
  636. "valueType": "string",
  637. "label": "core.ai.Prompt",
  638. "description": "core.app.tip.chatNodeSystemPromptTip",
  639. "placeholder": "core.app.tip.chatNodeSystemPromptTip"
  640. },
  641. {
  642. "key": "history",
  643. "renderTypeList": [
  644. "numberInput",
  645. "reference"
  646. ],
  647. "valueType": "chatHistory",
  648. "label": "core.module.input.label.chat history",
  649. "required": true,
  650. "min": 0,
  651. "max": 30,
  652. "value": 6
  653. },
  654. {
  655. "key": "userChatInput",
  656. "renderTypeList": [
  657. "reference",
  658. "textarea"
  659. ],
  660. "valueType": "string",
  661. "label": "用户问题",
  662. "required": true,
  663. "toolDescription": "用户问题",
  664. "value": [
  665. "FYLw1BokYUad",
  666. "text"
  667. ]
  668. },
  669. {
  670. "key": "quoteQA",
  671. "renderTypeList": [
  672. "settingDatasetQuotePrompt"
  673. ],
  674. "label": "",
  675. "debugLabel": "知识库引用",
  676. "description": "",
  677. "valueType": "datasetQuote"
  678. }
  679. ],
  680. "outputs": [
  681. {
  682. "id": "history",
  683. "key": "history",
  684. "label": "core.module.output.label.New context",
  685. "description": "core.module.output.description.New context",
  686. "valueType": "chatHistory",
  687. "type": "static"
  688. },
  689. {
  690. "id": "answerText",
  691. "key": "answerText",
  692. "label": "core.module.output.label.Ai response content",
  693. "description": "core.module.output.description.Ai response content",
  694. "valueType": "string",
  695. "type": "static"
  696. }
  697. ]
  698. },
  699. {
  700. "nodeId": "lG52GzzMm65z",
  701. "name": "文本内容提取",
  702. "intro": "可从文本中提取指定的数据,例如:sql语句、搜索关键词、代码等",
  703. "avatar": "/imgs/workflow/extract.png",
  704. "flowNodeType": "contentExtract",
  705. "showStatus": true,
  706. "position": {
  707. "x": 535.331344778598,
  708. "y": -437.1382636373696
  709. },
  710. "inputs": [
  711. {
  712. "key": "model",
  713. "renderTypeList": [
  714. "selectLLMModel",
  715. "reference"
  716. ],
  717. "label": "core.module.input.label.aiModel",
  718. "required": true,
  719. "valueType": "string",
  720. "llmModelType": "extractFields",
  721. "value": "gpt-3.5-turbo"
  722. },
  723. {
  724. "key": "description",
  725. "renderTypeList": [
  726. "textarea",
  727. "reference"
  728. ],
  729. "valueType": "string",
  730. "label": "提取要求描述",
  731. "description": "给AI一些对应的背景知识或要求描述,引导AI更好的完成任务。\n该输入框可使用全局变量。",
  732. "placeholder": "例如: \n1. 当前时间为: {{cTime}}。你是一个实验室预约助手,你的任务是帮助用户预约实验室,从文本中获取对应的预约信息。\n2. 你是谷歌搜索助手,需要从文本中提取出合适的搜索词。",
  733. "value": "你是谷歌搜索机器人,根据当前问题和对话记录生成搜索词。你需要自行判断是否需要进行网络实时查询:\n- 如果需查询则生成搜索词。\n- 如果不需要查询则不返回字段。"
  734. },
  735. {
  736. "key": "history",
  737. "renderTypeList": [
  738. "numberInput",
  739. "reference"
  740. ],
  741. "valueType": "chatHistory",
  742. "label": "core.module.input.label.chat history",
  743. "required": true,
  744. "min": 0,
  745. "max": 30,
  746. "value": 6
  747. },
  748. {
  749. "key": "content",
  750. "renderTypeList": [
  751. "reference",
  752. "textarea"
  753. ],
  754. "label": "需要提取的文本",
  755. "required": true,
  756. "valueType": "string",
  757. "toolDescription": "需要检索的内容",
  758. "value": [
  759. "448745",
  760. "userChatInput"
  761. ]
  762. },
  763. {
  764. "key": "extractKeys",
  765. "renderTypeList": [
  766. "custom"
  767. ],
  768. "label": "",
  769. "valueType": "any",
  770. "description": "由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段",
  771. "value": [
  772. {
  773. "required": false,
  774. "defaultValue": "",
  775. "desc": "搜索词",
  776. "key": "searchKey",
  777. "enum": ""
  778. }
  779. ]
  780. }
  781. ],
  782. "outputs": [
  783. {
  784. "id": "fields",
  785. "key": "fields",
  786. "label": "完整提取结果",
  787. "description": "一个 JSON 字符串,例如:{\"name:\":\"YY\",\"Time\":\"2023/7/2 18:00\"}",
  788. "valueType": "string",
  789. "type": "static"
  790. },
  791. {
  792. "id": "6yF19MRD3nuB",
  793. "key": "searchKey",
  794. "label": "提取结果-搜索词",
  795. "valueType": "string",
  796. "type": "static"
  797. }
  798. ]
  799. }
  800. ],
  801. "edges": [
  802. {
  803. "source": "TWD5BAqIIFaj",
  804. "target": "Nc6hBdb3l9Pe",
  805. "sourceHandle": "TWD5BAqIIFaj-source-IF",
  806. "targetHandle": "Nc6hBdb3l9Pe-target-left"
  807. },
  808. {
  809. "source": "1ljV0oTq4zeC",
  810. "target": "FYLw1BokYUad",
  811. "sourceHandle": "1ljV0oTq4zeC-source-right",
  812. "targetHandle": "FYLw1BokYUad-target-left"
  813. },
  814. {
  815. "source": "FYLw1BokYUad",
  816. "target": "EX0g9oK3sCOC",
  817. "sourceHandle": "FYLw1BokYUad-source-right",
  818. "targetHandle": "EX0g9oK3sCOC-target-left"
  819. },
  820. {
  821. "source": "448745",
  822. "target": "lG52GzzMm65z",
  823. "sourceHandle": "448745-source-right",
  824. "targetHandle": "lG52GzzMm65z-target-left"
  825. },
  826. {
  827. "source": "lG52GzzMm65z",
  828. "target": "TWD5BAqIIFaj",
  829. "sourceHandle": "lG52GzzMm65z-source-right",
  830. "targetHandle": "TWD5BAqIIFaj-target-left"
  831. },
  832. {
  833. "source": "TWD5BAqIIFaj",
  834. "target": "1ljV0oTq4zeC",
  835. "sourceHandle": "TWD5BAqIIFaj-source-ELSE",
  836. "targetHandle": "1ljV0oTq4zeC-target-left"
  837. }
  838. ]
  839. }

流程说明

  1. 利用【文本内容提取】模块,将用户的问题提取成搜索关键词。
  2. 将搜索关键词传入【HTTP请求】模块,执行谷歌搜索。
  3. 利用【文本加工】模块组合搜索结果和问题,生成一个适合模型回答的问题。
  4. 将新的问题发给【AI对话】模块,回答搜索结果。