用LangChain实现一个ChatBlog

文章目录

  • 前言
  • 环境
  • 一、构建知识库
  • 二、将知识库向量化
  • 三、召回
  • 四、利用LLM做阅读理解
  • 五、效果
  • 总结


前言

通过本文, 你将学会如何使用langchain来构建一个自己的知识库问答
其实大多数类chatpdf产品的原理都差不多, 我将其简单粗暴地分为以下四步:

  1. 构建知识库
  2. 将知识库向量化
  3. 召回
  4. 利用LLM做阅读理解

下面, 我们就来看看, 如何利用我们自己写的博客, 打造一个ChatBlog
本文使用的知识库数据来自我之前写的一篇博客: 基于Sentence-Bert的检索式问答系统

环境

老规矩, 环境是必不可少的一部分:

langchain==0.0.148
openai==0.27.4
chromadb==0.3.21

一、构建知识库

比较简单, 直接上代码吧

def get_blog_text():data_path = 'blog.txt'with open(data_path, 'r') as f:data = f.read()soup = BeautifulSoup(data, 'lxml')text = soup.get_text()return text# 自定义句子分段的方式,保证句子不被截断
def split_paragraph(text, max_length=300):text = text.replace('\n', '') text = text.replace('\n\n', '') text = re.sub(r'\s+', ' ', text)"""将文章分段"""# 首先按照句子分割文章sentences = re.split('(;|。|!|\!|\.|?|\?)',text) new_sents = []for i in range(int(len(sentences)/2)):sent = sentences[2*i] + sentences[2*i+1]new_sents.append(sent)if len(sentences) % 2 == 1:new_sents.append(sentences[len(sentences)-1])# 按照要求分段paragraphs = []current_length = 0current_paragraph = ""for sentence in new_sents:sentence_length = len(sentence)if current_length + sentence_length <= max_length:current_paragraph += sentencecurrent_length += sentence_lengthelse:paragraphs.append(current_paragraph.strip())current_paragraph = sentencecurrent_length = sentence_lengthparagraphs.append(current_paragraph.strip())documents = []for paragraph in paragraphs:new_doc = Document(page_content=paragraph)print(new_doc)documents.append(new_doc)return documentscontent = get_blog_text()
documents = split_paragraph(content)

这里必须要说明一下, 我没有使用langchain提供的文档划分函数, langchain提供了很多种文档划分方式, 感兴趣的同学可以查看 langchain.text_splitter里面的源码. 这里我给截出来了, 大概有这么些种吧, 其实都差不多, 目的都差不多是为了将段划分得比较合理.
请添加图片描述
我们这里设置了一个max_length, 这个长度, 如果使用的是chatgpt的话, 最大可以是4096, 因为chatgpt允许的最大输入Token4096, 换算成中文的话, 实际还要更短一些, 还要加上promptToken长度, 所以需要预留出一定空间.

分段分不好的话, 对输出的影响还是挺大的, 我们这里是按句划分, 其实更合理的是按博客的小标题划分, CSDN的问答机器人就是这么做的, 哈哈, 这里硬推一波, 效果还是很不错的, 超越了所有人类, 不服的可以来挑战一下:
https://ask.csdn.net/

后面我也会抽空写一篇CSDN问答机器人的博客来和大家分享一下实现细节, 点点关注不迷路

请添加图片描述

二、将知识库向量化

# 持久化向量数据
def persist_embedding(documents):# 将embedding数据持久化到本地磁盘persist_directory = 'db'embedding = OpenAIEmbeddings()vectordb = Chroma.from_documents(documents=documents, embedding=embedding, persist_directory=persist_directory)vectordb.persist()vectordb = None

这里的OpenAIEmbeddings默认使用的是text-embedding-ada-002模型来做emdedding, 你也可以换成别的, langchain提供了以下embedding的方式
请添加图片描述
你也可以自己从本地加载一个句向量模型去embedding, 这里需要注意一下, 如果使用的是openai的向量化模型的话, 是需要打开科学上网的.

向量化完了后, 我们需要将向量化后的结果存起来, 下次用 , 直接加载就行了, 我这里使用的是Chroma来存储向量化后的数据, 不过, langchain还支持其他的向量数据库, 如下:
请添加图片描述
Chroma我也是第一次用, 感兴趣的同学可以自己去了解一下, FAISS应该是用的比较多的, 我在问答机器人中用的是pgvector, 因为我们数据库用的是PostgresSQL, pgvector是PG的向量化存储插件, 所以我们用了这个, 并没有什么特别的原因, 其实各种向量化数据库都差不多, 影响召回速度和效果的是索引的构建方式, 其中比较知名的是HNSW, 感兴趣的可以去了解一下

三、召回

global retriever
def load_embedding():embedding = OpenAIEmbeddings()global retrievervectordb = Chroma(persist_directory='db', embedding_function=embedding)retriever = vectordb.as_retriever(search_kwargs={"k": 5})

