Langchain-Chatchat
Langchain-Chatchat copied to clipboard
效果如何优化
如图所示,将该项目的README.md和该项目结合后,回答效果并不理想,请问可以从哪些方面进行优化
主要是以下 3 方面可以优化:
- 优化 text_split 算法,使匹配出的结果作为上下文时能够提供更合理的推理/回答依据;
- 优化 embedding 模型,提升语义向量化的效果,使得语义匹配过程中能够匹配出最满足要求的文本段落作为上下文;
- 优化 LLM 模型,使得给定提问相同情况下,得到更理想的推理/回答结果。
主要是以下 3 方面可以优化:
- 优化 text_split 算法,使匹配出的结果作为上下文时能够提供更合理的推理/回答依据;
- 优化 embedding 模型,提升语义向量化的效果,使得语义匹配过程中能够匹配出最满足要求的文本段落作为上下文;
- 优化 LLM 模型,使得给定提问相同情况下,得到更理想的推理/回答结果。
大佬有优化计划吗,本人AI小白,您说的这些都不是太懂~ 大部分人的使用场景应该都是通过私有的文档和代码训练出个人或团队专属的知识库,然而并不是每个团队都有做AI的同学😂,希望这块使用门槛能降一降
一般来说是要你们自己去微调这个GLM6B模型的,比方说你们想做法律相关的就准备法律领域的数据去微调它 GLM团队那边现在是使用P-tuning去做,吃不了太多显存的,对硬件比较友好
@tutuxxx 可以参考 ChatGLM-6B 模型项目本身的 README,其中有关于 Tuning 的部分
langchain方式其实是拓展性最高的,只要在本地知识库加内容就行,实时加知识。 不过这种方式目前看有2个劣势: 匹配返回topk,知识库不全的话,匹配的内容完全不相关。 多轮对话,好像不太自然。
@imClumsyPanda @SilentMoebuta 好的谢谢,正在尝试。数据集这块有点疑问,真的需要手工一条条生成吗,我看到ChatGLM-6B项目下有同样的问题,这块大佬们有没有什么建议:https://github.com/THUDM/ChatGLM-6B/issues/364
langchain方式其实是拓展性最高的,只要在本地知识库加内容就行,实时加知识。 不过这种方式目前看有2个劣势: 匹配返回topk,知识库不全的话,匹配的内容完全不相关。 多轮对话,好像不太自然。
是的,第一个劣势比较要命。自己处理数据集又非常麻烦
数据清洗是免不了的,即使你用 p-tuning或者lora也是一样的问题,只不过问毫不相关的问题时,不会出本地知识库的结果。可以在prompt里加些限制,比如告诉LLM,“如果无法从参考资料中得到答案,请忽略参考资料。”
追求高质量的话,question肯定是自己一条条列的,answer可以取巧一下,用gpt4来生成 当然也有取巧用gpt4来对文档生成不同question的方案,有点像让大模型自问自答,然后这些QA数据用来微调自己的“小”模型
明白了,给各位大佬点赞👍
@tutuxxx 可以参考 ChatGLM-6B 模型项目本身的 README,其中有关于 Tuning 的部分
显存确实不高,但是好慢呀
三个P40,三条数据,微调搞了两个半小时
官方的p-tuning吗?
@tutuxxx 可以参考 ChatGLM-6B 模型项目本身的 README,其中有关于 Tuning 的部分
显存确实不高,但是好慢呀
三个P40,三条数据,微调搞了两个半小时
官方的p-tuning吗?
是的,官方的代码,参数只改了CUDA_VISIBLE_DEVICES,传了0,1,2,3,但实测只占用了三张卡,而且都只占了不到一半显存。然后把那个广告的数据集换成了我自己的三条数据
@tutuxxx 可以参考 ChatGLM-6B 模型项目本身的 README,其中有关于 Tuning 的部分
显存确实不高,但是好慢呀
三个P40,三条数据,微调搞了两个半小时
官方的p-tuning吗?
是的,官方的代码,参数只改了CUDA_VISIBLE_DEVICES,传了0,1,2,3,但实测只占用了三张卡,而且都只占了不到一半显存。然后把那个广告的数据集换成了我自己的三条数据
为啥会有3000个epoch。。正常应该是 3个epoch 3000条数据这种
@tutuxxx 可以参考 ChatGLM-6B 模型项目本身的 README,其中有关于 Tuning 的部分
显存确实不高,但是好慢呀
三个P40,三条数据,微调搞了两个半小时
官方的p-tuning吗?
是的,官方的代码,参数只改了CUDA_VISIBLE_DEVICES,传了0,1,2,3,但实测只占用了三张卡,而且都只占了不到一半显存。然后把那个广告的数据集换成了我自己的三条数据
为啥会有3000个epoch。。正常应该是 3个epoch 3000条数据这种
不清楚,默认跑起来就是这样,是不是 --max_steps 3000 \ 这个参数决定的
一张A100显卡执行train.py 2个半小时就训练完了, 但是设置 CUDA_VISIBLE_DEVICES = 0,1 使用两张A200训练的时候显示要73个小时。。。不明白咋回事
Single RTX 2080Ti only used 3 hours.
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答?
我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答?
我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
就是说如果不涉及到本地知识库的就让gpt-3.5正常交互,如果涉及到的把检索到的信息补充进prompt?那怎么判断是不是涉及到本地知识库呢,检索的步骤是少不了的吧。然后其实用chatglm应该也能做到和gpt3.5类似的效果?
@westlinkin 可以考虑让用户判断是不是基于文档进行对话,如果是已经上传文件之后的对话就基于文档,删除已上传文档之后就直接对话,可以通过调用不同函数对话的方式来区分,我在自己做api的过程中有使用这种方式
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答? 我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
就是说如果不涉及到本地知识库的就让gpt-3.5正常交互,如果涉及到的把检索到的信息补充进prompt?那怎么判断是不是涉及到本地知识库呢,检索的步骤是少不了的吧。然后其实用chatglm应该也能做到和gpt3.5类似的效果?
「判断是不是涉及到本地知识库」就是问题,只能让AI自己判断(目前AI自己判断大约的正确率估计大约在6-7成左右)。我之前尝试过每次问答必须让agent走本地知识库,如果本地知识库中没有相关信息,就回答不知道。但是没有成功。
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答? 我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
就是说如果不涉及到本地知识库的就让gpt-3.5正常交互,如果涉及到的把检索到的信息补充进prompt?那怎么判断是不是涉及到本地知识库呢,检索的步骤是少不了的吧。然后其实用chatglm应该也能做到和gpt3.5类似的效果?
「判断是不是涉及到本地知识库」就是问题,只能让AI自己判断(目前AI自己判断大约的正确率估计大约在6-7成左右)。我之前尝试过每次问答必须让agent走本地知识库,如果本地知识库中没有相关信息,就回答不知道。但是没有成功。
试试在这个命令模板基础上调整。我试过有一定效果,但是感觉还需要(在不fine-tune模型的基础上)继续调整用词来改进:
如果以下文段是空的,停止思考,回复"没有查询到任何知识库内容"。如果以下文段和用户问题有关,直接完整输出以下文段作为答案,停止思考。如果无法从以下文段中得到答案,停止思考,直接回复”不知道”。
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答? 我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
就是说如果不涉及到本地知识库的就让gpt-3.5正常交互,如果涉及到的把检索到的信息补充进prompt?那怎么判断是不是涉及到本地知识库呢,检索的步骤是少不了的吧。然后其实用chatglm应该也能做到和gpt3.5类似的效果?
「判断是不是涉及到本地知识库」就是问题,只能让AI自己判断(目前AI自己判断大约的正确率估计大约在6-7成左右)。我之前尝试过每次问答必须让agent走本地知识库,如果本地知识库中没有相关信息,就回答不知道。但是没有成功。
试试在这个命令模板基础上调整。我试过有一定效果,但是感觉还需要(在不fine-tune模型的基础上)继续调整用词来改进:
如果以下文段是空的,停止思考,回复"没有查询到任何知识库内容"。如果以下文段和用户问题有关,直接完整输出以下文段作为答案,停止思考。如果无法从以下文段中得到答案,停止思考,直接回复”不知道”。
请问是修改knowledge_based_chatglm.py的system_template吗?我试了下修改,然后直接问本地知识文档里的问题,source_documents显示匹配出对应知识,但还是有大部分问题,模型会倔强地回答自己的内容。 还是说,本地知识文档的格式有什么特殊要求吗?我是整理了问答对,一行数据是一个问答对。
主要是以下 3 方面可以优化:
- 优化 text_split 算法,使匹配出的结果作为上下文时能够提供更合理的推理/回答依据;
- 优化 embedding 模型,提升语义向量化的效果,使得语义匹配过程中能够匹配出最满足要求的文本段落作为上下文;
- 优化 LLM 模型,使得给定提问相同情况下,得到更理想的推理/回答结果。
你好,请问 text_split 算法相关的优化经验有哪些,分块的大小对效果的影响评估过吗? embedding向量化与语言有关吗?比如上下文是英文的,用中文提问,同样的embedding可行吗? 多轮对话是否可以利用langchain的Conversational Memory能力优化呢?
优化 LLM 模型,使得给定提问相同情况下,得到更理想的推理/回答结果。
第3条很难实现,因为目前没有模型能接收上万中文汉字作为数据集来训练和微调。
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答? 我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
就是说如果不涉及到本地知识库的就让gpt-3.5正常交互,如果涉及到的把检索到的信息补充进prompt?那怎么判断是不是涉及到本地知识库呢,检索的步骤是少不了的吧。然后其实用chatglm应该也能做到和gpt3.5类似的效果?
「判断是不是涉及到本地知识库」就是问题,只能让AI自己判断(目前AI自己判断大约的正确率估计大约在6-7成左右)。我之前尝试过每次问答必须让agent走本地知识库,如果本地知识库中没有相关信息,就回答不知道。但是没有成功。
试试在这个命令模板基础上调整。我试过有一定效果,但是感觉还需要(在不fine-tune模型的基础上)继续调整用词来改进:
如果以下文段是空的,停止思考,回复"没有查询到任何知识库内容"。如果以下文段和用户问题有关,直接完整输出以下文段作为答案,停止思考。如果无法从以下文段中得到答案,停止思考,直接回复”不知道”。
我在这个思路上做了尝试,将prompt修改为 PROMPT_TEMPLATE = """已知信息: {context} 根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请忽略,直接使用原LLM_MODEL模型回答问题,不允许在答案中添加编造成分,答案请使用中文。 问题是:{question}"""
这样可以做到如果问题在知识库中能找到答案,则用找到的答案回答,如果找不到答案,就用chatglm6B回答,比如问一些不在知识库里的常规的问题:"介绍北京"..,也可以准确回答.
但发现无法进行多轮对话,比如问了中国的首都在哪,回答北京后,再问详细介绍一下,就不会回答了,说没有提供更多的信息,无法回答,有人遇到过这种情况吗?
我也是这样,多轮对话,直接忘掉前面了
有没有尝试过用Agent来实现,Agent可以做到多轮对话,若是涉及到本地知识库的,用tools询问本地vector store,将获取的上下文信息放入prompt中让LLM回答?
我用openai embedding+gpt-3.5-turbo试过,可行,不过困难的是让LLM判断是否需要agent来完成一次问答。
大佬我也有这个需求,有啥进展么,这个项目感觉没有agent的demo那个bing感觉有点懵,langchain原生感觉可以
还有问答对知识库,感觉很不稳定,准确性有限,不知道怎么微调或者调整导入的话术,以便跟准