大语言模型-中文Langchain

news/2024/4/26 12:43:25/文章来源:https://blog.csdn.net/weixin_38812492/article/details/130241643
  • 微调
    大语言模型-ChatGLM-Tuning
    大语言模型-微调chatglm6b
    大语言模型-中文chatGLM-LLAMA微调
    大语言模型-alpaca-lora

  • 本地知识库
    大语言模型2-document ai解读
    大语言模型-DocumentSearch解读
    大语言模型-中文Langchain

中文Langchain

使用chatGLM6b + langchain实现本地化知识库检索与智能答案生成

https://github.com/yanqiangmiffy/Chinese-LangChain

配置

class LangChainCFG:llm_model_name = 'chatglm-6b'  # 本地模型文件 or huggingface远程仓库embedding_model_name = 'text2vec-large-chinese'  # 检索模型文件 or huggingface远程仓库vector_store_path = '.'docs_path = './docs'

向量近邻检索

文本进行向量化后存入数据库,还不清楚langchain包里的FAISS做了哪些改变

class SourceService(object):def __init__(self, config):self.vector_store = Noneself.config = configself.embeddings = HuggingFaceEmbeddings(model_name=self.config.embedding_model_name)self.docs_path = self.config.docs_pathself.vector_store_path = self.config.vector_store_pathdef init_source_vector(self):"""初始化本地知识库向量:return:"""docs = []for doc in os.listdir(self.docs_path):if doc.endswith('.txt'):print(doc)loader = UnstructuredFileLoader(f'{self.docs_path}/{doc}', mode="elements")doc = loader.load()docs.extend(doc)self.vector_store = FAISS.from_documents(docs, self.embeddings)self.vector_store.save_local(self.vector_store_path)def add_document(self, document_path):loader = UnstructuredFileLoader(document_path, mode="elements")doc = loader.load()self.vector_store.add_documents(doc)self.vector_store.save_local(self.vector_store_path)def load_vector_store(self, path):if path is None:self.vector_store = FAISS.load_local(self.vector_store_path, self.embeddings)else:self.vector_store = FAISS.load_local(path, self.embeddings)return self.vector_storedef search_web(self, query):SESSION.proxies = {"http": f"socks5h://localhost:7890","https": f"socks5h://localhost:7890"}results = ddg(query)web_content = ''if results:for result in results:web_content += result['body']return web_content

chatGLM

调用chatGLM

from typing import List, Optionalfrom langchain.llms.base import LLM
from langchain.llms.utils import enforce_stop_tokens
from transformers import AutoModel, AutoTokenizerclass ChatGLMService(LLM):max_token: int = 10000temperature: float = 0.1top_p = 0.9history = []tokenizer: object = Nonemodel: object = Nonedef __init__(self):super().__init__()@propertydef _llm_type(self) -> str:return "ChatGLM"def _call(self,prompt: str,stop: Optional[List[str]] = None) -> str:response, _ = self.model.chat(self.tokenizer,prompt,history=self.history,max_length=self.max_token,temperature=self.temperature,)if stop is not None:response = enforce_stop_tokens(response, stop)self.history = self.history + [[None, response]]return responsedef load_model(self,model_name_or_path: str = "THUDM/chatglm-6b"):self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path,trust_remote_code=True)self.model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True).half().cuda()self.model=self.model.eval()  

langchain

道理还是一样,把搜索的结果包装成prompt之后调用LLM

