LangChain 实战课
黄佳
新加坡科研局首席研究员
8120 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 28 讲
结束语 & 结课测试 (2讲)
LangChain 实战课
15
15
1.0x
00:00/00:00
登录|注册

02|用LangChain快速构建基于“易速鲜花”本地知识库的智能问答系统

你好,我是黄佳,欢迎来到 LangChain 实战课!
在深入讲解 LangChain 的每一个具体组件之前,我想带着你从头完成一个很实用、很有意义的实战项目。目的就是让你直观感受一下 LangChain 作为一个基于大语言模型的应用开发框架,功能到底有多么强大。好的,现在就开始!

项目及实现框架

我们先来整体了解一下这个项目。
项目名称:“易速鲜花”内部员工知识库问答系统。
项目介绍:“易速鲜花”作为一个大型在线鲜花销售平台,有自己的业务流程和规范,也拥有针对员工的 SOP 手册。新员工入职培训时,会分享相关的信息。但是,这些信息分散于内部网和 HR 部门目录各处,有时不便查询;有时因为文档过于冗长,员工无法第一时间找到想要的内容;有时公司政策已更新,但是员工手头的文档还是旧版内容。
基于上述需求,我们将开发一套基于各种内部知识手册的 “Doc-QA” 系统。这个系统将充分利用 LangChain 框架,处理从员工手册中产生的各种问题。这个问答系统能够理解员工的问题,并基于最新的员工手册,给出精准的答案。
开发框架:下面这张图片描述了通过 LangChain 框架实现一个知识库文档系统的整体框架。
基于数据源的文档问答系统开发框架
整个框架分为这样三个部分。
数据源(Data Sources):数据可以有很多种,包括 PDF 在内的非结构化的数据(Unstructured Data)、SQL 在内的结构化的数据(Structured Data),以及 Python、Java 之类的代码(Code)。在这个示例中,我们聚焦于对非结构化数据的处理。
大模型应用(Application,即 LLM App):以大模型为逻辑引擎,生成我们所需要的回答。
用例(Use-Cases):大模型生成的回答可以构建出 QA/ 聊天机器人等系统。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

