手搓GPT系列之 - chatgpt + langchain 实现一个书本解读机器人

这篇具有很好参考价值的文章主要介绍了手搓GPT系列之 - chatgpt + langchain 实现一个书本解读机器人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ChatGPT已经威名远播,关于如何使用大模型来构建应用还处于十分前期的探索阶段。各种基于大模型的应用技术也层出不穷。本文将给大家介绍一款基于大模型的应用框架:langchain。langchain集成了做一个基于大模型应用所需的一切。熟悉java web应用的同学们应该十分熟悉spring boot框架,我们可以说langchain 就是大语言模型应用方面的spring boot。本文将为大语言模型应用的开发者们提供一个基于langchain的示例项目,便于大家进一步提升prompt engineering的效能。

1. 这个demo实现了一个什么需求

本示例项目将实现一个机器人,这个机器人会从指定路径读取电子书内容(格式为epub),并根据所读取的书本内容回答用户问题。即题目中所说的书本解读机器人。

2. 准备开发环境

  • 安装python 3.8以上,目前的最新版本是3.11。

  • 本例采用jupyter-lab作为开发环境,因此需要在电脑上安装jupyter-lab。

  • 注册openai账户,并设置OPENAI_API_KEY环境变量。

  • 我们使用redis来保存所加载的书本的内容,因此需要部署一个redis服务。不同于我们平时一般web应用使用的redis服务,我们这次需要安装redis-stack:

    docker run -d -p 13333:8001 -p 10001:6379 redis/redis-stack:latest
    
  • 然后安装相关的python依赖包

    pip install openai
    pip install langchain
    pip install redis
    pip install unstructured
    
  • 安装pandoc,加载epub电子书要用 。

  • 准备电子书的内容,在项目目录下(即你的ipynb文件同一目录下)建立resources/epub目录,把epub格式的电子书放在该目录下。为了方便大家使用,笔者为大家准备了示例中用到的电子书资源,大家可以下载使用。

3. import所需的包

import requests
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.redis import Redis
from langchain.document_loaders import TextLoader
from langchain.docstore.document import Document
from langchain.document_loaders import UnstructuredEPubLoader
import os
from langchain import OpenAI, VectorDBQA
from langchain.agents.agent_toolkits import (
   create_vectorstore_agent,
   VectorStoreToolkit,
   VectorStoreRouterToolkit,
   VectorStoreInfo,
)

4. 加载epub书内容

列出resources/epub目录下的所有电子书,然后把所有电子书读取到documents的字典中。请注意下方的代码,我们只保留category = NarrativeText的文本,其他文本类型包括:Title, UncategorizedText, ListItem等。

dir = 'resources/epub'
fs = os.listdir(dir)
data={}
documents={}
for f in fs:
    path = dir + '/' + f
    if (os.path.isfile(path)):
        print(path)
        loader = UnstructuredEPubLoader(path,mode='elements')
        data[f]=loader.load()

for book in data.keys():
    documents[book]=[]
    for seg in data[book]:
        cat = seg.metadata['category']
        if cat == 'NarrativeText':
            documents[book].append(seg)
resources/epub/California - Sara Benson.epub
resources/epub/LP_台湾_en.epub

5. 把数据以word vector的格式存入redis数据库。

为每本书建立一个index。以书名作为index的名称。

redis_url='redis://localhost:10001'
embeddings=OpenAIEmbeddings()
for book in documents.keys():
    rds = Redis.from_documents(documents[book],embeddings,redis_url=redis_url,index_name=book)

6. 尝试做一次最相似查询

