diff --git a/zhangbaojun/answerfinishedpng.png b/zhangbaojun/answerfinishedpng.png new file mode 100644 index 000000000..24a47e879 Binary files /dev/null and b/zhangbaojun/answerfinishedpng.png differ diff --git a/zhangbaojun/answerinprogress.png b/zhangbaojun/answerinprogress.png new file mode 100644 index 000000000..e07800650 Binary files /dev/null and b/zhangbaojun/answerinprogress.png differ diff --git a/zhangbaojun/question.png b/zhangbaojun/question.png new file mode 100644 index 000000000..09f5d688b Binary files /dev/null and b/zhangbaojun/question.png differ diff --git a/zhangbaojun/reference.png b/zhangbaojun/reference.png new file mode 100644 index 000000000..8f462936a Binary files /dev/null and b/zhangbaojun/reference.png differ diff --git a/zhangbaojun/zhangbaojun.md b/zhangbaojun/zhangbaojun.md index ba89c53ba..8fdb2f2e4 100644 --- a/zhangbaojun/zhangbaojun.md +++ b/zhangbaojun/zhangbaojun.md @@ -1,9 +1,12 @@ 一、背景说明: - 1.1. 本项目为外文文献检索相关demo, 由chatgpt根据几亿外文文献,每一段生成若干英文问题答案对。然后问题和答案对翻译成中文,组成中文问题答案 - 1.2. 对中文问题和英文问题,生成768维向量,插入ES8索引中,其中向量字段类型为:"dense_vector“,向量相似度算法为:consine, 应用层使用向量做KNN语义检索。 + 1.1. 本项目为外文文献检索相关demo, 由chatgpt根据几亿外文文献,每一段生成若干英文问题答案对。 + 然后问题和答案对翻译成中文,组成中文问题答案 + 1.2. 对中文问题和英文问题,生成768维向量,插入ES8索引中,其中向量字段类型为:"dense_vector“, + 向量相似度算法为:consine, 应用层使用向量做KNN语义检索。 1.3. 用户输入问题后,会即时生成问题向量,在ES8中检索语义相似问题,用中文问话就搜索中文问题,用英文问话就搜索英文问题。 - 1.4. 匹配语义最相似5个问题,查出对应答案,组成问题/答案提示,将用户问的问题本身及找到的问题答案对,发给Llama2大模型,由大模型综合这些来自于真实外文文献的问题答案对,生成综合答案,返回给用户,作为基于文献内容的答案。 + 1.4. 匹配语义最相似5个问题,查出对应答案,组成问题/答案提示,将用户问的问题本身及找到的问题答案对,发给Llama2大模型, + 由大模型综合这些来自于真实外文文献的问题答案对,生成综合答案,返回给用户,作为基于文献内容的答案。 1.5. 这样用户会节省阅读外文文献的时间,跨过语言障碍快速了解文献内容。 二、运行环境: @@ -39,21 +42,26 @@ python3.7 -m uvicorn single-sentence-transformers_multilingual768:app --reload --host 0.0.0.0 --port 8002 --reload 3.2.3 gradio_web_server_api.py - 根据用户问话的向量从ES8检索(Knn检索,consine相似度),检索出文献问题向量最相似(语义相似)的5条,组成prompt,把用户问题和prompt提供给Llama2大模型,生成答案,由于大模型是以单个字的推理形式生成答案,以流式返回客户端,客户端显示为一个字一个字的反馈答案更新。 - 此脚本需要作为常驻内存Api服务,供应用层调用,输入为用户问题和参考答案组成的Prompt,返回具体答案的流式推理(一个字一个字的更新),让大模型根据文献中查询出来的参考答案回答用户问题。相当于帮助用户理解文献,解决实际问题。 + 根据用户问话的向量从ES8检索(Knn检索,consine相似度),检索出文献问题向量最相似(语义相似)的5条, + 组成prompt,把用户问题和prompt提供给Llama2大模型,生成答案,由于大模型是以单个字的推理形式生成答案,以流式返回客户端,客户端显示为一个字一个字的反馈答案更新。 + 此脚本需要作为常驻内存Api服务,供应用层调用,输入为用户问题和参考答案组成的Prompt,返回具体答案的流式推理(一个字一个字的更新), + 让大模型根据文献中查询出来的参考答案回答用户问题。相当于帮助用户理解文献,解决实际问题。 uvicorn gradio_web_server_api:app --reload --host 0.0.0.0 --port 8007 --timeout-keep-alive 120 3.3. scripts\java 下文件说明: 3.3.1. AIKNNSearchController.java AIKNNSearchService.java - spring boot 的MVC架构中的controller层,调用service层方法,首先接受前端传过来的用户问题,然后调用single-sentence-transformers_multilingual768.py里面的api接口,即时生成向量,再调用service中ES方法,进行Knn语义向量检索,取出若干语义最相似问题答案对,连同用户从终端界面问的问题,组成prompt作为基于专业文献内容的参考答案,预备给大模型。 + spring boot 的MVC架构中的controller层,调用service层方法,首先接受前端传过来的用户问题,然后调用single-sentence-transformers_multilingual768.py里面的api接口, + 即时生成向量,再调用service中ES方法,进行Knn语义向量检索,取出若干语义最相似问题答案对,连同用户从终端界面问的问题,组成prompt作为基于专业文献内容的参考答案,预备给大模型。 3.3.2. StreamingPythonController.java - 上述步骤生成的prompt,通过该controller中的逻辑,调用大模型接口(gradio_web_server_api.py),这是Llama2大模型api接口,只有python版本,大模型根据prompt回答最终的用户问题。返回是单个字的连续推理,流式返回到前端,在用户界面上显示为类似chatgpt的逐字显示的形式。 + 上述步骤生成的prompt,通过该controller中的逻辑,调用大模型接口(gradio_web_server_api.py),这是Llama2大模型api接口,只有python版本, + 大模型根据prompt回答最终的用户问题。返回是单个字的连续推理,流式返回到前端,在用户界面上显示为类似chatgpt的逐字显示的形式。 prompt问题模板可以有不同形式,可以严格禁止大模型越过prompt中的参考答案,回答政治敏感问题。也可适度允许大模型结合对prompt内容理解和模型原生的训练语料一同给出一个范围更大的答案。 3.3.3. index.html及js中的文件 - 为用户终端页面的demo,稍加改造,即可用于用户输入问题,调用1中的接口,获取参考答案,组成prompt,再调用StreamingPythonController.java中的接口,用SSE的长连接形式,向大模型发问,大模型流式返答案,由SSE接收,逐字分批显示给用户推理后的答案 + 为用户终端页面的demo,稍加改造,即可用于用户输入问题,调用1中的接口,获取参考答案,组成prompt,再调用StreamingPythonController.java中的接口, + 用SSE的长连接形式,向大模型发问,大模型流式返答案,由SSE接收,逐字分批显示给用户推理后的答案 @@ -95,4 +103,20 @@ } -五、上述代码均为demo,实际应用基础上做了简化,比如index.html中的用户问题是写在代码中作测试中,实际使用应该有个文本框让用户输入,问题取自输框等。明白原理后,丰富一下逻辑,即可用于实际项目中。 +五、上述代码均为demo,实际应用基础上做了简化,比如index.html中的用户问题是写在代码中作测试中,实际使用应该有个文本框让用户输入,问题取自输框等。 + 明白原理后,丰富一下逻辑,即可用于实际项目中。 + +六、效果图片,下面为demo经过产品化开发、测试后,最后生成的正式产品最终效果: +
+ 开始提问题。。。 + ![开始提问题。。。](question.png) +
+ 大模型返回问题答案过程中。。。 + ![回答中。。。](answerinprogress.png) +
+ 回答完成。。。 + ![回答完成。。。](answerfinishedpng.png) +
+ 点击答案下面的参考文献,即可进入该文献详情页面,供深入研究的用户仔细研讨,用户可在此页获取文献doi,pdf全文,作者、机构等堃详细信息。 +
+ ![回答中。。。](reference.png)