langchain 《斗破苍穹》智谱 RAG 问题搜索

2024-09-05 20:36

本文主要是介绍langchain 《斗破苍穹》智谱 RAG 问题搜索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

代码

项目介绍

模型对比实验

分块方法对比

检索方法对比

结果

10条问题

15条问题

局限性


代码

https://github.com/5zjk5/prompt-engineering/tree/master

项目介绍

《斗破苍穹》小说 RAG 问答,爬虫爬取整部小说章节,并分别保存到不同的数据源中。 txt,pdf,markdown,word。

对数据进行分块,召回,根据问题生成回答。

对比了智谱 GLM 系列所有模型,以及不同召回块数(字数)的效果。

模型对比实验

spider.py 为爬虫代码

先用前 100 章节测试,再测试全部章节。 设置 10 个问题,控制变量法 测试结果如下: 

对比结果写在了 J 列,总结:

  1. glm_4_flash,glm-4-long 两个模型在效果上比较好,时间可以接受,准确率相对较好。
  2. glm-4-long 选择了这个模型去继续用。在 15w 字这个模型理解还是比较好的。

分块方法对比

  1. 字数分块,512, 1000,在 7-15w 字效果差不多
  2. 字数分块对比字数分块带上元数据的,效果也差不多,可能相差 1 个左右的准确率
  3. 并且别人有验证的带上元数据有好处的,所有后面都带上了

检索方法对比

 

  1. 较好的方法是相似性检索,及 mmr 但这两个对比在这里是一样,所以就用了相似性 similary
  2. 其他是 langchain 中的其他方法
  3. 上面的结论说了再 15w 左右是可以得到答案,且速度还可以,理解也不错,但 15w 还是太多了 ,所以先检索 150 个快,15w 字,在从 15w 在检索 50w ,这样更准确,却耗费 token 更少。

结果

上面的实验都是在选择,所以最终选择组合为:

  1. 字数分块+元数据,分块字数 1000
  2. glm-4-long 模型
  3. 检索相似性 similary,再混合检索(bm25+相似)得到 50w 字左右上下文参考

10条问题

data/test_doc_question.json 在 10 条问题上,使用前 100 章的问题,表现为 80-90%。

在 10 条问题三,使用全部章节,表现为 70-80%。因为内容多了,检索的东西会不一样且受问题影响。

例如:萧炎遇见的神秘老者是谁?

在前 100 章明显是药老,但全文不一定了,神秘老者可能多次出现,如岩浆下的老者等。问得范围太大了。

15条问题

data/doc_question.json 80-86.6% 浮动

局限性

这个属于常见的 RAG 方法,字数分块,然后检索相关内容,然后生成答案。 但通过这个检索检索会有一下局限性:

  1. 具有关联关系的问题是回答不出来的,如问题“萧炎在风雷大会上遇见的迦南学院的熟人是谁?”

检索回来可能是迦南学院有关的人,但不全,不能结合风雷大会去回答。

  1. 例如“萧炎老婆是谁?”这小说并没有明确写出‘萧炎的老婆是xxx’这种话,但读者们都知道他老婆的谁

  2. 上下文理解少,比如“萧炎晋级斗尊前跟谁打架了?”能找到晋级的那一章,但是跟谁打架了,这是需要前面的剧情的理解的,这并不会检索回来,所以跟问题有关的 上下文不太适合这种 RAG。适合检索某个片段然后回答这个片段的问题。

  3. 生成的回答,及检索的内容受问题影响,如上面说的“神秘老者”的问题,问题月具体效果越好。

这篇关于langchain 《斗破苍穹》智谱 RAG 问题搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140003

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;