utils.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { uniq } from 'lodash-es'
  2. import type { MultipleRetrievalConfig } from './types'
  3. import type {
  4. DataSet,
  5. SelectedDatasetsMode,
  6. } from '@/models/datasets'
  7. import {
  8. DEFAULT_WEIGHTED_SCORE,
  9. RerankingModeEnum,
  10. WeightedScoreEnum,
  11. } from '@/models/datasets'
  12. import { RETRIEVE_METHOD } from '@/types/app'
  13. import { DATASET_DEFAULT } from '@/config'
  14. export const checkNodeValid = () => {
  15. return true
  16. }
  17. export const getSelectedDatasetsMode = (datasets: DataSet[]) => {
  18. let allHighQuality = true
  19. let allHighQualityVectorSearch = true
  20. let allHighQualityFullTextSearch = true
  21. let allEconomic = true
  22. let mixtureHighQualityAndEconomic = true
  23. let inconsistentEmbeddingModel = false
  24. if (!datasets.length) {
  25. allHighQuality = false
  26. allHighQualityVectorSearch = false
  27. allHighQualityFullTextSearch = false
  28. allEconomic = false
  29. mixtureHighQualityAndEconomic = false
  30. inconsistentEmbeddingModel = false
  31. }
  32. datasets.forEach((dataset) => {
  33. if (dataset.indexing_technique === 'economy') {
  34. allHighQuality = false
  35. allHighQualityVectorSearch = false
  36. allHighQualityFullTextSearch = false
  37. }
  38. if (dataset.indexing_technique === 'high_quality') {
  39. allEconomic = false
  40. if (dataset.retrieval_model_dict.search_method !== RETRIEVE_METHOD.semantic)
  41. allHighQualityVectorSearch = false
  42. if (dataset.retrieval_model_dict.search_method !== RETRIEVE_METHOD.fullText)
  43. allHighQualityFullTextSearch = false
  44. }
  45. })
  46. if (allHighQuality || allEconomic)
  47. mixtureHighQualityAndEconomic = false
  48. if (allHighQuality)
  49. inconsistentEmbeddingModel = uniq(datasets.map(item => item.embedding_model)).length > 1
  50. return {
  51. allHighQuality,
  52. allHighQualityVectorSearch,
  53. allHighQualityFullTextSearch,
  54. allEconomic,
  55. mixtureHighQualityAndEconomic,
  56. inconsistentEmbeddingModel,
  57. } as SelectedDatasetsMode
  58. }
  59. export const getMultipleRetrievalConfig = (multipleRetrievalConfig: MultipleRetrievalConfig, selectedDatasets: DataSet[]) => {
  60. const {
  61. allHighQuality,
  62. allHighQualityVectorSearch,
  63. allHighQualityFullTextSearch,
  64. allEconomic,
  65. mixtureHighQualityAndEconomic,
  66. inconsistentEmbeddingModel,
  67. } = getSelectedDatasetsMode(selectedDatasets)
  68. const {
  69. top_k = DATASET_DEFAULT.top_k,
  70. score_threshold,
  71. reranking_mode,
  72. reranking_model,
  73. weights,
  74. reranking_enable,
  75. } = multipleRetrievalConfig || { top_k: DATASET_DEFAULT.top_k }
  76. const result = {
  77. top_k,
  78. score_threshold,
  79. reranking_mode,
  80. reranking_model,
  81. weights,
  82. reranking_enable,
  83. }
  84. if (allEconomic || mixtureHighQualityAndEconomic || inconsistentEmbeddingModel)
  85. result.reranking_mode = RerankingModeEnum.RerankingModel
  86. if (allHighQuality && !inconsistentEmbeddingModel && reranking_mode === undefined)
  87. result.reranking_mode = RerankingModeEnum.WeightedScore
  88. if (allHighQuality && !inconsistentEmbeddingModel && (reranking_mode === RerankingModeEnum.WeightedScore || reranking_mode === undefined) && !weights) {
  89. result.weights = {
  90. weight_type: WeightedScoreEnum.Customized,
  91. vector_setting: {
  92. vector_weight: allHighQualityVectorSearch
  93. ? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.semantic
  94. : allHighQualityFullTextSearch
  95. ? DEFAULT_WEIGHTED_SCORE.allHighQualityFullTextSearch.semantic
  96. : DEFAULT_WEIGHTED_SCORE.other.semantic,
  97. embedding_provider_name: selectedDatasets[0].embedding_model_provider,
  98. embedding_model_name: selectedDatasets[0].embedding_model,
  99. },
  100. keyword_setting: {
  101. keyword_weight: allHighQualityVectorSearch
  102. ? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.keyword
  103. : allHighQualityFullTextSearch
  104. ? DEFAULT_WEIGHTED_SCORE.allHighQualityFullTextSearch.keyword
  105. : DEFAULT_WEIGHTED_SCORE.other.keyword,
  106. },
  107. }
  108. }
  109. return result
  110. }