ChatGPT | LangChain的文本切割方法对比

news2024/12/24 2:34:53

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

ChatGPT面向对话格式的文本理解很好,但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题,讲起来需要很多篇幅,优化起来前路漫漫。

本文基于稍微加工后的文本内容,使用LangChain的CharacterTextSplitter 和 RecursiveCharacterTextSplitter两个文本切割方法做效果对比,因为文本切割的效果直接影响知识库方向ChatGPT反馈的效果

先说结论,CTS比RTCS稍好,利用明确的段落分隔符可以避免一些初级问题发生,一些高级的问题两者都会发生。

以下文本内容来自大爆发:最后一波上半年能开标的50多个项目,预算超50亿元,标黄的内容是测试关键数据。

直接贴出运行结果,红框是出错的地方都是来自RTCS(RecursiveCharacterTextSplitter):

 CTS 返回结果是使用CharacterTextSplitter做text_splitter,它是基于符号做段落切割,本文选择####作为段落的分割符。

RTCS 返回结果是使用RecursiveCharacterTextSplitter,它是基于固定大小做段落切分。

再次总结结论,CTS比RTCS稍好,可以避免一些初级问题发生。


接下来贴出源代码,分为两部分:input.py和output.py。

以下是Input.py的源码,是很关键很关键很关键的地方,用embedding和切割存数据到向量数据库:

import os
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter

# 1 定义embedding
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"
os.environ["OPENAI_API_BASE"] = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", deployment="lk-text-embedding-ada-002", chunk_size=1)

# 2 定义文件 
loader = TextLoader(".\\单文件\\项目信息.txt", "utf-8")
pages = loader.load_and_split()

# 3 重要!!!初始化加载器
# 按符号切分段落
text_splitter_CTS = CharacterTextSplitter(
    separator = "####",
    chunk_size = 500, #chunk_size = 1000,
    chunk_overlap = 0
)
split_docs_CTS = text_splitter_CTS.split_documents(pages)
print(f'CharacterTextSplitter documents:{len(split_docs_CTS)}')
#print(split_docs_CTS)
#写入向量数据库
print(f'写入CTS向量数据库')
vectordb = Chroma.from_documents(split_docs_CTS, embedding=embeddings, persist_directory="./CTS/")
vectordb.persist()

# 按固定尺寸切分段落
text_splitter_RCTS = RecursiveCharacterTextSplitter(
    chunk_size = 500, #chunk_size = 1000,
    chunk_overlap = 200
)
split_docs_RCTS = text_splitter_RCTS.split_documents(pages)
print(f'RecursiveCharacterTextSplitter documents:{len(split_docs_RCTS)}')
#print(split_docs_RCTS)
#写入向量数据库
print(f'写入RCTS向量数据库')
vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./RTCS/")
vectordb.persist()
 

以下是Output.py的源码,调用ChatGPT基于向量数据库搜索出来的文字片段组织文字来回答:

import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI,VectorDBQA
from langchain.chains import RetrievalQA
from typing import Dict, Any

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxxxxxxx"
os.environ["OPENAI_API_BASE"] = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"

dict: Dict[str, Any] = {
    "deployment_id": "lk-gpt-35-turbo"
}
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", deployment="lk-text-embedding-ada-002", chunk_size=1)
openAiLLm = OpenAI(temperature=0.9, model_name="gpt-35-turbo", model_kwargs=dict, max_tokens=100)


db_CTS = Chroma(persist_directory="./CTS/", embedding_function=embeddings)
db_RTCS = Chroma(persist_directory="./RTCS/", embedding_function=embeddings)

print('----------------')

question_list=["介绍一下重庆市新型数字交通物联网大数据服务平台的金额、截止时间",
               "介绍一下广州城市职业学院项目的金额、截止时间",
               "介绍一下吴中区智慧教育项目的预算、截止时间",
               "介绍一下之江实验室项目的预算、截止时间"]

for i in range(0,len(question_list)):
    question_text=question_list[i]

    qa_CTS = RetrievalQA.from_chain_type(llm=openAiLLm, chain_type="stuff", retriever=db_CTS.as_retriever(), return_source_documents=False)
    # 进行问答
    result = qa_CTS({"query": question_text}) 
    print("CTS 返回结果:" + str(result))#.split('\n')[0])
    print('------')

    qa_RTCS = RetrievalQA.from_chain_type(llm=openAiLLm, chain_type="stuff", retriever=db_RTCS.as_retriever(), return_source_documents=False)
    # 进行问答
    result = qa_RTCS({"query": question_text}) 
    print("RTCS 返回结果:" + str(result))#.split('\n')[0])
    print('***********************************************')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习C++的意义

文章目录 前言意义软件方法论的发展面向对象的程序设计宽泛的意义 C到C的升级ubuntu安装g编译器总结 前言 C是一种强大而广泛应用的编程语言,具有广泛的用途和应用领域。无论你是计算机科学专业的学生、自学编程的爱好者,还是想要进一步提升编程技能的专…

在linux系统中如何设置定时任务

前言: 在linux日常运维过程中我们常常需要在指定时间段自动停止或启动某个服务我们不可能人为的手动去执行,这时候我们就可以给对应的任务设置一个定时。后面我就可以将周期性的、规则的工作交给定时任务去完成。 **一次性任务:**顾名思义就是…

SAP CAP篇七:为CAP添加Fiori Launchpad入口 (Sandbox环境)

