diff --git a/examples/fel-example/05-retrieval/README.md b/examples/fel-example/05-retrieval/README.md index 33692310..63e72a4e 100644 --- a/examples/fel-example/05-retrieval/README.md +++ b/examples/fel-example/05-retrieval/README.md @@ -226,8 +226,6 @@ node0-->node1{{=}} ## 验证 -- 在IDEA中运行`DemoApplication` - - 在浏览器栏输入:`http://localhost:8080/ai/example/chat?query=请介绍一下黑神话悟空` ```json diff --git a/examples/fel-example/05-retrieval/src/main/java/modelengine/example/ai/chat/retrieval/RetrievalExampleController.java b/examples/fel-example/05-retrieval/src/main/java/modelengine/example/ai/chat/retrieval/RetrievalExampleController.java index 099c3f81..bbecca60 100644 --- a/examples/fel-example/05-retrieval/src/main/java/modelengine/example/ai/chat/retrieval/RetrievalExampleController.java +++ b/examples/fel-example/05-retrieval/src/main/java/modelengine/example/ai/chat/retrieval/RetrievalExampleController.java @@ -43,9 +43,11 @@ import modelengine.fitframework.annotation.Value; import modelengine.fitframework.log.Logger; import modelengine.fitframework.serialization.ObjectSerializer; -import modelengine.fitframework.util.FileUtils; import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.List; import java.util.stream.Collectors; @@ -93,7 +95,7 @@ public RetrievalExampleController(ChatModel chatModel, EmbedModel embedModel, .load(new JsonFileSource(serializer, StringTemplate.create("{{question}}: {{answer}}"))) .index(vectorStore) .close(); - File file = FileUtils.file(this.getClass().getClassLoader().getResource("data.json")); + File file = getData(); notNull(file, "The data cannot be null."); indexFlow.converse() .doOnError(e -> log.info("Index build error. [error={}]", e.getMessage(), e)) @@ -123,4 +125,36 @@ public ChatMessage chat(@RequestParam("query") String query) { this.memory.add(aiMessage); return aiMessage; } + + private static File getData() { + String jsonData = """ + [ + { + "question": "黑神话悟空简介", + "answer": "《黑神话:悟空》是由杭州游科互动科技有限公司开发,浙江出版集团数字传媒有限公司出版的西游题材单机动作角色扮演游戏。\\n该作以中国四大名著之一、吴承恩所著长篇小说《西游记》为背景设定,借用《西游记》自身的故事作为前传,讲述取经之后孙悟空因放弃佛位引发天庭对其再次征伐之后的故事。在游戏中,玩家将扮演一位“天命人”,为了探寻昔日传说的真相,踏上一条充满危险与惊奇的西游之路。\\n2024年8月20日,该作正式登陆PC、PS5平台。该作通常被媒体称为“中国首款3A游戏”。在发售三天后,该作的全平台销量已超过1000万套,打破中国游戏历史记录。" + }, + { + "question": "黑神话悟空故事情节", + "answer": "《黑神话:悟空》的故事情节发生在《西游记》故事之后。在老猴子的说书故事中,相传据说孙悟空成佛后依旧不愿受到拘束,待唐僧东归后便辞去佛位,欲回到花果山逍遥快活,未料遭到天庭猜忌,二郎神、四大天王、巨灵神率领天兵天将再次杀奔花果山。孙悟空与二郎神激战时,本已消失的紧箍咒再次出现,孙悟空不敌二郎神,就此殒命,肉身残躯化为巨石,魂魄分为六件根器,名为六根,隐藏世间。多年后,玩家扮演的花果山猿猴“天命人”踏上了寻找遗失根器、解救和复活孙悟空的旅程。" + }, + { + "question": "黑神话悟空结局", + "answer": "1. 一般结局:“天命人”未能继承孙悟空的遗产,自愿选择戴上曾束缚孙悟空的紧箍儿,与孙悟空的残躯融合,圆满完成了“天命人”的任务,但孙悟空并未真正复活,“天命人”彻底沦为天庭执行意志的新工具。\\n2. 真正结局:“天命人”在“未来佛”弥勒菩萨的帮助下前往梅山探寻真相,杀死四大天王并打败了二郎神杨戬,通过了杨戬的考验。杨戬的“第三眼”释放出孙悟空的神识,这里面有孙悟空的记忆,杨戬将这些封存的记忆交给“天命人”,“天命人”成功继承孙悟空的意志,并在花果山的顶峰击败孙悟空的残躯,六根齐聚,孙悟空的“意”获得真正的觉醒,在此刻,“天命人”与孙悟空合二为一,孙悟空成功复活,拒绝戴上紧箍儿,从而避免天庭的束缚。" + }, + { + "question": "黑神话悟空玩法", + "answer": "游戏的设计灵感源于中国古典神怪小说《西游记》,玩家将操控一位名为“天命人”的花果山猿猴。主角的主要武器是如意金箍棒,能在战斗中伸缩自如。游戏的战斗系统包括三种主要棍法:劈棍、戳棍和立棍,为战斗提供多样化选择。战斗还涉及资源管理,当计量表充满时,玩家可以积累“专注点”,用于连招或蓄力重击。冲刺、闪避和攻击都会消耗气力值。\\n\\n除了物理战斗,玩家还可以使用“奇术”、“身法”、“毫毛”和“变化”等四类法术。这些法术有冷却时间并消耗法力值。各类法术按技能可再细分,例如:“定身”奇术可以在短时间内冻结敌人;“聚形散气”身法可留下假身以便散气遁走,聚形时再行突袭;“身外身法”的毫毛法术能召唤多个分身协助战斗,而各种变化法术允许主角变形为不同的生物,并拥有独特的招式和生命值。此外,玩家可以通过击败强大的敌人获得“精魄”技能,这些技能类似于一次性的变身,例如,“幽魂”精魄可以进行头锤攻击。\\n\\n游戏的进程大多是线性的,亦有较为宽阔的区域供玩家探索。玩家会遇到各种妖怪头目作为敌人。玩家的检查点是世界各地的神龛(土地庙)。游戏地图无法由玩家调整,但会随游戏进展而变化。" + } + ] + """; + + try { + File tempFile = Files.createTempFile("data", ".json").toFile(); + tempFile.deleteOnExit(); + Files.writeString(tempFile.toPath(), jsonData); + return tempFile; + } catch (IOException e) { + throw new RuntimeException("Failed to create temp data file", e); + } + } } \ No newline at end of file diff --git a/examples/fel-example/05-retrieval/src/main/resources/data.json b/examples/fel-example/05-retrieval/src/main/resources/data.json deleted file mode 100644 index 6ab17063..00000000 --- a/examples/fel-example/05-retrieval/src/main/resources/data.json +++ /dev/null @@ -1,18 +0,0 @@ -[ - { - "question": "黑神话悟空简介", - "answer": "《黑神话:悟空》是由杭州游科互动科技有限公司开发,浙江出版集团数字传媒有限公司出版的西游题材单机动作角色扮演游戏。\n该作以中国四大名著之一、吴承恩所著长篇小说《西游记》为背景设定,借用《西游记》自身的故事作为前传,讲述取经之后孙悟空因放弃佛位引发天庭对其再次征伐之后的故事。在游戏中,玩家将扮演一位“天命人”,为了探寻昔日传说的真相,踏上一条充满危险与惊奇的西游之路。\n2024年8月20日,该作正式登陆PC、PS5平台。该作通常被媒体称为“中国首款3A游戏”。在发售三天后,该作的全平台销量已超过1000万套,打破中国游戏历史记录。" - }, - { - "question": "黑神话悟空故事情节", - "answer": "《黑神话:悟空》的故事情节发生在《西游记》故事之后。在老猴子的说书故事中,相传据说孙悟空成佛后依旧不愿受到拘束,待唐僧东归后便辞去佛位,欲回到花果山逍遥快活,未料遭到天庭猜忌,二郎神、四大天王、巨灵神率领天兵天将再次杀奔花果山。孙悟空与二郎神激战时,本已消失的紧箍咒再次出现,孙悟空不敌二郎神,就此殒命,肉身残躯化为巨石,魂魄分为六件根器,名为六根,隐藏世间。多年后,玩家扮演的花果山猿猴“天命人”踏上了寻找遗失根器、解救和复活孙悟空的旅程。" - }, - { - "question": "黑神话悟空结局", - "answer": "1. 一般结局:“天命人”未能继承孙悟空的遗产,自愿选择戴上曾束缚孙悟空的紧箍儿,与孙悟空的残躯融合,圆满完成了“天命人”的任务,但孙悟空并未真正复活,“天命人”彻底沦为天庭执行意志的新工具。\n2. 真正结局:“天命人”在“未来佛”弥勒菩萨的帮助下前往梅山探寻真相,杀死四大天王并打败了二郎神杨戬,通过了杨戬的考验。杨戬的“第三眼”释放出孙悟空的神识,这里面有孙悟空的记忆,杨戬将这些封存的记忆交给“天命人”,“天命人”成功继承孙悟空的意志,并在花果山的顶峰击败孙悟空的残躯,六根齐聚,孙悟空的“意”获得真正的觉醒,在此刻,“天命人”与孙悟空合二为一,孙悟空成功复活,拒绝戴上紧箍儿,从而避免天庭的束缚。" - }, - { - "question": "黑神话悟空玩法", - "answer": "游戏的设计灵感源于中国古典神怪小说《西游记》,玩家将操控一位名为“天命人”的花果山猿猴。主角的主要武器是如意金箍棒,能在战斗中伸缩自如。游戏的战斗系统包括三种主要棍法:劈棍、戳棍和立棍,为战斗提供多样化选择。战斗还涉及资源管理,当计量表充满时,玩家可以积累“专注点”,用于连招或蓄力重击。冲刺、闪避和攻击都会消耗气力值。\n\n除了物理战斗,玩家还可以使用“奇术”、“身法”、“毫毛”和“变化”等四类法术。这些法术有冷却时间并消耗法力值。各类法术按技能可再细分,例如:“定身”奇术可以在短时间内冻结敌人;“聚形散气”身法可留下假身以便散气遁走,聚形时再行突袭;“身外身法”的毫毛法术能召唤多个分身协助战斗,而各种变化法术允许主角变形为不同的生物,并拥有独特的招式和生命值。此外,玩家可以通过击败强大的敌人获得“精魄”技能,这些技能类似于一次性的变身,例如,“幽魂”精魄可以进行头锤攻击。\n\n游戏的进程大多是线性的,亦有较为宽阔的区域供玩家探索。玩家会遇到各种妖怪头目作为敌人。玩家的检查点是世界各地的神龛(土地庙)。游戏地图无法由玩家调整,但会随游戏进展而变化。" - } -] \ No newline at end of file diff --git a/examples/fel-example/pom.xml b/examples/fel-example/pom.xml index 27c8c729..3216be95 100644 --- a/examples/fel-example/pom.xml +++ b/examples/fel-example/pom.xml @@ -9,11 +9,11 @@ pom - 8 - 8 + 17 + 17 UTF-8 UTF-8 - 1.8 + 17 3.6.2-SNAPSHOT