mirror of
https://git.mirrors.martin98.com/https://github.com/infiniflow/ragflow.git
synced 2025-08-12 16:59:02 +08:00
### 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:
parent
1d3e4844a5
commit
acd78c5ef2
@ -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": []
|
||||
}
|
||||
}
|
||||
|
@ -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}
|
||||
|
@ -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) {
|
||||
|
@ -54,3 +54,8 @@
|
||||
.selectedFlowTemplateCard {
|
||||
background-color: @selectedBackgroundColor;
|
||||
}
|
||||
|
||||
.templatesBox {
|
||||
max-height: 500px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
160
web/src/pages/flow/retrieval_relevant_rewrite_and_generate.json
Normal file
160
web/src/pages/flow/retrieval_relevant_rewrite_and_generate.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
@ -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);
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user