LangChain 基于 ChatGPT 构建本地知识库问答应用

一、使用本地知识库构建问答应用

上篇文章基于 LangChainPrompts 提示管理构建特定领域模型,如果看过应该可以感觉出来 ChatGPT 还是非常强大的,但是对于一些特有领域的内容让 GPT 回答的话还是有些吃力的,比如让 ChatGPT 介绍下什么是 LangChain

from langchain.llms import OpenAI
import osopenai_api_key=os.environ["OPENAI_API_KEY"]
llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)
my_text = "介绍下 langChain "
print(llm(my_text))

在这里插入图片描述

可以看出回答的貌似不是我们想要的内容,还有在一些特定的场景下的问答,比如学校学生问答系统中,学生提问周一课程是什么?,这种直接让 GPT 回答的话也是有些吃力,那这种情况下怎么解决呢?

现在有了 LangChain 那实现起来就非常简答了:

例如:现有知识内容放在了 data 目录下,有如下内容:

在这里插入图片描述
其中 txt 文件记录了 LangChain 的介绍:

在这里插入图片描述
pdf 介绍了下 langchain 中的 Prompts

在这里插入图片描述
csv 记录的学生课程信息:

在这里插入图片描述

下面首先对知识内容进行载入和向量化。

3.1 文本载入及 Embedding 向量持久化

import os
# 向量数据库
from langchain.vectorstores import Chroma
# 文档加载器
from langchain.document_loaders import TextLoader, CSVLoader, PyPDFLoader
# 文本转换为向量的嵌入引擎
from langchain.embeddings.openai import OpenAIEmbeddings
# 文本拆分
from langchain.text_splitter import RecursiveCharacterTextSplitteropenai_api_key = os.environ["OPENAI_API_KEY"]knowledge_base_dir = "./data"doc = []
for item in os.listdir(knowledge_base_dir):if item.endswith("txt"):loader = TextLoader(file_path=os.path.join(knowledge_base_dir, item), encoding="utf-8")doc.append(loader.load())elif item.endswith("csv"):loader = CSVLoader(file_path=os.path.join(knowledge_base_dir, item), encoding="utf-8")doc.append(loader.load())elif item.endswith("pdf"):loader = PyPDFLoader(file_path=os.path.join(knowledge_base_dir, item))doc.append(loader.load())print("提取文本量:", len(doc))
# 拆分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=400)
docs = []
for d in doc:docs.append(text_splitter.split_documents(d))print("拆分文档数:", len(docs))
# 准备嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
# 向量化
# 会对 OpenAI 进行 API 调用
vectordb = Chroma(embedding_function=embeddings, persist_directory="./cut")
for d in docs:vectordb.add_documents(d)
# 持久化
vectordb.persist()

运行后可以在 ./cut 看到持久化的向量内容:

在这里插入图片描述

3.2 构建问答

from langchain import OpenAI
# 向量数据库
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 文本转换为向量嵌入引擎
from langchain.embeddings.openai import OpenAIEmbeddings
import osopenai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(temperature=0, openai_api_key=openai_api_key)# 准备好你的嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)vectordb = Chroma(embedding_function=embeddings, persist_directory="./cut")
# 创建您的检索引擎
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectordb.as_retriever())query = "介绍下什么是 langchain?"
res = qa.run(query)
print('问题:', query, 'LLM回答:', res)query = "介绍下 langchain 中的 prompts ?"
res = qa.run(query)
print('问题:', query, 'LLM回答:', res)query = "周一需要上什么课?"
res = qa.run(query)
print('问题:', query, 'LLM回答:', res)query = "周三上午需要上什么课?"
res = qa.run(query)
print('问题:', query, 'LLM回答:', res)

在这里插入图片描述
可以看出已经精准的做出回答。

正常我们使用 ChatGPT 的时候都是以流的形式进行返回,同样这里我们也可以修改为流的形式:

from langchain import OpenAI
# 向量数据库
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 文本转换为向量的嵌入引擎
from langchain.embeddings.openai import OpenAIEmbeddings
# 流式回调
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
import osopenai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(temperature=0, openai_api_key=openai_api_key, streaming=True, callbacks=[StreamingStdOutCallbackHandler()])# 嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)vectordb = Chroma(embedding_function=embeddings, persist_directory="./cut")
# 创建您的检索引擎
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectordb.as_retriever())query = "介绍下什么是 langchain?"
qa.run(query)

在这里插入图片描述