LangChain是一个基于大语言模型的应用开发框架,旨在构建智能问答系统,解决“易速鲜花”内部员工知识库的问题。该系统利用LangChain框架处理员工手册中的问题,并提供精准答案。文章介绍了如何利用LangChain快速构建智能问答系统,包括文档加载器、文本分割器和向量数据库等工具的使用。通过向量数据库存储和信息提取,实现了文档到问答系统的完整流程。文章还详细介绍了向量数据库的存储和检索方法,以及欧氏距离和余弦相似度的应用。最后,通过创建RetrievalQA链,展示了如何生成并展示系统用户的具体问题的答案。整体而言,本文通过介绍LangChain框架的功能和应用,为读者提供了构建智能问答系统的技术指南。 文章还展示了问答系统的UI实现,使用Flask框架构建了一个网页,用户可以在网页上输入问题并获取系统生成的答案。通过展示实际代码和HTML网页的关键部分,读者可以了解系统的交互方式和界面设计。此外,文章还提出了思考题,引导读者对基于文档的QA系统的实现流程、LangChain支持的向量数据库和大语言模型进行思考和讨论。 总的来说,本文通过具体示例和技术讨论,向读者展示了LangChain框架的强大功能和应用前景,为开发智能问答系统的技术人员提供了有益的参考和启发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《LangChain 实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(51)

  • 最新
  • 精选
  • shatu
    学习小结: 排坑点: 1.文本分割默认采用“utf-8”,中文字符会出错,改为“gbk”后解决 问题点: 1.MultiQueryRetriever在代码中的意义是什么? 2.Langchain中不同Retrievers应该如何选择? 3.对于中文而言,如何判断不同文本分割方法的效果差异?

    作者回复: shatu兄弟来啦。一年多前,你在《零基础实战机器学习》专栏中给我留言,解决了matplotlib绘图无法显示中文和负号的问题。我把那个方案写进了《数据分析咖哥十话》书里面了,序言中我同时也感谢了你。 ------------------------------------------- https://time.geekbang.org/column/article/414504 2.matplotlib作图标签产生乱码的解决方案 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 ------------------------------------------- 这里,谢谢你的再次分享。 对于几个问题: 1.MultiQueryRetriever在代码中的意义是什么? MultiQueryRetriever - 这是LangChain中的检索器之一。它的特点使用语言模型从不同的视角为给定的用户输入查询生成多个查询。然后使用这些查询来检索一组相关文档。—— 这是一种常见策略。 2.Langchain中不同Retrievers应该如何选择?—— Langchain中Retriever很多,MultiQueryRetriever、VectorRetriever和KeywordRetriever等等。详见第15课。 不同的Retrievers在Langchain中有不同的选择方式。选择Retriever的方法取决于您的需求和数据类型。 如果数据是基于向量的,可以选择使用VectorRetriever。VectorRetriever使用向量数据库进行检索,并根据查询向量找到最相似的文档。可以使用不同的嵌入模型(如OpenAIEmbeddings)来构建向量数据库,并使用VectorRetriever进行检索。 如果数据是基于关键词的,可以选择使用KeywordRetriever。KeywordRetriever使用关键词匹配的方法进行检索。可以将关键词与文档进行关联,并使用KeywordRetriever根据关键词进行检索。 如果希望自动生成多个查询并获取更丰富的结果,可以选择使用MultiQueryRetriever。MultiQueryRetriever使用语言模型生成多个查询,并根据这些查询检索相关文档。MultiQueryRetriever生成多个查询的不同视角,以获取更多潜在相关的文档。 3.对于中文而言,如何判断不同文本分割方法的效果差异? --- 似乎没有一定之规,你可以试试记住方法,打印出来分割结果看一看。可能按照句子或者段落分吧。或者一个语义块分成一片(类似与段落)。

    2023-09-20归属地:北京
    3
    14
  • Geek_ebb87d
    其实不仅图片,文档中如果有表格,处理问答的效果也不好,表格方面老师是否有思路?

    作者回复: 补充内容:随着LangChain文档的发展,有了一些读表策略,包括使用Unstrutured 库 摘出表格 等等 包括多模态的一些处理。 https://github.com/langchain-ai/langchain/blob/master/cookbook/Semi_Structured_RAG.ipynb 这些新内容,值得总结成一个新专栏!!!我要发奋学习了。 的确,这是一个挑战。难度在于表格通常包含结构化信息,与传统的连续文本表示方式不同。 那么,我们可以这么的做一些尝试哈: 第一个是表格数据的预处理:将表格数据转换为连续文本描述。例如,一个表格中的条目"姓名: 张三, 年龄: 25"可以被转化为"张三的年龄是25岁"。这样就将表格内容转换为模型更容易理解的格式。 第二个思路是融合一些专门基于表格数据而训练的大模型框架,比如说PyTorch Tabular或者TabNet,参考: https://paperswithcode.com/paper/pytorch-tabular-a-framework-for-deep-learning https://paperswithcode.com/method/tabnet 第三个思路,是否可以结合知识图谱。知识图谱是表示知识的图形结构。通过将表格数据转换为知识图谱中的实体和关系,是否可以使用图神经网络或其他技术来查询和处理数据。---- 视你的具体表格是什么表格而定。 第4个思路:在RAG系统中,增强检索组件的能力以更好地检索表格数据。这可能涉及开发针对表格结构的特定检索策略。——比如说生成索引时,加入一些Meta data。 总而言之,我感觉如果你的表格直接嵌入后效果不好的话,考虑需要对表格数据做一些特征工程,再嵌入或者存储。

    2023-09-16归属地:四川
    3
    14
  • iLeGeND
    老师能不能提供一下文章中代码完整源码

    作者回复: 有!同学去我的github, https://github.com/huangjia2019 , 找LangChain,我会把代码逐步都上传。

    2023-09-11归属地:北京
    9
  • Geek_439927
    老师,我想通过Langchain +开源大模型搭建一个私有化的知识库GPT,文件内容是文字+图片,图片的内容没有文字,你可以想象成这个文件是一个系统操作手册,手册里面有一些文字描述,以及一步一步地操作截图,这种格式的文档可行吗,在LLM给出的回答中,希望能够显示这些图片

    作者回复: 同学,谢谢你提出的好问题。 LangChain中是有文件检索这个模块的。你的系统操作手册中的文本部分可以被LangChain载入,进行Chunk,然后用大模型Embedding后存入向量数据库。后面你可以检索它们。 但是,LangChain或者说文本类大模型目前还不支持多模态的功能,还不能读图,此处,你需要在你的应用中引入多模态的大模型,比如类似与CLIP这种图文模型(https://github.com/openai/CLIP - 图文对比学习方法),想办法把图文的索引链接起来。然后,在能够利用LangChain,在查询到文档时,把相关的图也同时显示出来。 要完成你的需求,不是一件很轻松的工作,希望你能够把它弄出来,然后跟大家分享更具体地细节。

    2023-09-12归属地:上海
    2
    7
  • iLeGeND
    深入浅出,相当清晰

    作者回复: 谢谢同学鼓励,也希望大家多多分享自己使用时发现的用例。

    2023-09-11归属地:北京
    4
  • 阿斯蒂芬
    跟着老师代码敲一遍,解决过程中遇到的问题,成功run起来之后,还是小有成就感的😎

    作者回复: 哈哈,这肿么能是小有成就感呢!这是大有成就感。 本课代码,每个小朋友都应该亲手跑一遍。 😁 😆 😅 😂 🤣

    2023-09-14归属地:广东
    2
    3
  • Realm
    这里切割文本,生成的向量数据库,保存在内存中吗?

    作者回复: 具体情况具体分析,目前我们是把它保存在内存中的,因为这样检索起来比较快。当然你也完全可以将向量数据存储在磁盘上,比如使用Qdrant,Faiss等系统,都为向量数据创建高效的索引,从而实现快速的近似查询。这样你就不用每次都Embedding了。 混合方案: 在某些情况下,你可能希望结合内存和磁盘存储。

    2023-09-13归属地:浙江
    3
    3
  • 清风明月
    如果文档有更新怎么更新索引

    作者回复: 使用LangChain的索引API - https://python.langchain.com/docs/modules/data_connection/indexing

    2023-12-25归属地:上海
    2
  • 一路前行
    qdrant,chromadb,fiass老师在这些向量库的选择上有什么建议么

    作者回复: https://docs.google.com/spreadsheets/d/1oAeF4Q7ILxxfInGJ8vTsBck3-2U9VV8idDf3hJOozNw/edit#gid=0 这里有人做了个比较表耶,同学看一看。目前我用起来,简单的需求大概都差不多。

    2023-11-03归属地:北京
    2
    2
  • 我用OpenAIEmbeddings查询出来的结果不对,后来该用text2vec-base-chinese才正常。

    作者回复: 好!谢谢同学的这个Input。

    2023-10-22归属地:上海
    2
收起评论
显示
设置
留言
51
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部