rds = Redis.from_existing_index(embeddings, redis_url=redis_url, index_name='LP_台湾_en.epub')
query = '台湾日月潭'
rds.similarity_search(query)
[Document(page_content='鯉魚潭;\r\nLǐyú Tán), a pretty willow-lined pond with a lush green mountain\r\nbackdrop, you’ll find hot springs', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'}),
 Document(page_content='(明月溫泉 Míngyuè Wēnquán;  2661 7678; www.fullmoonspa.net; 1 Lane\r\n85, Wulai St; unlimited time public pools NT$490) One of\r\nthe more stylish hotels along the tourist street, Full Moon has mixed\r\nand nude segregated pools with nice views over the Tongshi River. Its\r\nprivate rooms feature wooden tubs. The hotel also offers rooms for\r\novernight stays from NT$2700. Go for the lower cheaper rooms as the\r\nviews are surprisingly better than higher up.', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'}),
 Document(page_content='7 Sun Moon Lake (Click\r\nhere) is the largest body of water in Taiwan and boasts a\r\nwatercolour background ever changing with the season and light. Although\r\nthe area is packed with Chinese tourists these days it’s still\r\nremarkably easy to get away from the crowds on the many trails and\r\ncycling paths. Loop down to the old train depot at Checheng to explore\r\n1950s Taiwan, or head to Shuili to see the last working snake kiln. No\r\nmatter what, don’t miss the region’s high-mountain oolong tea: it’s some\r\nof the finest in the world.', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'}),
 Document(page_content='(鯉魚潭露營區 Lǐyú Tán Lùyíng qū;  03-865 5678; per site NT$800) The\r\ncampground is 1km south of the lake off Hwy 9 and features showers,\r\nbarbecue areas and covered sites.', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'})]

5. 创建一个vector_store_agent

使用VectorStoreRouterToolkit可以将多本书一起作为输入,根据用户的问题切换到最合适的书。另一个可以选的toolkit叫VectorStoreToolkit(vectorstore_info=vectorstore_info)。这个toolkit的使用思路时把多本书存在一个index下,机器人会综合所有书的相关内容做出解答,另外如果用户要求提供来源,机器人会提取metadata里的’source’字段并回复。

llm = OpenAI(temperature=0)
rdss = {}
infos=[]
for book in documents.keys():
    rdss[book] = Redis.from_existing_index(embeddings, redis_url=redis_url, index_name=book)
    vectorstore_info = VectorStoreInfo(
        name="hotest_travel_advice_about_"+ book,
        description="the best travel advice about " + book,
        vectorstore=rdss[book]
    )
    infos.append(vectorstore_info)

#使用VectorStoreRouterToolkit可以将多本书一起作为输入,根据用户的问题切换到最合适的书。
toolkit = VectorStoreRouterToolkit(vectorstores=infos, llm=llm)
agent_executor = create_vectorstore_agent(
    llm=llm,
    toolkit=toolkit,
    verbose=True)

6. 此时我们可以查看一下prompt到底长什么样子

print(agent_executor.agent.llm_chain.prompt)
input_variables=['input', 'agent_scratchpad'] output_parser=None partial_variables={} template='You are an agent designed to answer questions about sets of documents.\nYou have access to tools for interacting with the documents, and the inputs to the tools are questions.\nSometimes, you will be asked to provide sources for your questions, in which case you should use the appropriate tool to do so.\nIf the question does not seem relevant to any of the tools provided, just return "I don\'t know" as the answer.\n\n\nhotest_travel_advice_about_California - Sara Benson.epub: Useful for when you need to answer questions about hotest_travel_advice_about_California - Sara Benson.epub. Whenever you need information about the best travel advice about California - Sara Benson.epub you should ALWAYS use this. Input should be a fully formed question.\nhotest_travel_advice_about_LP_台湾_en.epub: Useful for when you need to answer questions about hotest_travel_advice_about_LP_台湾_en.epub. Whenever you need information about the best travel advice about LP_台湾_en.epub you should ALWAYS use this. Input should be a fully formed question.\n\nUse the following format:\n\nQuestion: the input question you must answer\nThought: you should always think about what to do\nAction: the action to take, should be one of [hotest_travel_advice_about_California - Sara Benson.epub, hotest_travel_advice_about_LP_台湾_en.epub]\nAction Input: the input to the action\nObservation: the result of the action\n... (this Thought/Action/Action Input/Observation can repeat N times)\nThought: I now know the final answer\nFinal Answer: the final answer to the original input question\n\nBegin!\n\nQuestion: {input}\nThought:{agent_scratchpad}' template_format='f-string' validate_template=True

7. 到这里就完成了,可以问跟书本有关的问题。

清注意,机器人会根据你的问题,自动找出最相关的书本来给你作答。

resp = agent_executor.run("日月潭什么时候去旅游比较好,请用中文回答")
print(resp)
> Entering new AgentExecutor chain...
 I should use hotest_travel_advice_about_LP_台湾_en.epub to answer this question
Action: hotest_travel_advice_about_LP_台湾_en.epub
Action Input: 日月潭什么时候去旅游比较好
Observation:  The best time to visit Sun Moon Lake is during autumn and early spring (October to December and March to April). May has seasonal monsoon rains, and typhoons are a problem from June to September, though if there is no typhoon, you can certainly visit.
Thought: I now know the final answer
Final Answer: 日月潭最好的旅游时间是秋季和初春(10月到12月和3月到4月)。五月有季节性的季风雨,6月到9月有台风,但是如果没有台风,你也可以去旅游。

> Finished chain.
日月潭最好的旅游时间是秋季和初春(10月到12月和3月到4月)。五月有季节性的季风雨,6月到9月有台风,但是如果没有台风,你也可以去旅游。

最后

由于只是一个示例项目,因此本项目只是通过jupyter lab来实现,并非一个真实可以提供任何web服务的项目,其中的一些逻辑也简单化处理。例如只能读取笔者预先放置在项目工程目录下的epub格式的电子书,而不能由用户自由上传电子书并为用户提供解答服务。再例如如果连续运行两次加载电子书的操作,会在数据库中留下重复的数据,本例子中并未包含去重的逻辑。由于这个项目的主要目的是为了探讨langchain在大模型应用开发中的作用,而非巨细靡遗地实现一个可以商业化的机器人,笔者认为,增加很多处理细节的业务逻辑,会导致项目的最主要部分被很多非核心的代码掩埋,反而不利于读者对langchain建立一种清晰的认知。因此读者朋友在将本例中的代码应用于自己的项目中时,应该注意完善各种细节,以避免项目出现缺陷。

demo项目代码库

去github。文章来源地址https://www.toymoban.com/news/detail-447171.html

到了这里,关于手搓GPT系列之 - chatgpt + langchain 实现一个书本解读机器人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手搓GPT系列之 - 通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解(下篇)

    本文承接上篇上篇在此和中篇中篇在此,继续就Sepp Hochreiter 1997年的开山大作 Long Short-term Memory 中APPENDIX A.1和A.2所载的数学推导过程进行详细解读。希望可以帮助大家理解了这个推导过程,进而能顺利理解为什么那几个门的设置可以解决RNN里的梯度消失和梯度爆炸的问题。中

    2024年02月16日
    浏览(57)
  • Chatgpt论文笔记——GPT1详细解读与可运行的代码

    论文:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf 时间:2018年6月 贡献: 提出了大规模数据上无监督预训练然后在目标任务上有监督finetune的范式。 当时由于NLP领域不存在像图像领域中ImageNet那样百万级别标注的数据(并且图像的像素包含了比句子

    2024年02月11日
    浏览(39)
  • 从零手搓一个【消息队列】创建核心类, 数据库设计与实现

    创建 Spring Boot 项目, Spring Boot 2 系列版本, Java 8 , 引入 MyBatis, Lombok 依赖 提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货! 整体目录结构 : 本文主要实现 server 包 上篇文章 分析了项目需求, 介绍了项目中重要的核心概念

    2024年02月07日
    浏览(45)
  • LLMs之RAG:基于LangChain框架利用ChatGPT的API实现一个与在线网页交互的对话机器人—五大思路步骤—加载文档WebBaseLoader网址文件→文档分割(chunk_size=50

    LLMs之RAG:基于LangChain框架利用ChatGPT的API实现一个与在线网页交互的对话机器人—五大思路步骤—加载文档WebBaseLoader网址文件→文档分割(chunk_size=500)→文本嵌入化(OpenAIEmbeddings)并存储到向量库(Chroma)→构造Prompt(拉取一个对象并将其返回为 LangChain对象)→定义LLMs(ChatOpenAI)→输入

    2024年02月08日
    浏览(49)
  • 基于LangChain从零实现Auto-GPT完全指南

    LangChain是何方神圣? 远的不说,我们就拿当下火热的项目 Auto-GPT 来说,该项目集成了: 自动推理 、 联网搜索 、 LLM推理 。那么现在好了,你可能会好奇他是怎么做到的!那么告诉你 LangChain 这个框架可以帮你从零到一实现一个比 Auto-GPT 还要强大的产品! 难道你还不心动吗

    2024年02月06日
    浏览(35)
  • AIGC、ChatGPT、GPT系列?我的认识

    AIGC(AI generated content),新型内容生产方式。AIGC是利用人工智能技术来生成内容,也就是,它可以用输入数据生成相同或不同类型的内容,比如输入文字、生成文字,输入文字、生成图像等。 GPT-3是生成型的预训练变换模型,是一个自回归语言模型,神经网络包括1750亿个参

    2024年02月02日
    浏览(57)
  • ChatGPT探索系列之二:学习GPT模型系列的发展历程和原理

    ChatGPT发展到目前,其实网上已经有大量资料了,博主做个收口,会出一个ChatGPT探索系列的文章,帮助大家深入了解ChatGPT的。整个系列文章会按照一下目标来完成: 理解ChatGPT的背景和应用领域; 学习GPT模型系列的发展历程和原理; 探究ChatGPT的训练、优化和应用方法; 分析

    2023年04月23日
    浏览(42)
  • 超越 ChatGPT,GPT-4 将成为下一个“顶流”?

    出品人:Towhee 技术团队 从2022年底开始预热,智能对话机器人 ChatGPT (即 GPT 3.5)成功地又一次掀起了人工智能的热潮。除了AI 相关的从业者以外,如今 ChatGPT 已是家喻户晓。就在美国东部时间 3月14日,其所属公司 OpenAI 热打铁又推出了 GPT-4:**比 ChatGPT 更靠谱、更听话、更有

    2023年04月22日
    浏览(38)
  • 【用unity实现100个游戏之4】手搓一个网格放置功能,及装修建造种植功能(2d3d通用,附源码)

    参考原视频链接 【视频】:https://www.youtube.com/watch?v=l0emsAHIBjU 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月13日
    浏览(40)
  • GPT4All 一个开源 ChatGPT

    ChatGPT 正在迅速发展与传播,新的大型语言模型 (LLM) 正在以越来越快的速度开发。就在过去几个月,有了颠覆性的 ChatGPT 和现在的 GPT-4。明确定义,GPT 代表(Generative Pre-trained Transformer),是底层语言模型,而 ChatGPT是为会话设计的具体实现。比尔·盖茨 (Bill Gates) 回顾 OpenAI

    2023年04月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包