4-18:过滤QA对,update prompt
任务:找一个(些)指标过滤不合理的QA对,建立合法QA对模板,随机取样作为prompt,请求大模型接口,重跑2020-2023以及2001-2007的word文档。
分析任务
原本我只pull了python的code,但是查看python_scripts里面的readme提到了要先把java-workstation跑起来
git clone -b java_scripts https://github.com/Liyanhao1209/ZhouYiLLM.git
然后参考实训同学的两篇文档:
第一篇详解了python_scripts分支生成指令,第二篇是生成问答对。
问题主要在于self_qa生成的qa对质量参差不齐:
- 问回答过于简练。例如一个卦的某一个爻,至少需要给出这一个爻的爻辞、爻辞解释、爻辞义理、爻辞给人的启示意义。
- 给出一个哲学问题,或者一个中国古代哲学的概念问题,至少给出几段话,而不是简单一句话的回答。
分析可得,接下来就是在生成self-QA时,优化prompt,使最后得到的答案更具体:
配置
首先,安装依赖库:
pip install zhipuai
pip install rouge-chinese
pip install python-docx
pip install pdfplumber
配置java时出现的报错如下:
Try-with-resources are not supported at language level ‘5‘ 报错
原因:maven没有指定jdk版本。
解决方案:在pom.xml中添加下面的code即可。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
用vscode打开clone的python_scripts的代码一直报错,换成pycharm打开就ok了。
生成合适的prompt
考虑两个思路:
-
从已经self-QA生成的问答对中,设置一定的指标,从中选择出满足条件的QA作为prompt。
指标可从以下方面考虑:
- 回答长度。
- 回答角度:一个卦的某一个爻,至少需要给出这一个爻的爻辞、爻辞解释、爻辞义理、爻辞给人的启示意义。
-
根据已有的问题,编写prompt,试用智谱清言glm4,得到可以生成满足条件QA的prompt,再重新跑文档生成qa对。
最终将方案1得到的qa对和方案2生成的qa对比较相似度,将方案1得到的相似度低的qa对插入到方案2得到的qa对中。
方案1:
将之前得到的self_qa.json以10个item为单位分割询问一次,判断其是否符合要求,设置prompt如下:
你是一名研究周易的专家。现在有10个关于的周易问答,内容为:[""]
请从回答的长度和回答的角度从其中满足条件的QA对,都不满足请回答不满足即可。
条件如下:
1.回答至少包含三个角度。
2.回答长度大于60个字符。
3.回答对问题有详细的解释。
请按照以下格式生成问题与回答:问题1:......回答1:......问题2:......回答2:......
编写code,将最终得到的回答保存到json里。
这个先前的代码已经完成了,直接用就可以了。
ok,调用脚本:
查看输出的json,发现了问题:
- 不满足条件的qa会在回答里显示不满足,且这样的qa对不在少数:
- 问题和回答的最开始会出现多余的中文字符":"或者数字
如下所示:
{
"instruction": ":“环中说”背后的太极观念是什么?",
"answer": ":不满足条件,因为回答只包含了一个角度且长度未达到60个字符。"
},
{
"instruction": ":咸卦卦象下艮上兑分别代表什么?",
"answer": "2:咸卦卦象下艮代表少男,上兑代表少女。这体现了古代男尊女卑的观念,但咸卦中的少男艮居于下,少女兑居于上,象征着少男少女上下交感,呈现出一种特殊的互动关系。"
}
再写个脚本处理上述问题,最后得到处理后的文件self_qa_correct.json。
方案2
设置prompt如下:
你是一名研究周易的专家。现在有一篇关于周易的文章,请根据上述文章的内容生成5个关于周易的尽可能专业且多样化的问题对(即一个问题及其对应的回答)。这些问答对中的问题可以是关于事实的问题,也可以是对相关内容的理解和评价。在提问时,请不要使用“这个”、“那个”等指示代词。回答考虑下面两点:
1.从多角度回答,比如问题是关于一个卦的某一个爻,至少需要给出这一个爻的爻辞、爻辞解释、爻辞义理、爻辞给人的启示意义。
2.给出一段话,不要给出一句简短的回答。
请按照以下格式生成问题与回答:问题1:......回答1:......问题2:......回答2:......。
试用智谱清言,结果较为满意:
但是一般来说,直接用UI得到的结果都比调用接口会好点。下面用接口先尝试一期的文件:
这里只用将原来的instruction_generation.py中的prompt和输出地址改变即可:
先生成workstation.txt,需要写入root和target两个参数,配置方法如下:
- 首先选择编辑配置
- 然后在Program arguments填入参数,第一个为路径,第二个为格式。
接下来跑一期试试:
用上面的prompt跑了一期的周易研究,得到的QA对大致如下:
{
"instruction": "朱子在《易学启蒙》中是如何解释“心为太极”的?",
"answer": "朱子在《易学启蒙》中引用了邵雍的“心为太极”说,并用易图的中心方位来解释“太极虚中之象”,从而解释了“心为太极”。他将以“心”为易图中心方位来解释“太极虚中之象”的“环中说”。"
},
{
"instruction": "朱子后学中“心为太极”的“禀赋说”是如何形成的?",
"answer": "朱子后学中的“禀赋说”是由朱子的弟子提出的,认为“心为太极”是指人心先天禀赋了太极之理,从而形成了对“心为太极”的“禀赋说”。"
},
{
"instruction": "现代学者对“心为太极”的“境界说”是如何理解的?",
"answer": "现代学者认为“心为太极”指的是心达到了与太极合一的境界,心与理一体,从而形成了对“心为太极”的“境界说”。"
},
{
"instruction": "朱子的“环中说”和“禀赋说”之间是什么关系?",
"answer": "朱子的“环中说”和“禀赋说”并不矛盾,而是相辅相成的关系。前者体现了太极的活动性原则,后者则体现了太极的实体性原则,二者的统一就是“境界说”。"
},
{
"instruction": "朱子对“心为太极”的理解与邵雍的本义是否一致?",
"answer": "朱子对“心为太极”的理解与邵雍的本义存在差异。朱子引用“心为太极”来解释太极的性质,而邵雍则可能更多从数学和逻辑的角度来理解“心为太极”。"
},
{
"instruction": "在程颐的哲学中,“诚”具有哪些含义?",
"answer": "在程颐的哲学中,“诚”具有两个层面的含义。首先,作为天道之“诚”,它代表着真实无妄,即天地运行的过程是真实无妄的,不存在欺骗。其次,作为人道之“诚”,它代表着真诚不欺,要求人们真诚对待他人,不欺骗天地鬼神,也不欺骗自己和他人。这两层含义共同构成了程颐对“诚”的全面解读。"
},
应该是可以的,接下来就用这个思路直接跑就ok