基于langchain 的文档问答 最佳实践(附源码)

文档问答的原理

  1. 文档读取并切割,用句向量 向量化,存入向量数据库
  2. 问题向量化,在向量数据库中进行相似性检索,并存出top K
  3. 把问题和top K 答案组成 prompt 并发给大模型,等大模型答案

文档问答流程图

这里面涉及到的技术点有:

  • 文档加载和切分
  • 句向量
  • 向量存储
  • 向量相似度计算
  • promot 生成
  • 大模型(LLM)

langchain 把这些技术都整合到一起,让我们可以方便的搭建自己的应用。

文档问答的原型搭建

网上有很多demo ,最简单的是用llama-index,openai,gradio 进行搭建

llama-index 是基于文件的向量数据库,gradio 是web 服务器,实现了基本的ui页面,还可以提供域名服务。句向量和大模型用的openai.

这种demo 需要一台服务器,能连上openai. langchain 的安装有也些bug. 现在还是0.5的版本。 我在window2012 上安装,用miniconda, 和 visual studio,langchain 中有些c++的代码编译需要

这种应用搭demo 还可以的,但是在生产环境是不可行

  • 很费钱。使用openai 的2个服务,embedding, gpt-3.5-turbo, 我训练了3篇doc 文档,就花了0.4$.
  • 使用llama-index 并不是数据库,它是文件存储。检索速度慢很多。

下面我基于demo 进行了改进

  • 句向量 使用 HuggingFace ‘m3e-base’,这是目前测试效果不错的句向量模型,不需要GPU 也可以跑。
  • 向量数据库选用了Annoy,它是Facebook 推出的向量数据库,基于 k 树算法进行检索。
标题demo改进
句向量openai embeddingHuggingFace ‘m3e-base’
大模型openai gpt-3.5-turbogpt-3.5-turbo
向量数据库llama_indexAnnoy
import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Annoy
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI, VectorDBQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA
from langchain.indexes import VectorstoreIndexCreator
import time
from langchain import PromptTemplate
from langchain.embeddings import HuggingFaceEmbeddings,HuggingFaceInstructEmbeddings
# openAI的Key
os.environ["OPENAI_API_KEY"] = 'xxxx'def create_index(path):loader = DirectoryLoader('D:/download/', glob='**/*.docx')documents = loader.load()text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)split_docs = text_splitter.split_documents(documents)embeddings = HuggingFaceEmbeddings(model_name='moka-ai/m3e-base')vector_store_path = r"./storage4"docsearch = Annoy.from_documents(documents=split_docs,embedding=embeddings,persist_directory=vector_store_path)docsearch.save_local(vector_store_path)def search(txt):embeddings = HuggingFaceEmbeddings(model_name='moka-ai/m3e-base')vector_store_path = r"./storage4"docsearch = Annoy.load_local(vector_store_path,embeddings=embeddings)start = time.time()prompt_template = """请注意:请谨慎评估query与提示的Context信息的相关性,只根据本段输入文字信息的内容进行回答,如果query与提供的材料无关,请回答"对不起,我不知道",另外也不要回答无关答案:Context: {context}Question: {question}Answer:"""PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])# qa = VectorDBQA.from_chain_type(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo-16k"), chain_type="stuff", vectorstore=docsearch, return_source_documents=True)# result = qa({"query": txt})qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo"), chain_type="stuff", retriever=docsearch.as_retriever(search_kwargs={"k": 8}),chain_type_kwargs={"prompt": PROMPT})result = qa.run(txt)print(result)print(time.time() - start)if __name__=="__main__":create_index('')search('xxx')

