文章主题:
🌟掌握私域数据秘密!🚀ChatGPT虽好,但难题来了?📚想要深入对话,获取专属答案?别急,这里有独门秘籍!首先,了解ChatGPT的局限性:🔍它并非万能书虫,对于特定领域的专业知识,还得你亲自“喂养”数据。一本书,就是开启私域数据之旅的理想起点!📖接下来,如何操作?👀拿起一本心爱的书籍,就像和知识对话一样,提出那些ChatGPT无法直接回答的问题。例如,关于这本书的作者、出版年份、主题分析等深入细节。它会帮你填补知识空白,形成专属于你的数据集!每一页都是一次提问的机会:📜每一次问题的提出,都是你与知识的互动,积累的是独一无二的信息库。耐心一点,你会发现ChatGPT在这些问题上的反应,就像解锁了新技能一样。别忘了记录过程:📝记得把问答过程整理下来,这是日后回顾和优化的重要素材。你的私域数据,就这样慢慢丰富起来!最后,不断迭代与扩展:📈随着你对书籍的深入理解和ChatGPT的互动,你的数据集将越来越丰满。这不仅是一本书的知识,更是你个人知识体系的一部分。掌握这个技巧,你就掌握了通往私域数据宝藏的钥匙!🔑现在就开始行动吧,让ChatGPT成为你的知识助手,而不是单纯的信息提供者!📚💪记得,保护隐私,合理使用哦!😊
(1)提取书中的内容;
(2)将书分为小块;
(3)建立语义索引;
(4)问书中的问题;
📚《纯bash圣经》原文献,一本专为Linux Bash shell编程爱好者打造的权威指南。🚀通过开源项目pure-bash-bible(🔗[https://github.com/dylanaraps/pure-bash-bible]),让我们深入探索Bash的强大与纯粹。🎓本书由业内专家精心翻译,内容全面且实战性强,无论你是初学者还是高级开发者,都能从中受益匪浅。纯bash编程的魅力无需多言,它简洁高效,是Linux运维和脚本编写者的必备工具。📚通过阅读这本书,你将掌握从基础语法到高级技巧的全方位知识,提升你的Shell技能栈。💪实践案例丰富,让你在理论与实践中不断进步。SEO优化提示:使用相关关键词如”开源bash书籍”、”纯bash编程指南”、”Linux Bash学习资源”等,并确保句子结构清晰,逻辑连贯。同时,适当加入emoji符号如`:book:`、`:rocket:`、`:graduation_cap:`, 以增加可读性和吸引力。
提取书中的内容
需要使用上一篇文章的LangChain库中和document_loaders模块。其中text_splitter库包含允许用户访问和操作来自不同来源的文本数据的函数和类。
🌟🚀PDF Text Extraction Made Easy with UnstructuredPDFLoader 🚀🌟Unlock the secrets of your PDF files effortlessly with the powerful **UnstructuredPDFLoader**! 🔍This game-changing tool is designed to streamline the process of extracting text from any PDF, just like a pro. Integrate it into your workflow by specifying the file’s location in a breeze – “xxxx.pdf” stands tall as your command center. 📝💻Experience seamless integration and lightning-fast performance, turning your PDF chaos into organized content in no time. Say goodbye to manual data extraction and hello to efficiency! 💻📈欲了解更多关于如何利用UnstructuredPDFLoader优化你的工作流程,只需轻轻一点——SEO友好的链接等待着你! 🔍🌐Remember, when it comes to PDF handling, trust the expert – UnstructuredPDFLoader is your secret weapon for digital success. 🚀💪
🌟🚀了解你的需求?别担心,我们有神器帮你!🔍🔍Unstructured Markdown Loader,这个高效能的文本提取利器,专为Markdown文件处理而来。它轻轻松松地把Markdown里的内容一网打尽,提取出你需要的信息,就像剥开坚果,文字瞬间一览无遗!💪无需担心格式混乱,无论你的Markdown文件多么“不羁”,Unstructured Markdown Loader都能轻松解析,让你的文档整洁又高效。🚀想要提升SEO优化?别忘了,它还能帮助你优化文本结构,让搜索引擎爱不释手,流量蹭蹭涨!🏆赶紧拥抱这个markdown救星,提升你的工作和学习效率,让你的文字更有力量!💪💻
… 还有一些其他加载非结构化数据的库使用。
代码如下:
loader = UnstructuredMarkdownLoader(“../docs/books/pure-bash-bible.md”
)
data = loader.load() # 加载文件数据print(fYou have {len(data)} document(s) in your data
)
print(fThere are {len(data[0].page_content)} characters in your document
)
通过以上代码可以加载您需要训练的markdown文件,打印文本中大概多少字符。
将书分为小块
我们将把加载的文档分成更小的“页面”,每个页面有500个字符,目的是在我们向OpenAI提出问题时向它提供上下文信息。与其让 OpenAI 在我们每次提出问题时都阅读整本书,不如给它一小段相关信息来处理,这样效率更高、成本效益更高。
代码如下:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=200)
docs = text_splitter.split_documents(data)
print(fNow you have {len(docs)} documents
)
现在我们已经完成了文本的准备工作,可以开始下一步了。
建立语义索引
🌟🚀为了提升文章索引的精准度,咱们得巧妙地把文档嵌入起来,这样搜索引擎就能更好地理解内容啦!咱会用到FAISS这个强大的向量库,就像一个超能力工具箱,能将书籍信息浓缩成小巧的‘关键字’,这样一来,每次只需更新这些关键词,而不是逐页重读原著哦!🔍📚向量库可不是什么新鲜事物,它就像是知识的数字化指纹,通过独特的数学算法,把每本书的内容转化为可搜索的形式。这样,无论书海多深,只要找到那个特定的‘向量’,就能快速定位到想要的信息。🚀🔍FAISS作为其中佼佼者,它专注于高效地处理海量数据,让我们的语料库扩充得又快又准,就像在知识海洋中铺设高速通道一样。这样一来,读者能更快地接触到丰富的内容,而我们也能省下宝贵的时间和精力。🎯🌐
向量库
🚀随着数字化时代的加速,非结构化数据的海洋正在汹涌膨胀,它涵盖了音频、视频、图片等丰富形式,以及用户行为、化学分子、时间序列和位置信息等诸多复杂领域。相较于传统结构化数据,这些非结构化的数据更贴近人们的需求,其描述力强大且处理挑战升级。据IDC预测,未来数据的80%将源于此!然而,我们尚未充分利用这一宝藏资源。🌟传统的非结构化数据处理路径通常依赖AI,通过深度学习模型将其转化为Vector Embedding——高维、密集的向量表示,这些信息犹如坐标系中的点,通过最近邻关系构建强大的关联网络。🚀向量数据库因此应运而生,它以索引和存储Vector Embedding为核心,为快速的相似查询提供了可能。只需轻轻一点,就能揭示隐藏在海量数据中的相似模式。🔍拥抱非结构化数据,挖掘潜在价值,是提升信息处理效率的关键一步。让我们一起探索这个数据新时代,让知识无处不在,让创新如影随形!🌍
FAISS库:是由Facebook开发的适用于稠密向量匹配的开源库,支持多种向量检索方式,包括内积、欧氏距离等,同时支持精确检索与模糊搜索。FAISS的使用是围绕着index这一对象进行的,index中包含了被索引的数据库向量以及对应的索引值。在构建 index时,需预先提供数据库中每个向量的维度d,随后通过add()的方式将被检索向量存入index中,最终通过search()接口获取与检索向量最邻近topk的距离及索引。
以下代码就是将上面拆分好的docs,建立向量库:
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
store = FAISS.from_documents(docs, embeddings)
faiss.write_index(store.index, “langchain-pure-base-bible.index”
)
store.index = None
with open(“faiss-book.pkl”, “wb”
) as f:
pickle.dump(store, f)
至此,我们已经将这本书分解成更小的文档,使用OpenAI嵌入将每个文档转换为一个向量,我们可以继续下一步,即构建实际的问答组件。
问书中的问题
建立索引后,我们就可以查询这些文档以获取我们的答案。代码如下:
// 先加载前面训练好的语义索引
index = faiss.read_index(index_name)
with open(namespace, “rb”
) as f:
docsearch = pickle.load(f)
docsearch.index = index
// 使用ChatOpenAI接口
llm = ChatOpenAI(
temperature=0, openai_api_key=OPENAI_API_KEY, verbose=True)
chain = load_qa_chain(llm, chain_type=“stuff”
)
// 调用OpenAI根据前面切割好的文档上下文回答问题
query_list = [“可以给一下shell的示例用法的代码么?”, “for循环该如何使用?”, “如何检查一个命令是否在用户的PATH中”
]
for query in
query_list:
print(“问题:”
, query)
docs = docsearch.similarity_search(query, include_metadata=True)
r = chain.run(input_documents=docs, question=query)
print(“结果:”, r.encode(utf-8).decode(utf-8
))
ChatGPT回答如下:
问题:本书中条件表达式有哪些?
结果:本书中介绍了以下条件表达式:
if-thenif-then-elseif-elif-elsecase-in-esac三元条件表达式
此外,还介绍了一些与条件表达式相关的内容,如布尔运算符、比较运算符、逻辑运算符等。
从上可以看出ChatGPT并不是直接用原文来回答,是的确将文档模型建立好,总结提炼出的回答。
到目前为止,如何问一本书的问题步骤介绍完成,我们也可以采取许多其他步骤来改进系统并使其更加有效。例如,我们可以通过在更大的问题和答案数据集上进行训练来提高系统的准确性,我们还可以在特定领域(例如,历史、科学等)上微调OpenAI模型,以提高其在与该领域相关的问题上的表现。(可以结合LangChain的介绍来做更多有趣的事情)
资料
(1)https://bennycheung.github.io/ask-a-book-questions-with-langchain-openai
(2)代码如下:
from langchain.chains.question_answering import load_qa_chain, load_summarize_chain
from langchain.chat_models import ChatOpenAI # 使用高版本的langchain
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import UnstructuredMarkdownLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import os
import faiss
import pickle
OPENAI_API_KEY = os.environ[“API_SECRET”
]
index_name = “langchain-pure-base-bible.index”namespace = “faiss-book.pkl”
def isExistTrainFile():
return
os.path.exists(index_name)
def train():
loader = UnstructuredMarkdownLoader(“../docs/books/pure-base-bible.md”
)
data = loader.load()
print(fYou have {len(data)} document(s) in your data
)
print(fThere are {len(data[0].page_content)} characters in your document
)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(data)
print(fNow you have {len(docs)} documents
)
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
store = FAISS.from_documents(docs, embeddings)
faiss.write_index(store.index, index_name)
store.index = None
with open(namespace, “wb”
) as f:
pickle.dump(store, f)
def runPrompt():
index = faiss.read_index(index_name)
with open(namespace, “rb”
) as f:
docsearch = pickle.load(f)
docsearch.index = index
llm = ChatOpenAI(
temperature=0, openai_api_key=OPENAI_API_KEY, verbose=True)
chain = load_qa_chain(llm, chain_type=“stuff”
)
query_list = [“可以给一下shell的示例用法的代码么?”, “for循环该如何使用?”, “如何检查一个命令是否在用户的PATH中”
]
for query in
query_list:
print(“问题:”
, query)
docs = docsearch.similarity_search(query, include_metadata=True)
r = chain.run(input_documents=docs, question=query)
print(“结果:”, r.encode(utf-8).decode(utf-8
))
if __name__ == “__main__”
:
if
not isExistTrainFile():
train()
runPrompt()
AI时代,掌握AI大模型第一手资讯!AI时代不落人后!
免费ChatGPT问答,办公、写作、生活好得力助手!
扫码右边公众号,驾驭AI生产力!