本文目录 本系列之前的文章在现有代码基础上继续增强增强app文件夹文件 package.json文件夹appconfig文件fioriSandboxConfig.json文件 fiori.html更新Srv中的UiIndexContentProviderFactory 再次检查代码运行效果代码库 (Gitcode) 本系列之前的文章 本系列之前的文章&#xf…

javaWeb之cookiesession

1 回顾 1.1 response对象 一次响应封装对象,由服务器创建。使用response对象将服务器需要的数据发送给浏览器。 将数据存放response对象中,tomcat从response对象获得数据,根据数据组织http响应,最后将http响应内容发送给浏览器&…

CTF-Show密码学:ZIP文件密码破解【暴力破解】

萌新 隐写23 题目内容: 文件的主人喜欢用生日做密码,而且还是个90后。 一、已知条件 在这个题目中,我们有以下已知条件: 文件的主人喜欢用生日做密码 - 这个条件告诉我们,密码可能是一个八位的纯数字密码&#xff0c…

windows服务器——部署PKI与证书服务

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 学习导图 一.PKI 概念 1.PKI体系能够实现的功能 二.公钥加密技术 1.公钥加…

股票量化系统QTYX选股框架实战案例集|大盘跳水,上涨趋势票抗跌-230621

前言 “实战案例个股画像”系列是和大家分享我基于QTYX的选股框架,在实战中选股的应用案例,和大家一起见证QTYX选股框架逐步完善的过程,帮助大家更好地理解QTYX选股框架精髓。 关于QTYX的使用攻略可以查看链接:QTYX使用攻略 首先要…

C++ 面向对象(2)——继承

C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和…

【Python】异常处理 ① ( 异常概念 | 异常处理 | 异常捕获 )

文章目录 一、Python 异常简介1、异常概念2、Python 异常示例 二、Python 异常处理1、异常处理简介2、代码实例 - 出现异常代码3、代码实例 - 出现异常并进行捕获处理 一、Python 异常简介 1、异常概念 Python 异常 是在程序运行过程中发生的错误或问题的表示 ; 出现异常可能会…

【软件设计师暴击考点】面向对象考点暴击系列

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

记录好项目D12

记录好项目 你好呀,这里是我专门记录一下从某些地方收集起来的项目,对项目修改,进行添砖加瓦,变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个房屋租赁系统 一、系统介绍 包括管理员、房东、租客三种角色&#…

【小沐学数据库】MongoDB下载、安装和入门(Python)

文章目录 1、简介2、下载和安装2.1 平台支持2.2 MongoDB Community Server2.3 MongoDB Shell2.4 MongoDB Compass2.5 pymongo库 3、概念3.1 数据库3.2 文档(Document)3.3 集合(Collection)3.4 元数据3.5 数据类型 4、Python代码测试4.1 连接数据库4.2 指…

kafka基础

文章目录 1、什么是消息队列?2、基础架构3、Kafka为什么快4、零拷贝5、Rebalance机制6、kafka如何避免重复消费7、避免消息丢失8、Kafka怎么实现消息的顺序消费9、什么是ISR10、Kafka文件存储机制 1、什么是消息队列? kafka是一个消息队列的中间件&…

ProGuard混淆及R8优化

前言:使用java编写的源代码编译后生成了对于的class文件,市面上很多软件都可以对class文件进行反编译,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。…

切底掌握Android中的Kotlin DSL

前言 在这篇文章中,我们将学习如何在您的 Android 项目中编写 Kotlin DSL。 这个文章会很长,所以花点时间,让我们一起来写你的 DSL。我们将讨论以下主题, 什么是简单英语中的 DSL?您使用任何 DSL 吗?为什…

微服务的文件配置

1 基于本地文件配置的痛点 ①修改本地配置文件 需要重启服务 ②viper能监听本地配置文件变动 修改内存中变量的值 貌似可以满足需求 痛点如果实例过多 手动改极有可能出错 很多服务都依赖一个配置 运维可以写脚本批量修改 出问题运维不想背锅 ③ 多语言开发的实例 使用…

ThreadX在mdk(AC5)中的移植

1.ThreadX简介 Threadx是由 Express Logic 公司开发的一款实时操作系统(RTOS),2019年被微软收购,成为了微软的一款Azure RTOS。在2020年,ThreadX也加入了开源大军,将ThreadX内核及其各大组件开源免费。 Th…

电赛汇总(一):微控制器以其外围电路模块设计

电赛汇总(一):微控制器以其外围电路模块设计 这一章节主要详细记录各种常用的微控制器的引脚功能、外围的电路模块等,以便随时查看翻阅。这部分内容出自黄智伟等学者著的《全国大学生电子设计竞赛教程–常用电路模块制作》一书中,感兴趣的朋…

PS2022版本修复打开闪退问题

前言 windows 11 系统最近换了一台电脑,重新装了一批摄影剪辑软件,在使用过程中发现 PS2022 版本一但导入图片就卡死闪退。起初我以为是版本不兼容问题,但是问了一下对应的朋友他们并未出现这种情况。后面我就从百度中开始捞答案&#xff0c…

适用于平坦草原的近地层以上风廓线推算方法

目录 引言1 数据观测和处理1.1 观测实验和仪器1.2 数据处理 引言 本文研究平坦草原近地层之上的风廓线特征,尤其是不同稳定度情况下风随高度的变化;得到适用于本地的粗糙度、边界层高度和地转风的估测方法。 在上述研究的基础上,本文用上述…