rag.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import request from '../utils/request'
  2. const RAG_TIMEOUT = 90000
  3. const unwrap = (promise) => promise.then(response => response.data)
  4. export function retrieveDocumentEvidence(query, topK = 5, mode = 'hybrid') {
  5. return unwrap(request.post('/rag/document/retrieve', { query, topK, filters: { mode } }, { timeout: RAG_TIMEOUT }))
  6. }
  7. export function retrieveStructuredEvidence(query, sourceIds = ['1'], topK = 5) {
  8. return unwrap(request.post('/rag/structured/retrieve', {
  9. query, sourceIds, topK, filters: { allowTextToSql: true }
  10. }, { timeout: RAG_TIMEOUT }))
  11. }
  12. export function retrieveGraphEvidence(query, sourceIds = ['1'], topK = 5) {
  13. return unwrap(request.post('/rag/graph/retrieve', {
  14. query, sourceIds, topK, filters: { allowTextToCypher: true }
  15. }, { timeout: RAG_TIMEOUT }))
  16. }
  17. export function retrieveKnowledgeBaseEvidence(params) {
  18. return unwrap(request.post('/rag/kb/retrieve', params, { timeout: RAG_TIMEOUT }))
  19. }
  20. export function getRagCapability(sourceType, sourceId) {
  21. return unwrap(request.get(`/rag/capabilities/${sourceType}/${sourceId}`))
  22. }
  23. export function refreshRagCapability(sourceType, sourceId) {
  24. return unwrap(request.post(`/rag/capabilities/${sourceType}/${sourceId}/refresh`))
  25. }
  26. export function suggestRagGovernance(sourceType, sourceId, description = '') {
  27. return unwrap(request.post(`/rag/capabilities/${sourceType}/${sourceId}/suggest`, { description }, { timeout: RAG_TIMEOUT }))
  28. }
  29. export function listRagQueryExamples(sourceType, sourceId) {
  30. return unwrap(request.get(`/rag/capabilities/${sourceType}/${sourceId}/examples`))
  31. }
  32. export function addRagQueryExampleCandidates(sourceType, sourceId, candidates) {
  33. return unwrap(request.post(`/rag/capabilities/${sourceType}/${sourceId}/examples/candidates`, candidates))
  34. }
  35. export function verifyRagQueryExample(id, verified) {
  36. return unwrap(request.put(`/rag/capabilities/examples/${id}/verified`, null, { params: { value: verified } }))
  37. }
  38. export function deleteRagQueryExample(id) {
  39. return unwrap(request.delete(`/rag/capabilities/examples/${id}`))
  40. }
  41. export function getKnowledgeBaseBindings(knowledgeBaseId) {
  42. return unwrap(request.get(`/rag/kb/${knowledgeBaseId}/bindings`))
  43. }
  44. export function listKnowledgeBases() {
  45. return unwrap(request.get('/rag/kb'))
  46. }
  47. export function updateKnowledgeBaseBindingConfig(knowledgeBaseId, bindingId, config) {
  48. return unwrap(request.put(`/rag/kb/${knowledgeBaseId}/bindings/${bindingId}/config`, config))
  49. }
  50. export function upsertKnowledgeBaseBindingBySource(knowledgeBaseId, sourceType, sourceId, config) {
  51. return unwrap(request.put(`/rag/kb/${knowledgeBaseId}/bindings/by-source`, { sourceType, sourceId, config }))
  52. }
  53. export function generateRagAnswer(question, evidences) {
  54. return unwrap(request.post('/rag/answer', { question, evidences }, { timeout: RAG_TIMEOUT }))
  55. }
  56. export async function sendRagQuestion(params) {
  57. const { query, topK = 5, strategy = 'hybrid', enabled, onStep } = params
  58. const results = { document: null, structured: null, graph: null, kb: null }
  59. const tasks = []
  60. const usesKnowledgeBase = enabled.structured || enabled.graph
  61. if (enabled.document) {
  62. onStep?.('document', 'running')
  63. tasks.push(retrieveDocumentEvidence(query, topK, strategy)
  64. .then(data => { results.document = data; onStep?.('document', 'success', data) })
  65. .catch(error => { onStep?.('document', 'failed', null, error); results.document = { evidences: [], diagnostics: { error: error.message } } }))
  66. }
  67. if (usesKnowledgeBase) {
  68. if (enabled.structured) onStep?.('structured', 'running')
  69. if (enabled.graph) onStep?.('graph', 'running')
  70. onStep?.('kb', 'running')
  71. tasks.push(retrieveKnowledgeBaseEvidence({
  72. knowledgeBaseId: 1,
  73. query,
  74. topK,
  75. filters: {
  76. sourceTypes: [enabled.structured && 'STRUCTURED_DATA', enabled.graph && 'GRAPH'].filter(Boolean),
  77. structured: { allowTextToSql: true },
  78. graph: { allowTextToCypher: true }
  79. }
  80. }).then(data => {
  81. results.kb = data
  82. const diagnosticsFor = prefix => Object.fromEntries(Object.entries(data.diagnostics || {}).filter(([key]) => key.startsWith(`${prefix}:`)))
  83. results.structured = { sourceType: 'STRUCTURED_DATA', evidences: data.evidences?.filter(e => e.sourceType === 'STRUCTURED_DATA') || [], diagnostics: diagnosticsFor('STRUCTURED_DATA') }
  84. results.graph = { sourceType: 'GRAPH', evidences: data.evidences?.filter(e => e.sourceType === 'GRAPH') || [], diagnostics: diagnosticsFor('GRAPH') }
  85. if (enabled.structured) {
  86. const failed = Object.keys(results.structured.diagnostics).length > 0
  87. onStep?.('structured', failed ? 'failed' : 'success', results.structured, failed ? new Error(JSON.stringify(results.structured.diagnostics)) : null)
  88. }
  89. if (enabled.graph) {
  90. const failed = Object.keys(results.graph.diagnostics).length > 0
  91. onStep?.('graph', failed ? 'failed' : 'success', results.graph, failed ? new Error(JSON.stringify(results.graph.diagnostics)) : null)
  92. }
  93. onStep?.('kb', 'success', data)
  94. }).catch(error => {
  95. if (enabled.structured) onStep?.('structured', 'failed', null, error)
  96. if (enabled.graph) onStep?.('graph', 'failed', null, error)
  97. onStep?.('kb', 'failed', null, error)
  98. results.kb = { evidences: [], diagnostics: { error: error.message } }
  99. }))
  100. }
  101. await Promise.all(tasks)
  102. const evidences = [results.document, results.structured, results.graph]
  103. .flatMap(result => result?.evidences || [])
  104. return { ...results, evidences }
  105. }