优化

  • 文档的切分

    文档切分对句向量的生成有很大影响。最理想的效果把相拟的段落切到一起,想实现这样的效果需要对文档内容比较了解,进而切分。

    使用默认的 langchain CharacterTextSplitter chunk_size = 1000,这种切分的效果不是很好。它的分割符是 \n\n,先按chunk 切,再按分割符切。这样会把段落切错。

  • 大模型的选型

    使用openai gpt-3.5-turbo 它是有字数限制,4096个字符,top K选出的答案多了,它都答不上来。可以换用 gpt-3.5-turbo-16k, 它有16k个字符,大大的满足冲破答的需要。

    换用国产大模型,如chatGLM, 它有6B 的小模型,单张GPU上就可以跑。这样也不用国外服务器。

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

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

相关文章

chatgpt赋能python:Python为什么闪退?

Python为什么闪退? Python作为一种高级编程语言,已经赢得了世界各地许多开发者的青睐。但是,有时候Python会因为各种原因而突然闪退,给开发者带来极大的困扰。那么,Python为什么会闪退呢? 1. 内存泄漏 内…

Trexquant | 量化多岗位招聘(全职+实习)

量化投资与机器学习微信公众号,是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业30W关注者。 具体投递方式 投递邮箱 tqchina_resumetrexquant.com 简历命名 岗位-姓名…

京东各大城市内推岗位(2021.2.7更)

北京: 上海: 广东: 四川: 重庆: 暂无 杭州: 暂无 陕西: 湖北: 湖南: 暂无 岗位每周更新一次 因为内推系统只能以省份维度查看,想了解具体城市和岗…

北京内推 | 京东营销与商业化中心招聘NLP算法工程师/实习生

合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 京东 京东营销与商业化中心(原商提广告部)成立于2014年初&#xff0…

【CSDN雇主招聘】深信服科技带着高薪岗位JD和公司周边来啦

为了帮助企业更好的应对用人难的挑战,CSDN面向所有企业全新升级了CSDN2022雇主品牌计划,在企业发展、吸引人才、连接人才、宣传公司多个维度提供专属的支持。 ————本次为深信服科技专场———— 直播主题:《CSDN雇主品牌-深信服招聘专场…

【名企招聘】4月20日19点,Thoughtworks专场招聘,众多岗位JD解读,总有适合你的岗位~

为了帮助企业更好的应对用人难的挑战,CSDN面向所有企业全新升级了CSDN2022雇主品牌计划,在企业发展、吸引人才、连接人才、宣传公司多个维度提供专属的支持。 ————本次为Thoughtworks专场———— 直播主题:《CSDN雇主品牌-Thoughtwork…

WhatsApp 群组营销分析

一、WhatsApp基本介绍。 1、创建特点。 whatsapp是一款国际应用,他允许用户自由创建群组,拉人进群。用户可以设置群组隐私来防止陌生人的广告骚扰。 2、成员分类。 群组的人员上限为257。成员分为三类群主、管理员和普通成员。三者的权利依次减小。群…

邮件营销有效吗?分享几个实用的电子邮件营销策略和技巧!

(一)什么是电子邮件营销,它从什么时候开始的? 1971 年,Ray Tomlinson根据来源发送了世界上第一封电子邮件,标志着现代通信时代的开始。这条信息没什么特别的,一串数字和字母,看起来…

element日历(Calendar)排班

修改展示 父组件内容 <template><!--排班管理--><div class"dutySchedule"><div class"dutySchedule-calendar"><el-calendar v-model"priceTime"><template slot"dateCell" slot-scope"{d…

Clickhouse 生成日历表

运行环境&#xff1a; SELECT version()Query id: 90d74a1e-3ce1-42b4-8b66-bd09802310c4┌─version()─┐ │ 20.12.3.3 │ └───────────┘1 rows in set. Elapsed: 0.002 sec.clickhouse的 date和datetime的时间范围目前只支持 [1970-01-01 00:00:00, 2105-12-…

邮件营销EDM(Email Direct Marketing) 运营笔记

我是2018年毕业后接触邮件营销&#xff0c;国内和国外的邮件营销都接触过。从最初和公司爬虫团队合作扩张性开发客户到现在的客户精细化运营&#xff0c;期间遇到过邮件营销各种各样的问题。好像发mass mail 被投诉垃圾邮件平台被封&#xff0c;送达打开率不正常&#xff0c;邮…

