feat: build nodes and edges from chat bot dsl #918 (#1372)

### What problem does this PR solve?
feat: build nodes and edges from chat bot dsl #918


### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu 2024-07-04 15:15:14 +08:00 committed by GitHub
parent 1d3e4844a5
commit acd78c5ef2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 272 additions and 75 deletions

View File

@ -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": []
}
}

View File

@ -80,7 +80,7 @@ const CreateFlowModal = ({
</Form.Item>
</Form>
<Title level={5}>Create from templates</Title>
<Flex vertical gap={16}>
<Flex vertical gap={16} className={styles.templatesBox}>
{list?.map((x) => (
<Card
key={x.id}

View File

@ -14,6 +14,9 @@ import { useNavigate } from 'umi';
// import interpreterBase from '../../../../../graph/test/dsl_examples/interpreter.json';
// import interpreter from '../interpreter.json';
// import retrievalRelevantRewriteAndGenerateBase from '../../../../../graph/test/dsl_examples/retrieval_relevant_rewrite_and_generate.json';
// import retrievalRelevantRewriteAndGenerate from '../retrieval_relevant_rewrite_and_generate.json';
export const useFetchDataOnMount = () => {
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) {

View File

@ -54,3 +54,8 @@
.selectedFlowTemplateCard {
background-color: @selectedBackgroundColor;
}
.templatesBox {
max-height: 500px;
overflow: auto;
}

View File

@ -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<FieldType>['onFinishFailed'] = (errorInfo) => {
};
const RetrievalForm = ({ onValuesChange, form }: IOperatorForm) => {
const { t } = useTranslate('flow');
return (
<Form
name="basic"
@ -37,6 +39,13 @@ const RetrievalForm = ({ onValuesChange, form }: IOperatorForm) => {
<TopNItem></TopNItem>
<Rerank></Rerank>
<KnowledgeBaseItem></KnowledgeBaseItem>
<Form.Item
name={'empty_response'}
label={t('emptyResponse', { keyPrefix: 'chat' })}
tooltip={t('emptyResponseTip', { keyPrefix: 'chat' })}
>
<Input.TextArea placeholder="" rows={4} />
</Form.Item>
</Form>
);
};

View File

@ -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"
}
]
}

View File

@ -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);
});