diff --git a/graph/test/dsl_examples/retrieval_relevant_rewrite_and_generate.json b/graph/test/dsl_examples/retrieval_relevant_rewrite_and_generate.json index 1d2b7ab8d..d2d1ad94a 100644 --- a/graph/test/dsl_examples/retrieval_relevant_rewrite_and_generate.json +++ b/graph/test/dsl_examples/retrieval_relevant_rewrite_and_generate.json @@ -1,79 +1,79 @@ { "components": { - "begin": { - "obj":{ - "component_name": "Begin", - "params": { - "prologue": "Hi there!" - } - }, - "downstream": ["answer:0"], - "upstream": [] - }, - "answer:0": { - "obj": { - "component_name": "Answer", - "params": {} - }, - "downstream": ["retrieval:0"], - "upstream": ["begin", "generate:0", "switch:0"] - }, - "retrieval:0": { - "obj": { - "component_name": "Retrieval", - "params": { - "similarity_threshold": 0.2, - "keywords_similarity_weight": 0.3, - "top_n": 6, - "top_k": 1024, - "rerank_id": "BAAI/bge-reranker-v2-m3", - "kb_ids": ["869a236818b811ef91dffa163e197198"], - "empty_response": "Sorry, knowledge base has noting related information." - } - }, - "downstream": ["relevant:0"], - "upstream": ["answer:0"] - }, - "relevant:0": { - "obj": { - "component_name": "Relevant", - "params": { - "llm_id": "deepseek-chat", - "temperature": 0.02, - "yes": "generate:0", - "no": "rewrite:0" - } - }, - "downstream": ["generate:0", "rewrite:0"], - "upstream": ["retrieval:0"] - }, - "generate:0": { - "obj": { - "component_name": "Generate", - "params": { - "llm_id": "deepseek-chat", - "prompt": "You are an intelligent assistant. Please answer the question based on content of knowledge base. When all knowledge base content is irrelevant to the question, your answer must include the sentence \"The answer you are looking for is not found in the knowledge base!\". Answers need to consider chat history.\n Knowledge base content is as following:\n {input}\n The above is the content of knowledge base.", - "temperature": 0.02 - } - }, - "downstream": ["answer:0"], - "upstream": ["relevant:0"] - }, - "rewrite:0": { - "obj":{ - "component_name": "RewriteQuestion", - "params": { - "llm_id": "deepseek-chat", - "temperature": 0.8 - } - }, - "downstream": ["retrieval:0"], - "upstream": ["relevant:0"] - } + "begin": { + "obj": { + "component_name": "Begin", + "params": { + "prologue": "Hi there!" + } + }, + "downstream": ["answer:0"], + "upstream": [] + }, + "answer:0": { + "obj": { + "component_name": "Answer", + "params": {} + }, + "downstream": ["retrieval:0"], + "upstream": ["begin", "generate:0"] + }, + "retrieval:0": { + "obj": { + "component_name": "Retrieval", + "params": { + "similarity_threshold": 0.2, + "keywords_similarity_weight": 0.3, + "top_n": 6, + "top_k": 1024, + "rerank_id": "BAAI/bge-reranker-v2-m3", + "kb_ids": ["869a236818b811ef91dffa163e197198"], + "empty_response": "Sorry, knowledge base has noting related information." + } + }, + "downstream": ["relevant:0"], + "upstream": ["answer:0", "rewrite:0"] + }, + "relevant:0": { + "obj": { + "component_name": "Relevant", + "params": { + "llm_id": "deepseek-chat", + "temperature": 0.02, + "yes": "generate:0", + "no": "rewrite:0" + } + }, + "downstream": ["generate:0", "rewrite:0"], + "upstream": ["retrieval:0"] + }, + "generate:0": { + "obj": { + "component_name": "Generate", + "params": { + "llm_id": "deepseek-chat", + "prompt": "You are an intelligent assistant. Please answer the question based on content of knowledge base. When all knowledge base content is irrelevant to the question, your answer must include the sentence \"The answer you are looking for is not found in the knowledge base!\". Answers need to consider chat history.\n Knowledge base content is as following:\n {input}\n The above is the content of knowledge base.", + "temperature": 0.02 + } + }, + "downstream": ["answer:0"], + "upstream": ["relevant:0"] + }, + "rewrite:0": { + "obj": { + "component_name": "RewriteQuestion", + "params": { + "llm_id": "deepseek-chat", + "temperature": 0.8 + } + }, + "downstream": ["retrieval:0"], + "upstream": ["relevant:0"] + } }, "history": [], "messages": [], "path": [], - "reference": {}, + "reference": [], "answer": [] -} \ No newline at end of file +} diff --git a/web/src/pages/flow/list/create-flow-modal.tsx b/web/src/pages/flow/list/create-flow-modal.tsx index 8a11e5687..aeec7fefd 100644 --- a/web/src/pages/flow/list/create-flow-modal.tsx +++ b/web/src/pages/flow/list/create-flow-modal.tsx @@ -80,7 +80,7 @@ const CreateFlowModal = ({ Create from templates - + {list?.map((x) => ( { const { data, loading } = useFetchFlowList(); @@ -43,7 +46,10 @@ export const useSaveFlow = () => { title, dsl, // dsl: dslJson, - // dsl: { ...interpreterBase, graph: interpreter }, + // dsl: { + // ...retrievalRelevantRewriteAndGenerateBase, + // graph: retrievalRelevantRewriteAndGenerate, + // }, }); if (ret?.retcode === 0) { diff --git a/web/src/pages/flow/list/index.less b/web/src/pages/flow/list/index.less index 7b4555488..00f7e26ac 100644 --- a/web/src/pages/flow/list/index.less +++ b/web/src/pages/flow/list/index.less @@ -54,3 +54,8 @@ .selectedFlowTemplateCard { background-color: @selectedBackgroundColor; } + +.templatesBox { + max-height: 500px; + overflow: auto; +} diff --git a/web/src/pages/flow/retrieval-form/index.tsx b/web/src/pages/flow/retrieval-form/index.tsx index ed3dff8f3..5f2f0a772 100644 --- a/web/src/pages/flow/retrieval-form/index.tsx +++ b/web/src/pages/flow/retrieval-form/index.tsx @@ -2,8 +2,9 @@ import KnowledgeBaseItem from '@/components/knowledge-base-item'; import Rerank from '@/components/rerank'; import SimilaritySlider from '@/components/similarity-slider'; import TopNItem from '@/components/top-n-item'; +import { useTranslate } from '@/hooks/commonHooks'; import type { FormProps } from 'antd'; -import { Form } from 'antd'; +import { Form, Input } from 'antd'; import { IOperatorForm } from '../interface'; type FieldType = { @@ -19,6 +20,7 @@ const onFinishFailed: FormProps['onFinishFailed'] = (errorInfo) => { }; const RetrievalForm = ({ onValuesChange, form }: IOperatorForm) => { + const { t } = useTranslate('flow'); return (
{ + + +
); }; diff --git a/web/src/pages/flow/retrieval_relevant_rewrite_and_generate.json b/web/src/pages/flow/retrieval_relevant_rewrite_and_generate.json new file mode 100644 index 000000000..5c14b16a1 --- /dev/null +++ b/web/src/pages/flow/retrieval_relevant_rewrite_and_generate.json @@ -0,0 +1,160 @@ +{ + "edges": [ + { + "id": "81de838d-a541-4b3f-9d68-9172ffd7c6b4", + "label": "", + "source": "begin", + "target": "answer:0" + }, + { + "id": "8fa8daaa-58e7-4494-84c9-d53f379d2550", + "label": "", + "source": "generate:0", + "target": "answer:0" + }, + { + "id": "6720a5b8-96bc-4535-8800-ad3f35431a16", + "label": "", + "source": "answer:0", + "target": "retrieval:0" + }, + { + "id": "81476d89-707f-4d87-8aa3-fecb9d8499b3", + "label": "", + "source": "rewrite:0", + "target": "retrieval:0" + }, + { + "id": "2bba4a81-44e7-4796-b25f-e68c3fc7e54a", + "label": "", + "source": "retrieval:0", + "target": "relevant:0" + }, + { + "id": "eb205b7a-a87e-4bcc-94c5-bddff13f8ddd", + "label": "", + "source": "relevant:0", + "target": "generate:0" + }, + { + "id": "b8611b17-a01a-485c-ad40-377329eb8d96", + "label": "", + "source": "relevant:0", + "target": "rewrite:0" + } + ], + "nodes": [ + { + "id": "begin", + "type": "beginNode", + "position": { + "x": 0, + "y": 0 + }, + "data": { + "label": "Begin", + "name": "FiftyDeerDeny", + "form": { + "prologue": "Hi there!" + } + }, + "sourcePosition": "left", + "targetPosition": "right" + }, + { + "id": "answer:0", + "type": "ragNode", + "position": { + "x": 0, + "y": 0 + }, + "data": { + "label": "Answer", + "name": "NinePointsSmoke", + "form": {} + }, + "sourcePosition": "left", + "targetPosition": "right" + }, + { + "id": "retrieval:0", + "type": "ragNode", + "position": { + "x": 0, + "y": 0 + }, + "data": { + "label": "Retrieval", + "name": "ProudLiesPull", + "form": { + "similarity_threshold": 0.2, + "keywords_similarity_weight": 0.3, + "top_n": 6, + "top_k": 1024, + "rerank_id": "BAAI/bge-reranker-v2-m3", + "kb_ids": ["869a236818b811ef91dffa163e197198"], + "empty_response": "Sorry, knowledge base has noting related information." + } + }, + "sourcePosition": "left", + "targetPosition": "right" + }, + { + "id": "relevant:0", + "type": "relevantNode", + "position": { + "x": 0, + "y": 0 + }, + "data": { + "label": "Relevant", + "name": "StrongBooksPay", + "form": { + "llm_id": "deepseek-chat", + "temperature": 0.02, + "yes": "generate:0", + "no": "rewrite:0" + } + }, + "sourcePosition": "left", + "targetPosition": "right" + }, + { + "id": "generate:0", + "type": "ragNode", + "position": { + "x": 0, + "y": 0 + }, + "data": { + "label": "Generate", + "name": "CyanBooksTell", + "form": { + "llm_id": "deepseek-chat", + "prompt": "You are an intelligent assistant. Please answer the question based on content of knowledge base. When all knowledge base content is irrelevant to the question, your answer must include the sentence \"The answer you are looking for is not found in the knowledge base!\". Answers need to consider chat history.\n Knowledge base content is as following:\n {input}\n The above is the content of knowledge base.", + "temperature": 0.02 + } + }, + "sourcePosition": "left", + "targetPosition": "right" + }, + { + "id": "rewrite:0", + "type": "ragNode", + "position": { + "x": 0, + "y": 0 + }, + "data": { + "label": "RewriteQuestion", + "name": "SourPapersMake", + "form": { + "llm_id": "deepseek-chat", + "temperature": 0.8 + } + }, + "sourcePosition": "left", + "targetPosition": "right" + } + ] +} diff --git a/web/src/pages/flow/utils.test.ts b/web/src/pages/flow/utils.test.ts index 6491f83f2..dbb89ce7e 100644 --- a/web/src/pages/flow/utils.test.ts +++ b/web/src/pages/flow/utils.test.ts @@ -3,6 +3,7 @@ import path from 'path'; import customer_service from '../../../../graph/test/dsl_examples/customer_service.json'; import headhunter_zh from '../../../../graph/test/dsl_examples/headhunter_zh.json'; import interpreter from '../../../../graph/test/dsl_examples/interpreter.json'; +import retrievalRelevantRewriteAndGenerate from '../../../../graph/test/dsl_examples/retrieval_relevant_rewrite_and_generate.json'; import { dsl } from './mock'; import { buildNodesAndEdgesFromDSLComponents } from './utils'; @@ -87,3 +88,19 @@ test('build nodes and edges from interpreter dsl', () => { } expect(nodes.length).toEqual(12); }); + +test('build nodes and edges from chat bot dsl', () => { + const { edges, nodes } = buildNodesAndEdgesFromDSLComponents( + retrievalRelevantRewriteAndGenerate.components, + ); + try { + fs.writeFileSync( + path.join(__dirname, 'retrieval_relevant_rewrite_and_generate.json'), + JSON.stringify({ edges, nodes }, null, 4), + ); + console.log('JSON data is saved.'); + } catch (error) { + console.warn(error); + } + expect(nodes.length).toEqual(12); +});