Tips系列之飞书日历

最近收到很多小伙伴的问题,咨询飞书日历如何使用,今天就给大家呈上几个小Tips,让你更全面的了解飞书日历! 👉免费使用​ 飞书官网 1、订阅日历 你可以订阅同事的日历,查看对方的忙闲状态,省去反复沟通的麻烦,快速找到空闲时间并邀约会议。 如何订阅日历方法一:在日…

使用日历丰富产品的用户体验

前言 经过一段时间的梳理和遴选&#xff0c;我挑选出了Android知识图谱中重要的部分&#xff0c;制作了一张脑图。读者朋友们可按照脑图查漏补缺了&#xff0c; 图片尺寸较大&#xff0c;仅附链接 。 当然&#xff0c;这是我按照自己的判断、结合参考其他博主的观点进行的挑选…

2023 热点营销日历:179 个重要节日 + 46 个关键事件 + 12 个经典案例

又是一年初始时&#xff0c;为大家准备了一份全年营销日历&#xff0c;速速领取收藏哟&#xff5e; 一月营销热点 营销话题&#xff1a;元旦、春节、春运、年味、团圆、旅游、FLAG…… 2023 开年注定是特殊的一年。三年消费欲望在这个春节集中释放&#xff0c;在外漂泊的游子踏…

likewen的救赎之路

likewen的救赎之路 标准化救赎之路,只针对本人 文章目录 likewen的救赎之路java的八股文算法操作系统&计算机网络企业开发基础mysqlspring系列spring5springbootspringcloud linux前端**设计模式**缓存redis 消息队列nginx?Netty**微服务**docker认识一下常用的类库测试其…

大会议题重磅出炉,豪华阵容等你面基!RustChinaConf 2023!【附第一天议程】

本次大会议题品质一流&#xff0c;嘉宾多来自行业一线&#xff0c;干货多多&#xff0c;且在各领域遍地开花&#xff0c;可看出Rust星星之火在中国已成燎原之势&#xff01; 大会时间地址 6.17 - 6.18 浦东新区张杨路777号 上海锦江汤臣洲际酒店 官网地址 https://rustcc.cn/20…

张俊林:大语言模型带来的交互方式变革

来自&#xff1a;机器之心 演讲&#xff1a;张俊林 进NLP群—>加入大模型与NLP交流群 7 月 8 日&#xff0c;在机器之心举办的 2023 WAIC AI 开发者论坛上&#xff0c;新浪微博新技术研发负责人张俊林先生发表了主题演讲《自然语言交互&#xff1a;大语言模型带来的交互方式…

Hyper-v的客户端连接工具VMConnect

我们在玩Hyper-v的时候&#xff0c;一般也是走走套路&#xff0c;创建个虚拟机&#xff0c;中间可能会因为到底要给这台虚拟机分配多少内存多大硬盘作一番思想半争&#xff0c;因为内存不多了&#xff0c;硬盘不够了&#xff0c;然后&#xff0c;就是连接虚拟机&#xff0c;启动…

vmware 虚拟机nat连接,局域网访问

vmware nat设置可以让虚拟机联网&#xff0c;这是比较常接触的用法。网上很多教程。 联网成功后想让局域网内别的机器访问&#xff0c;就需要绕个弯。nat的方式仅仅只是让你的虚拟机在你的机器上&#xff0c;通过你的网卡转发&#xff0c;才能访问网络。也就是说&#xff0c;你…

两台虚拟机实现tcp连接(使用telnet)

两台虚拟机实现tcp连接&#xff08;使用telnet&#xff09; 今天做实验&#xff0c;为了实现两台winxp虚拟机之间建立tcp连接&#xff0c;使用了系统的telnet服务。 首先&#xff0c;两台虚拟机都需开启telnet服务。 在控制面板 —管理工具 —服务 —telnet 将telnet的启动类型…