k=5是指指召回top 5的结果

as_retriever函数还有个search_type的参数, 默认的是similarity, 参数解释如下:

search_type 搜索类型:“similarity” 或 “mmr”。search_type=“similarity” 在检索器对象中使用相似性搜索,在其中选择与问题向量最相似的文本块向量。search_type=“mmr” 使用最大边际相关性搜索,其中优化相似性以查询所选文档之间的多样性。

四、利用LLM做阅读理解

def prompt(query):prompt_template = """请注意:请谨慎评估query与提示的Context信息的相关性,只根据本段输入文字信息的内容进行回答,如果query与提供的材料无关,请回答"我不知道",另外也不要回答无关答案:Context: {context}Question: {question}Answer:"""PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])docs = retriever.get_relevant_documents(query)# 基于docs来prompt,返回你想要的内容chain = load_qa_chain(ChatOpenAI(temperature=0), chain_type="stuff", prompt=PROMPT)result = chain({"input_documents": docs, "question": query}, return_only_outputs=True)return result['output_text']

其实就是将召回的文本, 作为prompt的一部分, 再让chatgptprompt中总结答案, 跟阅读理解简直一模一样.
前面说的分段对结果影响很大, 在这个地方也有体现, 分段分不好, 召回的数据就不好, chatgpt就很难从中总结出答案.

注意: 这里也需要科学上网.

五、效果

请添加图片描述
非常正确

总结

1、整体跟阅读理解类似, 不过你可以调整prompt, 比如: 请你结合Context和你自己现有的知识, 回答以下问题
2、全部代码: https://github.com/seanzhang-zhichen/ChatBlog

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

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

相关文章

ChatGPT in Drug Discovery

ChatGPT是OpenAI开发的一种语言模型。这是一个在大型人类语言数据集上训练的机器学习模型&#xff0c;能够生成类似人类语言文本。它可以用于各种自然语言处理任务&#xff0c;如语言翻译、文本摘要和问题回答。在目前的工作中&#xff0c;我们讨论了ChatGPT在药物发现中的应用…

微软“砍掉”元宇宙部门,刚成立四个月!网友:ChatGPT 会是下一个“元宇宙”吗?...

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在“喜新厌旧”这件事上&#xff0c;身在科技圈的人们应该很有发言权。 近期 ChatGPT 持续爆火&#xff0c;令这场竞逐热潮的规模愈发庞大&#xff1a;不仅微软、谷歌等国外科技巨头陆续下场&#xf…

文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入

“文心”取自《文心雕龙》一书的开篇&#xff0c;作者刘勰在书中引述了一个古代典故&#xff1a;春秋时期&#xff0c;鲁国有一位名叫孔文子的大夫&#xff0c;他在学问上非常有造诣&#xff0c;但是他的儿子却不学无术&#xff0c;孔文子非常痛心。 一天&#xff0c;孔文子在…

IT人专属AI工具

01 SQL助手 ① AirOps Sidekick 图源&#xff1a;官网截图 主要功能&#xff1a;创建个性化的电子邮件、产品描述或 SEO 内容&#xff1b;从非结构化数据中提取情感、关键事实和更多&#xff1b;将视频文件变成摘要和新内容&#xff1b;从一个SQL查询中获得洞察力和趋势。 &…

《花雕学AI》01:尝试使用新必应制作《雕爷学编程》的栏目介绍

跨年头尾三个月&#xff0c;花雕走完塔克拉玛干沙漠回来后&#xff0c;突然发现世界变了&#xff0c;微软投资的ChatGPT火起来了&#xff0c;特别是升级的ChatGPT4.0&#xff0c;更是异常火热&#xff01;这一个多月来&#xff0c;人工智能AI突然爆发&#xff0c;能做的事情太多…

AIGC浪潮下,鹅厂新一代前端人的真实工作感受

&#x1f449;腾小云导读 AIGC 这一时代潮流已然不可阻挡&#xff0c;我们要做的不是慌乱&#xff0c;而是把握住这个时代的机会。本文就和大家一起来探索在 AIGC 下&#xff0c;前端工程师即将面临的挑战和机遇。聊聊从以前到现在&#xff0c;AIGC 给我们带来了怎么样的变化&a…

GPT开通Plus会员教程,附带开通虚拟卡

GPT-4目前只有开通GPT Plus会员才可以体验。但是Plus会员需要支付20美元/月的费用&#xff0c;国内的卡无法绑定openai账户进行付款&#xff0c;今天给大家一个教程可以无障碍开通。 首先我们要准备的东西。 1.chat帐号 2.一张虚拟卡&#xff08;国际&#xff09; 既然是开…

开发者对抗软件创新焦虑的“180 法则” | 对话MongoDB CTO Mark Porter

