如何快速用LangChain打造一个智能问答小客服?仅需40行代码!(含代码)

我们该如何应用LangChain进行多种的开发呢?在写一些项目的时候我们经常离不开要阅读一些开源产品的代码,而这个智能问答小客服就是在LangChain源代码上进行微小改动写出来的,能够更加清晰LangChain的结构。一起来看看吧!希望通过这个例子能帮助大家更加理解LangChain。

框架设计

 组件一览:

组件类型子类型
TextLoader索引组件文本加载器
RecursiveCharacterTextSplitter索引组件文本分割器
RetrievalQA链组件对话链
ChatOpenAI模型组件LLM
OpenAIEmbeddings模型组件文本嵌入模型
Chroma索引组件VectorStores

准备工作

安装依赖

pip install langchain
pip install openai
pip install chromadb
pip install tiktoken

设置密钥

import os
import openai os.environ["OPENAI_API_KEY"] = 'your_openai_key'
os.environ['OPENAI_API_BASE'] = ''

导入库和TXT加载器

from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

开始编码

加载txt文本数据

使用TextLoader加载名为qa.txt的文本文件,并将其存储在data变量中。

loader = TextLoader('qa.txt')
data = loader.load()

分割文本

使用RecursiveCharacterTextSplitter将文本数据分割成多个片段,存储在all_splits变量中。

text_splitter = RecursiveCharacterTextSplitter(chunk_size = 50, chunk_overlap = 0) 
all_splits = text_splitter.split_documents(data)

chunk_size是将这个长字符串按照设置的字符数拆分。

chunk_overlap 参数用于指定文本切分时的重叠量(overlap),表示每个分块的前后两个分块之间会有多少个字符是重复的。这样做的目的是避免关键信息被切分。

创建向量存储器

创建一个Chroma向量存储器,并使用OpenAIEmbeddings作为嵌入器,将分割后的文本片段作为输入,存储在vectorstore变量中。

vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())

用户输入循环

进入一个无限循环,提示用户输入问题。

   while True:print("请输入问题,例如:弦丝画制作的活动时长是多少?")query = input("请输入:")if "end" == query:breakquestion = queryprint(f"问题:{question}")

创建问答链

创建一个ChatOpenAI实例,使用"GPT-3.5-turbo"模型和温度值为0。然后,使用RetrievalQA.from_chain_type方法,将ChatOpenAI实例和vectorstore作为检索器,创建一个问答链。

          llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

获取并打印回答

将用户输入的问题作为查询传递给问答链,并将结果存储在ret变量中。然后,打印出回答结果。

          qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever())           ret = qa_chain({"query": question})print(f"回答:{ret['result']}")

运行主函数

如果当前文件被直接执行(而不是被导入为模块),则调用run()函数。

if '__main__' == __name__:run()

qa.txt 内容

问题:扎染围巾的活动时长是多少?
答案:扎染围巾的活动时长是1.5—2小时。
问题:扎染围巾的价格是多少元一位?
答案:扎染围巾的价格是120元/人。
问题:制作土耳其水拓画的活动时长是多少?
答案:制作土耳其水拓画的活动时长是1.5—2小时。
问题:制作土耳其水拓画的价格是多少元一位?
答案:制作土耳其水拓画的价格是100元/人。
问题:北京绢人(标准版)的制作价格是多少元一位?
答案:北京绢人(标准版)的制作价格是150元/人。
问题:北京绢人(唐人坊精装版)的制作价格是多少元一位?
答案:北京绢人(唐人坊精装版)的制作价格是200元/人。
问题:捕梦网的制作活动时长是多少?
答案:捕梦网的制作活动时长是1—1.5小时。
问题:捕梦网的制作价格是多少元一位?
答案:捕梦网的制作价格是130元/人。
问题:马卡龙塑料框的光影纸雕灯制作价格是多少元一位?
答案:马卡龙塑料框的光影纸雕灯制作价格是160元/人。
问题:木框的光影纸雕灯制作价格是多少元一位?
答案:木框的光影纸雕灯制作价格是180元/人。
问题:弦丝画制作的活动时长是多少?
答案:弦丝画制作活动时长是2—3小时。
问题:用弦丝画制作福字是多少元一位?
答案:用弦丝画制作福字、旺字等单字款价格120元/人。
问题:用弦丝画制作旺字是多少元一位?
答案:用弦丝画制作福字、旺字等单字款价格120元/人。
问题:用弦丝画制作喜字是多少元一位?
答案:用弦丝画制作福字、旺字等单字款价格120元/人,其他图案款请咨询详谈。
问题:端午节香囊的制作价格是多少元一位?
答案:端午节香囊价格100元/人。
问题:中秋节月饼的制作价格是多少元一位?
答案:中秋节月饼价格120元/人。

执行结果演示

(可以换种问法尝试,我把“活动时长”改为“时间”尝试了一下)

报错与解决

在运行代码中遇到过两种问题:

报错1:Number of requested results 4 is greater than number of elements in index 1, updating n_results = 1

解决办法:增加txt文本的长度或减少切割长度

 报错2:(无关紧要,可以忽略)python3.10/site-packages/sklearn/svm/_classes.py:32: FutureWarning: The default value of dual will change from True to 'auto' in 1.5. Set the value of dual explicitly to suppress the warning.

warnings.warn(

解决办法:加入代码

import warnings
warnings.filterwarnings('ignore', category=FutureWarning)

完整代码(点击即可进入)

小结

以上就是我在配置并使用用LangChain打造一个智能问答小客服分享,希望可以帮到各位!欢迎关注或发私信与我共同讨论更多大模型领域知识~


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部