class LangChainApplication(object):def __init__(self, config):self.config = configself.llm_service = ChatGLMService()self.llm_service.load_model(model_name_or_path=self.config.llm_model_name)self.source_service = SourceService(config)if self.config.kg_vector_stores is None:print("init a source vector store")self.source_service.init_source_vector()else:print("load zh_wikipedia source vector store ")try:self.source_service.load_vector_store(self.config.kg_vector_stores['初始化知识库'])except Exception as e:self.source_service.init_source_vector()def get_knowledge_based_answer(self, query,history_len=5,temperature=0.1,top_p=0.9,top_k=4,web_content='',chat_history=[]):if web_content:prompt_template = f"""基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。已知网络检索内容:{web_content}""" + """已知内容:{context}问题:{question}"""else:prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。已知内容:{context}问题:{question}"""prompt = PromptTemplate(template=prompt_template,input_variables=["context", "question"])self.llm_service.history = chat_history[-history_len:] if history_len > 0 else []self.llm_service.temperature = temperatureself.llm_service.top_p = top_pknowledge_chain = RetrievalQA.from_llm(llm=self.llm_service,retriever=self.source_service.vector_store.as_retriever(search_kwargs={"k": top_k}),prompt=prompt)knowledge_chain.combine_documents_chain.document_prompt = PromptTemplate(input_variables=["page_content"], template="{page_content}")knowledge_chain.return_source_documents = Trueresult = knowledge_chain({"query": query})return result# if __name__ == '__main__':
#     config = LangChainCFG()
#     application = LangChainApplication(config)
#     result = application.get_knowledge_based_answer('马保国是谁')
#     print(result)
#     application.source_service.add_document('/home/searchgpt/yq/Knowledge-ChatGLM/docs/added/马保国.txt')
#     result = application.get_knowledge_based_answer('马保国是谁')
#     print(result)

web search

from duckduckgo_search import ddg
from duckduckgo_search.utils import SESSIONSESSION.proxies = {"http": f"socks5h://localhost:7890","https": f"socks5h://localhost:7890"
}
r = ddg("马保国")
print(r[:2])
"""
[{'title': '马保国 - 维基百科,自由的百科全书', 'href': 'https://zh.wikipedia.org/wiki/%E9%A9%AC%E4%BF%9D%E5%9B%BD', 'body': '马保国(1951年 — ) ,男,籍贯 山东 临沂,出生及长大于河南,中国大陆太极拳师,自称"浑元形意太极门掌门人" 。 马保国因2017年约战mma格斗家徐晓冬首次出现
大众视野中。 2020年5月,马保国在对阵民间武术爱好者王庆民的比赛中,30秒内被连续高速击倒三次,此事件成为了持续多日的社交 ...'}, {'title': '馬保國的主页 - 抖音', 'href': 'https://www.douyin.com/user/MS4wLjABAAAAW0E1ziOvxgUh3VVv5FE6xmoo3w5WtZalfphYZKj4mCg', 'body': '6.3万. #马马国教扛打功 最近有几个人模芳我动作,很危险啊,不可以的,朋友们不要受伤了。. 5.3万. #马保国直播带货榜第一 朋友们周末愉快,本周六早上湿点,我本人在此号进行第一次带货直播,活到老,学到老,越活越年轻。. 7.0万. #马保国击破红牛罐 昨天 ...'}]
"""

webui

采用transformers的gradio

huggingface space

  • https://huggingface.co/spaces/launch
  • https://huggingface.co/docs/hub/spaces
  • 可以使用github actions 同步:https://github.com/marketplace/actions/sync-with-hugging-face-hub

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

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

相关文章

QMS-云质说质量 - 4 为什么有的质量人不属于质量部?

想管理好质量,首先就要把质量人员放在合适的组织架构中。 对人进行管理,基本原则是:尽量让员工的利益与企业的利益保持同步,虽然无法做到完全重合,但出发点肯定要战略一致。 俗话说“屁股决定脑袋”,因此&a…

IS210AEBIH3BED包含逻辑集成电路、存储器集成电路、专用集成电路

IS210AEBIH3BED包含逻辑集成电路、存储器集成电路、专用集成电路 什么是集成电路测试仪   集成电路测试仪是对集成电路进行测试的专用仪器设备。集成电路测试是保证集成电路性能、质量的关键手段之一。集成电路测试技术是发展集成电路产业的三大支撑技术之一,因此…

ChatGPT课程送账号啦,让你成为新生代AI程序员

ChatGPT能帮助程序员 解决哪些具体问题? 程序员在日常工作中可能会遇到各种各样的问题,如语法错误、逻辑问题、性能问题等等。 不同业务场景的问题,都可以利用ChatGPT获取各自场景下的知识,并使用ChatGPT提供的代码示例和问题解…

Kerberos设计和落地长常识

Kerberos 处理三类安全对象 票证 kerberos票证授予服务给每个客户发一张标记,该标记发送给一个特殊的服务器,证实kerberos最近已经认证了发送者,票证包括过期时间和新生成的会话密钥供客户和服务器使用。 认证 由客户构造的一个标记&#xff…

震惊!为了4680锂电池溯源,竟然做出这种事情

电池溯源,一直都是国家尤为重视的话题。 中国电子技术标准化研究院更是一再强调了:锂电编码标准编制和溯源平台初步建设方案。参会代表围绕锂电编码溯源体系建设有关问题开展了研讨,表示依托行业通用编码标准,建立完善的锂电全生…

OSCP-Sirol(docker容器到宿主机)

目录 扫描 WEB 提权 扫描 sudo nmap 192.168.64.54 -p- -sS -sVPORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0) 53/tcp closed domain 80/tcp open http Apache httpd 2.4.25 ((Debian)) 3306…

leetcode重点题目分类别记录(四)图论深入

文章目录 入度出度最大网络秩可以到达所有点的最少点数目 并查集省份数量等式方程的可满足性按字典序排列最小的等效字符串以图判树 二分图判断二分图 深度优先搜索封闭岛屿数量太平洋大西洋水流问题 广度优先搜索树上逃逸最短路径多源最短路径 拓扑排序DFS解决拓扑排序BFS解决…

【C++关联容器】set的成员函数

目录 set 1. 构造、析构和赋值运算符重载 1.1 构造函数 1.2 析构函数 1.3 赋值运算符重载 2. 迭代器 3. 容量 4. 修改器 5. 观察者 6. 操作 7. 分配器 set set是按照特定顺序存储唯一元素的容器。 在一个set中,一个元素的值也是它的标识(值…

mybatis中大数据量foreach插入效率对比

1.controller代码 RequestMapping("/testInsert")public String testInsert(Integer sum){testService.testInsert(sum);return "发送成功";}2.service代码 Overridepublic void testInsert(Integer sum) {long start System.currentTimeMillis();List<…

修炼汇编语言第一章:汇编基础知识概述

目录 前言 一、汇编语言的组成 二&#xff1a;存储器 三&#xff1a;指令和数据 四&#xff1a;存储单元 五&#xff1a;CPU对存储器的读写 地址总线 控制总线 数据总线 前言 汇编语言是数据结构&#xff0c;操作系统&#xff0c;微机原理等重要课程的基础&#xff0…

QT中TCP的学习

文章目录 qt中TCP的实现 qt中TCP的实现 学习视频 QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程 下方的信号都是系统提供的&#xff0c;我们只需要写相应的槽函数 A、服务器&#xff1a; 创建QTcpServer对象启动服务器&#xff08;监听&…

【C语言】指针进阶[上] (字符、数组指针、指针数组、数组传参和指针传参)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 字符指针 面试题 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名 VS 数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二…

后端大厂面试总结大全六

目录&#xff1a; 1、Transactional注解控制事务有哪些不生效的场景2、MySQL的优化 1、Transactional注解控制事务有哪些不生效的场景 数据库引擎不支持事务数据源没有配置事务管理器没有被spring管理方法不是public的同一个类中方法调用&#xff0c;导致Transactional失效 举…

操作系统原理 —— 进程状态切换具体做了哪些事情?(八)

什么是进程控制&#xff1f; 进程控制的主要功能是&#xff1a;对系统中的所有进程实施有效的管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简单来说&#xff0c;就是进程控制就是要现实进程状态的转换。 那如何实现进程的控制呢&#xff1f;…

手推FlinkML2.2(一)

Java 快速入门 # 本文档提供了一个关于如何使用Flink ML的快速入门。阅读本文档的用户将被指导提交一个简单的Flink作业&#xff0c;用于训练机器学习模型并提供预测服务。 求助&#xff0c;我卡住了&#xff01;# 如果你遇到困难&#xff0c;请查看社区支持资源。特别是&…

Java线程间通信方式

前文了解了线程的创建方式和状态切换&#xff0c;在实际开发时&#xff0c;一个进程中往往有很多个线程&#xff0c;大多数线程之间往往不是绝对独立的&#xff0c;比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上&#xff0c;又或者比较典型的消费者-生产…

【论文写作】如何写引言?应该思考什么问题?总体架构!!!

结构 大多数的科技论文都聚焦于简单地说明&#xff0c;做了什么&#xff0c;发现了什么&#xff1f;虽然这个可以帮助你写出一篇研究型论文当中的核心的东西&#xff08;方法论和结果&#xff09;&#xff0c;但是不能完全把引言的部分完成。在这篇文章当中&#xff0c;将展示…

4 redis高可用

所谓的高可用&#xff0c;也叫HA&#xff08;High Availability&#xff09;&#xff0c;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。如果在实际生产中&#xff0c;如果redis只部署一个节点&#xff0c;…

从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设计思路

本文编辑&#xff1a;调皮哥的小助理 站在设计雷达的角度看&#xff0c;其实无论是传统的3D毫米波雷达&#xff0c;还是如今的4D毫米波成像雷达&#xff0c;其雷达系统性能参数都遵循一个原则&#xff0c;即&#xff1a; d res ⋅ v res ⋅ θ res d max ⁡ ⋅ v max ⁡ ⋅ …

ESP8266通过MQTT协议连接onenet云平台

中国移动onenet平台 文章目录 中国移动onenet平台前言一、onenet平台二、ESP82661.完整代码2.联网代码3.连云代码4.数据处理 总结 前言 最近在弄onenet平台&#xff0c;用arduino结合esp8266&#xff0c;就是不知道怎么回事&#xff0c;一直连不上wifi&#xff0c;然后就用esp…