在 MongoDB 首席技术官 Mark Porter 看来&#xff0c;创新滞后并不是因为公司缺乏灵感或创造力&#xff0c;而是因为他们被迫将时间花费在维护传统框架上&#xff0c;导致数据相关工作举步维艰&#xff0c;这是大多数组织都存在的问题。那么&#xff0c;对于企业而言&#xff0…

【ChatGPT】【sql】 按email统计续费成功和续费失败的数量

SELECT email,SUM(CASE WHEN renewal_status Success THEN 1 ELSE 0 END) as success_count,SUM(CASE WHEN renewal_status Failure THEN 1 ELSE 0 END) as failure_count FROM subscribers GROUP BY email;

海量数据实时分析引擎 Apache Flink

摘要&#xff1a;当系统出现大量或者重大的错误却不被人感知&#xff0c;将会对业务产生影响&#xff0c;从而导致资产损失。当竞争对手实施了新战术&#xff0c;却无法及时感知&#xff0c;跟不上竞争对手的节奏&#xff0c;总是追着对方尾巴走。当要做决策的时候&#xff0c;…

AI创业时代!这9个方向有钱途;AIGC再添霸榜应用Lensa;美团SemEval2022冠军方法分享;医学图像处理工具箱… | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 2023年9个有前途的 AI 创业方向 https://www.aiplusinfo.com/blog/9-promising-artificial-intelligence-startup-ideas-for-2023/ 2022年&#x…

超实用!50+个ChatGPT提示词助你成为高效Web开发者(上)

如果你已经感到编写代码的重复和繁琐让你疲惫不堪&#xff0c;想要提高自己的效率&#xff0c;那么你来对地方了。ChatGPT是一款能够帮助你优化工作流程、减少错误并获得提高代码的见解的强大工具。 在这篇博客文章中&#xff0c;我们将向你提供超过50个提示和策略&#xff0c;…

AI近期热点事件纵览

1&#xff0c;英国将推动建立国家主权AI 当地时间4月24日&#xff0c;英国首相苏纳克、科技大臣多内兰宣布&#xff0c;将斥资1亿英镑&#xff08;1.25亿美元&#xff09;开发“国家主权AI”&#xff01; 政府新闻稿指出&#xff1a;投资将用于资助由政府和行业共建的研发团队…

chatgpt赋能python:Python快捷换行技巧

Python快捷换行技巧 在Python编程中&#xff0c;换行是一个非常常见且必要的操作。人们习惯使用""表示换行&#xff0c;但这种用法不便于阅读和维护。本文将为大家介绍一些快捷的换行技巧&#xff0c;让你的代码更加简洁明了。 1. 使用小括号 当我们需要将一行过长…

chatgpt赋能python:Python怎么不自动换行

Python怎么不自动换行 Python 是一门高效、简洁、易于学习的编程语言&#xff0c;近年来在人工智能、数据分析、Web开发等领域得到广泛应用。然而&#xff0c;在处理文本时&#xff0c;Python 有一个让人困扰的问题&#xff0c;即自动换行。下面将从原因、影响、解决方法等方面…

chatgpt赋能python:Python输出怎么换行

Python输出怎么换行 Python作为一种非常流行的程序设计语言&#xff0c;在软件开发、数据分析和科学计算等领域得到广泛应用。在编写Python程序的过程中&#xff0c;输出是一个非常重要的环节。本文将主要介绍在Python中如何实现输出换行的操作&#xff0c;并着重探讨几种常见…

chatgpt赋能python:Python中的换行设置

Python中的换行设置 Python是一种高级编程语言&#xff0c;被广泛用于数据处理、人工智能、网络编程、自动化测试等领域。在编写Python程序时&#xff0c;经常需要进行换行操作&#xff0c;以使代码更加清晰易读。本文将介绍Python中的换行设置方法&#xff0c;并对其进行详细…

chatgpt赋能python:Python中如何取消多行换行

Python中如何取消多行换行 Python是一种非常流行的编程语言&#xff0c;有许多用于文本处理的代码和库。然而&#xff0c;由于不同操作系统的换行符规则不同&#xff0c;使得在处理文本文件时产生了许多问题。最常见的就是“多行换行符”&#xff0c;即在一个文本文件中&#…

C语言 文件操作实现成绩排序

前言 彩笔写个大作业每个功能都要卡好久。唉&#xff0c;带专人太难了&#xff0c;呜呜呜。 吐槽&#xff1a;chatgpt不靠谱&#xff0c;我改了一下&#xff0c;让它能跑起来。 程序要求 1. 输入学生姓名&#xff0c;成绩&#xff08;连续两个空格换行&#xff09;&#xff0c…

chatgpt赋能python:Python编译器怎么换行

Python编译器怎么换行 在编写代码时&#xff0c;换行是非常重要的&#xff0c;可以使得代码更加清晰易懂&#xff0c;提高代码的可读性&#xff0c;Python编译器也不例外。但是对于一些新手来说&#xff0c;可能不太了解Python编译器中如何实现换行操作。在本文中&#xff0c;…