FastGPT 引申:基于 Python 版本实现 Java 版本 RRF

embedded/2025/3/7 2:01:23/

文章目录

    • FastGPT 引申:基于 Python 版本实现 Java 版本 RRF
      • 函数定义
      • 使用示例

FastGPT 引申:基于 Python 版本实现 Java 版本 RRF

函数定义

使用 Java 实现 RRF 相关的两个函数:合并结果、过滤结果

import java.util.*;// 搜索结果类型定义
public class SearchDataResponseItem {private String id;private String q;private String a;private List<Score> score;private double rrfScore;  // 临时存储RRF分数// 其他字段...// getter和setter方法
}// 分数类型定义
public class Score {private String type;private double value;private int index;// getter和setter方法
}// 搜索结果合并工具类
public class DatasetSearchUtils {/*** RRF搜索结果合并* @param searchResults 搜索结果列表,包含k值和结果列表* @return 合并后的结果*/public static List<SearchDataResponseItem> datasetSearchResultConcat(List<SearchResultGroup> searchResults) {// 过滤空结果searchResults = searchResults.stream().filter(item -> !item.getList().isEmpty()).collect(Collectors.toList());// 处理边界情况if (searchResults.isEmpty()) {return new ArrayList<>();}if (searchResults.size() == 1) {return searchResults.get(0).getList();}// 用Map存储合并结果Map<String, SearchDataResponseItem> resultMap = new HashMap<>();// RRF算法实现for (SearchResultGroup group : searchResults) {int k = group.getK();List<SearchDataResponseItem> list = group.getList();for (int i = 0; i < list.size(); i++) {SearchDataResponseItem data = list.get(i);int rank = i + 1;double score = 1.0 / (k + rank);SearchDataResponseItem record = resultMap.get(data.getId());if (record != null) {// 合并分数List<Score> concatScore = new ArrayList<>(record.getScore());for (Score dataScore : data.getScore()) {Optional<Score> sameScore = concatScore.stream().filter(s -> s.getType().equals(dataScore.getType())).findFirst();if (sameScore.isPresent()) {sameScore.get().setValue(Math.max(sameScore.get().getValue(), dataScore.getValue()));} else {concatScore.add(dataScore);}}// 更新记录record.setScore(concatScore);record.setRrfScore(record.getRrfScore() + score);resultMap.put(data.getId(), record);} else {// 新记录data.setRrfScore(score);resultMap.put(data.getId(), data);}}}// 排序List<SearchDataResponseItem> results = new ArrayList<>(resultMap.values());results.sort((a, b) -> Double.compare(b.getRrfScore(), a.getRrfScore()));// 格式化结果for (int i = 0; i < results.size(); i++) {SearchDataResponseItem item = results.get(i);Optional<Score> rrfScore = item.getScore().stream().filter(s -> s.getType().equals("rrf")).findFirst();if (rrfScore.isPresent()) {rrfScore.get().setValue(item.getRrfScore());rrfScore.get().setIndex(i);} else {Score newScore = new Score();newScore.setType("rrf");newScore.setValue(item.getRrfScore());newScore.setIndex(i);item.getScore().add(newScore);}// 清除临时RRF分数item.setRrfScore(0);}return results;}/*** 按最大Token数过滤结果* @param list 搜索结果列表* @param maxTokens 最大token限制* @return 过滤后的结果*/public static List<SearchDataResponseItem> filterSearchResultsByMaxChars(List<SearchDataResponseItem> list, int maxTokens) {List<SearchDataResponseItem> results = new ArrayList<>();int totalTokens = 0;for (SearchDataResponseItem item : list) {// 注意:这里需要实现countPromptTokens方法int tokens = countPromptTokens(item.getQ() + item.getA());totalTokens += tokens;if (totalTokens > maxTokens + 500) {break;}results.add(item);if (totalTokens > maxTokens) {break;}}// 确保至少返回一条结果if (results.isEmpty() && !list.isEmpty()) {results.add(list.get(0));}return results;}/*** 计算文本的token数量* 注意:这是一个示例实现,实际需要根据具体的分词算法来实现*/private static int countPromptTokens(String text) {// 这里需要实现实际的token计算逻辑// 可以使用各种NLP库或自定义的分词算法return text.length(); // 示例实现}
}// 搜索结果分组类
class SearchResultGroup {private int k;private List<SearchDataResponseItem> list;// getter和setter方法
}

使用示例

// 使用示例
List<SearchResultGroup> searchResults = new ArrayList<>();
// ... 添加搜索结果// 合并结果
List<SearchDataResponseItem> mergedResults = DatasetSearchUtils.datasetSearchResultConcat(searchResults);// 过滤结果
List<SearchDataResponseItem> filteredResults = DatasetSearchUtils.filterSearchResultsByMaxChars(mergedResults, 1500);

http://www.ppmy.cn/embedded/170605.html

相关文章

Ubuntu显卡服务器黑屏无响应的维护日志

1. 问题描述 我们在使用Ubuntu服务器时遇到了系统突然无响应的情况&#xff0c;具体表现如下&#xff1a; 服务器主机电源指示灯正常亮起&#xff0c;表明硬件层面电源供应正常&#xff1b;显示器完全黑屏&#xff0c;没有任何图像或文字输出&#xff1b; 2. 日志记录 3月2…

Python Cookbook-3.3 计算日期之间的时段

任务 给定两个日期,需要计算这两个日期之间隔了几周。 解决方案 标准的 datetime 和第三方的 dateutil模块(准确地说是 dateutil 的rrule.count 方法)很易于使用。在导入了正确的模块之后,任务变得非常简单: from dateutil import rrule import datetime def weeks_betwe…

​Unity插件-Mirror使用方法(八)组件介绍(​Network Behaviour)

目录 一、插件介绍 二、主要组件 Network Manager Network Manager HUD Network Identity Network Transform Network Animator 三、Network Behaviour 1、组件介绍 2、核心功能 网络属性同步 远程过程调用(RPC) 网络生命周期回调 权限控制 组件依赖 3、属性…

4G工业路由器在公交充电桩中的应用与优势

随着电动公交车的普及&#xff0c;公交充电桩的稳定运行和高效管理是交通营运部门最关心的问题。4G工业路由器凭借其卓越的数据采集和通讯能力&#xff0c;成为实现充电桩智能化管理的关键。 公交充电桩运维管理需求概述&#xff1a; 1.实时性&#xff1a;实时监控充电状态、剩…

现在创业的风口有哪些?

1. 人工智能与机器学习 生成式AI&#xff1a;如ChatGPT等工具&#xff0c;广泛应用于内容创作、客服等领域。 AI辅助工具&#xff1a;涵盖医疗、金融、法律等行业&#xff0c;提升效率。 自动化&#xff1a;企业通过AI优化流程&#xff0c;减少人力成本。 2. 绿色科技与可持…

类似ComfyUI和Midjourney这样的文生图图生图应用的API与服务架构该怎么设计

开发&#xff5c;界面&#xff5c;引擎&#xff5c;交付&#xff5c;副驾——重写全栈法则&#xff1a;AI 原生的倍速造应用流 来自全栈程序员 nine 的探索与实践&#xff0c;持续迭代中。 欢迎评论私信交流。 1. API 设计模式 1.1 ComfyUI 的 API 架构 ComfyUI 作为开源文…

Flink:大数据处理的“双面侠”

Flink&#xff1a;大数据处理的“双面侠” 嘿&#xff0c;朋友们&#xff01;今天咱们来唠唠Flink这个在大数据圈里挺火的东西。你要是刚接触大数据&#xff0c;可能听到Flink这个名字就像听天书一样&#xff0c;没关系&#xff0c;咱慢慢唠。 一、Flink是啥玩意儿&#xff1…

CDAM 第五章 数据资产交易

数据资产交易是数据要素市场体系的核心环节&#xff0c;也是数字经济发展的关键驱动力。随着我国数据要素资源规模的不断扩大&#xff0c;数据交易市场日益繁荣&#xff0c;数据资产交易的规范化和市场化进程也在加速推进。本章将详细解读数据资产交易的整体流程、交易标的、交…