基于本地知识构建简易的chatPDF

news/2024/5/19 16:10:41/文章来源:https://blog.csdn.net/weixin_46133588/article/details/130366893

Langchain + chatglm-6b


文章目录

  • Langchain + chatglm-6b
  • 前言
  • 一、实验记录
    • 1.1 环境配置
    • 1.2 代码理解
    • 1.3 补充内容
  • 二、总结


前言

介绍:一种利用 ChatGLM-6B + langchain 实现的基于本地知识的 ChatGLM 应用
Github: https://github.com/imClumsyPanda/langchain-ChatGLM


一、实验记录

1.1 环境配置

conda create -n lang python=3.8
conda activate langpip install -r requirement.txt

1.2 代码理解

1-将文章使用句号进行分句
2-将句子使用text2vec进行向量化存储
3-将query进行向量化后,和FAISS库里的正文文档进行topk相似度的召回
4-召回到的正文和query构造成prompt,输入到chatglm中

prompt模板的设置:  
prefix_prompt = \
"""基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。已知内容:{context}问题:{question}"""

核心代码

    def _call(self, inputs: Dict[str, str]) -> Dict[str, Any]:"""question = inputs[self.input_key]   获取querydocs = self._get_docs(question)     根据query获取上下文中最相似的正文answer = self.combine_documents_chain.run(input_documents=docs, question=question)if self.return_source_documents:return {self.output_key: answer, "source_documents": docs}else:return {self.output_key: answer}@abstractmethodasync def acombine_docs(self, docs: List[Document], **kwargs: Any) -> Tuple[str, dict]:"""Combine documents into a single string asynchronously."""def _call(self, inputs: Dict[str, Any]) -> Dict[str, str]:docs = inputs[self.input_key]# Other keys are assumed to be needed for LLM predictionother_keys = {k: v for k, v in inputs.items() if k != self.input_key}output, extra_return_dict = self.combine_docs(docs, **other_keys)extra_return_dict[self.output_key] = outputreturn extra_return_dict

然后将找回来的正文和query进行concate之后,统一输入到llm中,对历史信息还是没有处理

    def _get_inputs(self, docs: List[Document], **kwargs: Any) -> dict:# Format each document according to the promptdoc_strings = [format_document(doc, self.document_prompt) for doc in docs]# Join the documents together to put them in the prompt.inputs = {k: vfor k, v in kwargs.items()if k in self.llm_chain.prompt.input_variables}inputs[self.document_variable_name] = "\n\n".join(doc_strings)return inputs

处理后的数据

data = \
{'question': '大气污染预警分为多少级', 'context': '建立健全空气质量预报预警应急  体系,加强大气污染防治工作,不断促进大气环境质量改善。\n\n  各责任部门和街道办应根据本预案的相关规定,在大气  污染预警与应急响应期间落实具体的污染防控措施。\n\n  1.5 大气污染预警与应急响应分级  1.5.1 预警分级  大气污染预警分为三级,依次用黄色、橙色和红色表示。\n\n同时,确保大气污染预警应急信息有  效传达,提醒市民采取适当的健康防护措施。\n\n  负责向区政府、市生态环境局报告污染信息;负责判断大  气污染级别,提出发布预警信息的建议;负责空气质量监  市生态环境局龙华  测、预测和信息发布;负责组织专家会商;倡导社会各界  管理局  自觉参与污染减排;确定重点减排企业名单,督促检查工  业企业落实污染减排措施。\n\n获取气象监测预报信息,与市  生态环境局共同会商空气污染预报。'
}

调用

self.llm_chain.predict(**inputs), {}

生成答案的过程:

    def generate(self, input_list: List[Dict[str, Any]]) -> LLMResult:"""Generate LLM result from inputs."""prompts, stop = self.prep_prompts(input_list) input_list上文的datareturn self.llm.generate_prompt(prompts, stop)def prep_prompts(self, input_list: List[Dict[str, Any]]) -> Tuple[List[PromptValue], Optional[List[str]]]:"""Prepare prompts from inputs."""stop = Noneif "stop" in input_list[0]:stop = input_list[0]["stop"]prompts = []for inputs in input_list:selected_inputs = {k: inputs[k] for k in self.prompt.input_variables}prompt = self.prompt.format_prompt(**selected_inputs) _colored_text = get_colored_text(prompt.to_string(), "green")_text = "Prompt after formatting:\n" + _colored_textself.callback_manager.on_text(_text, end="\n", verbose=self.verbose)if "stop" in inputs and inputs["stop"] != stop:raise ValueError("If `stop` is present in any inputs, should be present in all.")prompts.append(prompt)return prompts, stop

self.prompt.format_prompt 即是之前设置的 prefix_prompt
构造完毕之后是:

基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题""没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。已知内容:2 组织机构和职责  2.1 领导机构  龙华区大气质量提升工作领导小组是龙华区突发事件  应急委员会下设的专项应急指挥部。深圳市龙华区大气质量提升工作  领导小组(以下简称“区大气领导小组”)负责组织、协调、  指挥大气污染的预警与应急响应工作。区大气领导小组成员单位包括:区委  宣传部、市生态环境局龙华管理局、区财政局、区城市管理  和综合执法局、区住房和建设局、区水务局、区教育局、区  4  卫生健康局、区建筑工务署、市交通运输局龙华管理局、龙  华交警大队和各街道办。深圳市龙华区大气质量提升工作领导小组办公室  年 月 日  252.2 工作机构  区大气领导小组办公室为工作机构,设在市生态环境局  龙华管理局,负责区大气领导小组的日常工作,包括确定预  警与响应等级,督查区有关部门落实预警与应急响应措施。经请示深圳市龙华区大气质量提升工作领导小组同意,现决定启  动《深圳市龙华区大气污染应急预案》,请你单位依据大气污染应急  预案的相关规定,立即组织力量参与应急处置工作。问题:龙华区大气质量提升工作领导小组是什么

1.3 补充内容

langchain的基于运行原理

    def run(self) -> None:with claim_worker_thread("asyncio"):threadlocals.loop = self.loopwhile True:item = self.queue.get()if item is None:# Shutdown command receivedreturncontext, func, args, future = itemif not future.cancelled():result = Noneexception: Optional[BaseException] = Nonetry:result = context.run(func, *args)except BaseException as exc:exception = excif not self.loop.is_closed():self.loop.call_soon_threadsafe(self._report_result, future, result, exception)self.queue.task_done()

构造一个队列等待用户的信号,一旦页面中监测到信号,依次去判断哪个按钮触发的信号,再根据信号的钩函数处理对应的逻辑


二、总结

在这里插入图片描述

这里的整体逻辑还是相对比较简单的,每个环节都还可以继续优化,作者在群里说了,项目代码已经在持续优化中了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_292974.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《个人博客部署上线教程一》Halo搭建个人博客网站

Halo搭建个人博客网站 一、docker部署Halo 目前测试了两种方法安装Halo,第一种是使用Jar包安装:提供JAR包资源,不过因为使用jar包部署需要Java11才可以,我本机使用的是Java8,所以暂时不做调整。第二种是通过docker安装。 1.1 启…

if条件语句

if条件语句 条件测试 test 测试表达式是否成立,若成立返回0,否则返回其他数值 格式1 :test 条件表达式;格式2 :[ 条件表达式 ] echo $?参数作用-d测试是否为目录 (Directory)-e测试目录或文件是否存在(Exist)-f测…

【java笔记】java多线程

目录 一、概念 1.1 什么是进程? 1.2 什么是线程? 1.3 什么事多线程? 1.4 进程和线程的关系 二、线程对象的生命周期 三、实现线程有两种方式 3.1 继承 java.lang.Thread,重写 run方法 3.2 实现 java.lang.Runnable 接口…

八、vue_options之computed、watch属性选项

一、computed计算属性使用 (1)复杂data的处理方式 (2)computed 计算属性 computed计算属性初体验: 在我们通过Vue调用createApp方法传入一个对象的时候,我们之前写了data属性、methods属性,这…

HTB-Time

HTB-Time 信息收集80端口 立足pericles -> root 信息收集 80端口 有两个功能,一个是美化JSON数据。 一个是验证JSON,并且输入{“abc”:“abc”}之类的会出现报错。 Validation failed: Unhandled Java exception: com.fasterxml.jackson.core.JsonPa…

低代码是开发的未来,还是只能解决边角问题的鸡肋?

随着互联网行业寒冬期的到来,降本增效、开源节流几乎成为了全球互联网厂商共同的应对措施,甚至高薪酬程序员的“35岁危机”一下子似乎变成了现实。程序员的高薪吸引了各行各业的“跨界选手”,是编程门槛降低了吗?不全是&#xff0…

Linux Ansible管理变量、管理事实、管理机密

目录 Ansible变量 变量定义范围 变量类型 定义变量并引用 事实变量与魔法变量 事实变量 魔法变量 Ansible加密 ansible-vault参数 ansible-vault举例 Ansible变量 Ansible支持利用变量来存储值,并且可以在Ansible项目的所有文件中重复使用这些值 变量可能…

Hadoop3.2.4+Hive3.1.2+sqoop1.4.7安装部署

目录 一、软件包 二、JDK部署 1.JDK解压 2.设置环境变量 3.环境验证 4.分发JDK相关文件至Node_02、Node_03 5.环境生效 三、Zookeeper部署 1.Zookeeper解压 2.Zookeeper配置 3.创建myid文件 4.设置环境变量并添加映射 5.分发ZooKeeper 相关文件至Node_02、Node_0…

Qt — Graphics/View框架

文章目录 前言一、Qt图形系统介绍二、Graphics/View框架 前言 Qt的Graphics/View框架被用来存放、显示二维图形元素,处理那些对图形元素进行操作的交互命令。 一、Qt图形系统介绍 Qt 应用程序的图形界面包含各种控件,比如窗口、按钮、滚动条等。所有这…

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

4月24日~4月26日学习总结

一,刷题目情况,已经完成了8道题目,对于其中一些题目做一下题解。 这个题目的意思是找到的两个位置l和r,为了做到这个数组的l到r的子数组经过排序后,会变成输入的另外一个数组,这个题目的思路就是首先找到在…

服务(第十篇)Nginx和tomcat反向代理(动静分离)

正向代理: 当用户想访问某一网址时,用户先访问代理服务器,然后由代理服务器向目标网址发送请求最终将数据返回代理服务器,最后代理服务器将数据返回给用户这一过程我们称之为正向代理。 反向代理:基本流程是与正向代理…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么? new除了新开空间创建初始化对象外,还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new,用了new后父类同名方法将到此为止,后面 继承的…

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc,所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

最新版TensorFlow的GPU版本不支持原生Windows系统(大坑预警)

一、前言 首先需要说明,按照官方中文文档安装是无法正常检测到GPU的。因为TensorFlow 2.10是支持原生Windows系统GPU环境的最后版本,默认安装的版本都比较高。 中文文档没有说明,英文文档是有提到的: (我在GitHub上找…

操作系统之进程同步和互斥

目录 什么是进程同步和进程互斥 进程互斥的软件实现方法 进程互斥的硬件实现方法 互斥锁 信号量机制 用信号量实现进程互斥和同步 生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 管程 死锁 什么是进程同步和进程互斥 进程同步 进…

Scala之模式匹配与隐式转换

目录 模式匹配: 基础语法如下: 模式守卫: 类型匹配: 对象匹配 样例类: 偏函数: 偏函数的化简写法: 偏函数的使用: 隐式转换: 官方定义: 个人理解&…

Linux-使用mobaxterm连接虚拟机ubuntu

一、准备工作 VMware:16.0.0 Ubuntu:18.4 MobaxTerm:链接:https://pan.baidu.com/s/1dNsahe9wO5KrWlWXtNqT0A?pwdaz39 提取码:az39 二、实操 1.检查系统是否安装ssh service sshd status 如果显示未安装&#xff0…

基于MATLAB实现WSN(无线传感器网络)的LEACH(低能耗自适应集群层次结构)(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 低能耗自适应集群层次结构(“LEACH”)是一种基于 TDMA 的 MAC 协议,它与无线传感器网络 &a…

私有部署、重构企业软件,第四范式发布大模型“式说”

大模型领域再添重要一员! 4月26日,第四范式首次向公众展示其大模型产品「式说3.0」,并首次提出AIGS战略(AI-Generated Software):以生成式AI重构企业软件。式说将定位为基于多模态大模型的新型开发平台&…