下面配合 tornado 高性能异步非阻塞web框架,实现接口调用问答。

二、部署 WEB 服务

安装 tornado 框架:

pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple

创建问答服务接口 server.py

from tornado.concurrent import run_on_executor
from tornado.web import RequestHandler
import tornado.gen
import utils_response
from langchain import OpenAI
# 向量数据库
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 文本转换为向量的嵌入引擎
from langchain.embeddings.openai import OpenAIEmbeddings
import osclass QA(RequestHandler):# 准备模型openai_api_key = os.environ["OPENAI_API_KEY"]llm = OpenAI(temperature=0, openai_api_key=openai_api_key)# 准备好你的嵌入引擎embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)vectordb = Chroma(embedding_function=embeddings, persist_directory="./cut")# 检索引擎qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectordb.as_retriever())print("检索引擎已加载!")def prepare(self):self.executor = self.application.pool@tornado.gen.coroutinedef get(self):questions = self.get_query_argument('questions')if not questions or questions == '':return utils_response.fail(message='问题为空')result = yield self.detection(questions)self.write(result)@run_on_executordef detection(self, questions):# 开始检测res = self.qa.run(questions)return utils_response.ok(res)

路由配置,并启动服务 app.py

import tornado.web
import tornado.ioloop
import tornado.httpserver
import os
from concurrent.futures.thread import ThreadPoolExecutor
from server import QA## 配置
class Config():port = 8081base_path = os.path.dirname(__file__)settings = {# "debug":True,# "autore load":True,"static_path": os.path.join(base_path, "resources/static"),"template_path": os.path.join(base_path, "resources/templates"),"autoescape": None}# 路由
class Application(tornado.web.Application):def __init__(self):handlers = [("/qa", QA),("/(.*)$", tornado.web.StaticFileHandler, {"path": os.path.join(Config.base_path, "resources/static"),"default_filename": "index.html"})]super(Application, self).__init__(handlers, **Config.settings)self.pool = ThreadPoolExecutor(10)if __name__ == '__main__':app = Application()httpserver = tornado.httpserver.HTTPServer(app)httpserver.listen(Config.port)print("start success", "prot = ", Config.port)print("http://localhost:" + str(Config.port) + "/")tornado.ioloop.IOLoop.current().start()

在这里插入图片描述
下面使用 PostMan 进行测试:

在这里插入图片描述
已经成功获取到答案。

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

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

相关文章

你想知道ChatGPT针对JAVA技术趋势等问题的答案不?

今天终于试了一下最近非常火的ChatGPT,针对JAVA技术趋势等问题与ChatGPT进行了沟通,感觉还挺好玩的,如同和一个人正常交流一样,问题的答案虽然不是很精准,但还算是正确的。 让人吃惊的是:ChatGPT 竟然都知道@EnumValue怎么使用 使用界面 问题及回复 问题: JAVA技术趋势…

吴恩达ChatGPT《Prompt Engineering》笔记

1. 课程介绍 1.1 ChatGPT 相关术语 LLM:Large Language Model,大语言模型 Instruction Tuned LLM:经过指令微调的大语言模型 Prompt:提示词 RLHF:Reinforcement Learning from Human Feedback,人类反馈…

ChatGPT 最佳实践指南之:使用外部工具

Use external tools 使用外部工具 Compensate for the weaknesses of GPTs by feeding them the outputs of other tools. For example, a text retrieval system can tell GPTs about relevant documents. A code execution engine can help GPTs do math and run code. If a …

《ChatGPT实用指南》(精编版)重磅发布,全网免费分享,快上车,别掉队

文 / 高扬(微信公众号:量子论) 据上次3月18号发布的V1.8版,已经过去十天,这期间AI领域发生了很多重大变化。 因此,我们对《ChatGPT实用指南》进行了重大改版,增加了大量实用的操作和详细的讲解&…

ChatGPT对敏捷实践者的提示

作者 | Stefan Wolpers 作为Scrum实践者,如何获得更好的结果。我选择以更全面的提示为基础,用三个日常场景来呈现ChatGPT。 01、TL; DR:ChatGPT对Scrum从业人员的提示 上周,我根据《Scrum Master面试指南》中的问题,对…

ChatGPT在R语言的应用(一)

💂 个人信息:酷在前行👍 版权: 博文由【酷在前行】原创、需要转载请联系博主👀 如果博文对您有帮助,欢迎点赞、关注、收藏 订阅专栏 📋 文章目录 🐣 一、ChatGPT的简介🐤 二、ChatG…

ChatGPT能取代传统伪原创工具吗?

文章伪原创工具是一种计算机辅助写作工具,通过算法和技术实现对原有文章内容进行修改和改写,生成新的、看起来不同于原文的文章,以达到避免抄袭和提高原创性的目的。今天我们来聊聊传统伪原创工具和使用ChatGPT进行文章改写的优缺点。 一、传…

【ChatGLM-6B】清华开源的消费级显卡大语言模型,本地部署与测试

chatGLM-6B 官方代码:https://github.com/THUDM/ChatGLM-6B官方博客:https://chatglm.cn/blog论文: 2210.GLM-130B: An Open Bilingual Pre-trained Model (开源的双语预训练模型)2103.GLM: General Language Model Pr…

基于ChatGPT-API实现聊天机器人服务

1. 背景 要基于GPT自己去实现一个聊天机器人服务功能实现上其实特别简单:将上游服务过来的请求转换为GPT接口请求发出去然后直接返回或者回调给上游服务即可。但是其中的一些其他问题不知道大家有没有考虑过? 1、搞成一个大同步的实现,当并发…

拥抱ChatGPT,开启结对咨询模式!

ChatGPT刮起了一阵旋风,ChatGPT到底能做什么?做到什么程度?真的会让咨询顾问失业吗?带着这样的疑问,我费尽周折,注册了ChatGPT账号。 我先从一个大众化的话题开启了与ChatGPT的对话:如何提高软件…

IDEA 28 个天花板技巧!

往期热门文章: 1、刚入职的学弟一直埋头写代码,我却让他做这件事。。 2、年少不知编制香,错把编程当做宝。 3、程序员裸辞全职接单一个月的感触 4、ChatGPT 连夜迭代:你老婆不好使了 5、Spring中最常用的11个扩展点 IDEA 作为Java…

会用RabbitMQ延迟插件,代码量直接降一半?

点击关注公众号,Java干货及时送达👇 来源:juejin.cn/post/7173571716294115336 What is rabbitMQ ?RabbitMQ的消息模型Why use rabbitMQ ? 异步解耦削峰How to use rabbitMQ ?基操安装方式功能实现 另外的安装方式&am…

京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?太刁钻了吧!

点击关注公众号,Java干货及时送达 先说大致的结论(完整结论在文末): 在语义相同,有索引的情况下:group by和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:…

美团:这个 SQL 语句加了哪些锁?

点击关注公众号,Java干货及时送达👇 美团问数据库应该是非常多的,尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁,你会发现其他厂面试基本很少会这样考,所以很多小伙伴遇到这种问题的时候都是一脸懵逼&#…

顶级Javaer都在使用的类库,真香!

点击关注公众号,Java干货及时送达👇 来源:网络 1.日志库2.JSON解析库3.单元测试库4.通用库5.HTTP 库6.XML 解析库7.Excel 阅读库8.字节码库9.数据库连接池库10.消息库11.PDF 库12.日期和时间库13.集合库14.电子邮件 API15.HTML 解析库16.密码…

让ChatGPT长“手”!Meta爆火新论文,让语言模型学会自主使用工具

鱼羊 Pine 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT爆火,Meta也坐不住了。 微软和谷歌正在搜索引擎那边刺刀拼刺刀呢,谁想Meta冷不防抛出一篇新论文,顿时吸引全场目光: 瞄准ChatGPT的“软肋”,让大语言模型自行学会…

OpenAI 何以掀翻 Google 布局多年的AI大棋?

来源: 飞哥说AI 作者|高佳 创意|李志飞 任何大卫击败歌利亚的故事, 都值得我们重新思考。 2023年从一场巨头之间的巨额合作开始,一场汹涌已久的AI暗战摆上了台面。 随着微软和 OpenAI 融资的推进,双方…

AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略

AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略 解读:在2022年11月横空出世的ChatGPT,打遍天下无敌手的时候,就知道会有这么一天,知…

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用

文章目录 前言一、准确性提升1.创造力2.视觉输入3.更长的上下文 二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。 三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的…

ChatGPT五分钟写完插件,功能完善,还可加需求改BUG

开发者(KaiFaX) 面向全栈工程师的开发者 专注于前端、Java/Python/Go/PHP的技术社区 詹士 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT写代码,水平究竟如何? 不到5分钟,做出一个WordPress(一款内容管理系统…