基于langchain RAG问答应用实战

软件资源

• CUDA 11.7

• Python 3.10

• pytorch 1.13.1+cu117

• langchain

一、环境搭建

1.1 下载代码

$

1.2 构建环境

 $ conda create -n py310_chat python=3.10 # 创建新环境
 $ source activate py310_chat # 激活环境

1.3 安装依赖

$ pip install datasets langchain sentence_transformers tqdm chromadb
langchain_wenxin

二、RAG问答应用实战

2.2 本地数据加载

from langchain.document_loaders import TextLoader
loader = TextLoader("./藜.txt")
documents = loader.load()
documents
>>>
[Document(page_content='藜(读音lí)麦(Chenopodium\xa0quinoa\xa0Willd.)是藜科藜属
植物。穗部可呈红、紫、黄,植株形状类似灰灰菜,成熟后穗部类似高粱穗。植株大小受环境
及遗传因素影响较大,从0.3-3米不等,茎部质地较硬,可分枝可不分。单叶互生,叶片呈鸭掌
状,叶缘分为全缘型与锯齿缘型。藜麦花两性,花序呈伞状、穗状、圆锥状,藜麦种子较小,
呈小圆药片状,直径1.5-2毫米,千粒重1.4-3克。\xa0[1]\xa0\n原产于南美洲安第斯山脉的哥
伦比亚、厄瓜多尔、秘鲁等中高海拔山区。具有一定的耐旱、耐寒、耐盐性,生长范围约为海
平面到海拔4500米左右的高原上,最适的高度为海拔3000-4000米的高原或山地地区。
\xa0[1]\xa0\n藜麦富含的维生素、多酚、类黄酮类、皂苷和植物甾醇类物质具有多种健康功
效。...

2.3 文档分割

文档分割,借助langchain的字符分割器,这里采用固定字符长度分割chunk_size=128

#文档分割
from langchain.text_splitter import CharacterTextSplitter
# 创建拆分器
text_splitter = CharacterTextSplitter(chunk_size=128, chunk_overlap=0)
# 拆分文档
documents = text_splitter.split_documents(documents)
documents
[Document(page_content='藜(读音lí)麦(Chenopodium\xa0quinoa\xa0Willd.)是藜科藜属
植物。穗部可呈红、紫、黄,植株形状类似灰灰菜,成熟后穗部类似高粱穗。植株大小受环境
及遗传因素影响较大,从0.3-3米不等,茎部质地较硬,可分枝可不分。单叶互生,叶片呈鸭掌
状,叶缘分为全缘型与锯齿缘型。藜麦花两性,花序呈伞状、穗状、圆锥状,藜麦种子较小,
呈小圆药片状,直径1.5-2毫米,千粒重1.4-3克。\xa0[1]\xa0\n原产于南美洲安第斯山脉的哥
伦比亚、厄瓜多尔、秘鲁等中高海拔山区。具有一定的耐旱、耐寒、耐盐性,生长范围约为海
平面到海拔4500米左右的高原上,最适的高度为海拔3000-4000米的高原或山地地区。
\xa0[1]\xa0\n藜麦富含的维生素、多酚、类黄酮类、皂苷和植物甾醇类物质具有多种健康功
效。藜麦具有高蛋白,其所含脂肪中不饱和脂肪酸占83%,还是一种低果糖低葡萄糖的食物,能
在糖脂代谢过程中发挥有益功效。\xa0[1]\xa0\xa0[5]\xa0\n国内藜麦产品的销售以电商为主,
缺乏实体店销售,藜麦市场有待进一步完善。藜麦国际市场需求强劲,发展前景十分广阔。通过
加快品种培育和生产加工设备研发,丰富产品种类,藜麦必将在“调结构,转方式,保增收”的农
业政策落实中发挥重要作用。\xa0[5]\xa0\n2022年5月,“超级谷物”藜麦在宁洱县试种成
功。', metadata={'source': './藜.txt'}),
Document(page_content='藜麦是印第安人的传统主食,几乎和水稻同时被驯服有着6000多年
的种植和食用历史。藜麦具有相当全面营养成分,并且藜麦的口感口味都容易被人接受。在藜
麦这种营养丰富的粮食滋养下南美洲的印第安人创造了伟大的印加文明,印加人将藜麦尊为粮
食之母。美国人早在80年代就将藜麦引入NASA,作为宇航员的日常口粮,FAO认定藜麦是唯一一
种单作物即可满足人类所需的全部营养的粮食,并进行藜麦的推广和宣传。2013年是联合国钦
定的国际藜麦年。以此呼吁人们注意粮食安全和营养均衡。', metadata={'source': './
藜.txt'}),

2.4 向量化&数据入库

接下来对分割后的数据进行embedding,并写入数据库。这里选用

m3e-base作为embedding模型,向量数据库选用Chroma

from langchain.embeddings import HuggingFaceBgeEmbeddings
from langchain.vectorstores import Chroma
# embedding model: m3e-base
model_name = "moka-ai/m3e-base"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True}
embedding = HuggingFaceBgeEmbeddings(
 model_name=model_name,
 model_kwargs=model_kwargs,
 encode_kwargs=encode_kwargs,
 query_instruction="为文本生成向量表示用于文本检索"
 )
# load data to Chroma db
db = Chroma.from_documents(documents, embedding)
# similarity search
db.similarity_search("藜一般在几月播种?")

2.5 Prompt设计

prompt设计,这里只是一个prompt的简单示意,在实际业务场景中需要针对场景特点针对性调优。

template = '''
 【任务描述】
 请根据用户输入的上下文回答问题,并遵守回答要求。
 【背景知识】
 {{context}}
 【回答要求】
 - 你需要严格根据背景知识的内容回答,禁止根据常识和已知信息回答问题。
 - 对于不知道的信息,直接回答“未找到相关答案”
 -----------
 {question}
 '''

2.6 RetrievalqaChain构建

这里采用ConversationalRetrievalChain,ConversationalRetrievalQA chain 是建立在 RetrievalQAChain 之上,提供历史聊天记录组件。如下面定义了memory来追踪聊天记录,在流程上,先将历史问题和当前 输入问题融合为一个新的独立问题,然后再进行检索,获取问题相关知识,最后将获取的知识和生成的新 问题注入Prompt让大模型生成回答。

from langchain import LLMChain
from langchain_wenxin.llms import Wenxin
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from langchain.prompts.chat import ChatPromptTemplate, SystemMessagePromptTemplate,
HumanMessagePromptTemplate
# LLM选型
llm = Wenxin(model="ernie-bot", baidu_api_key="baidu_api_key",
baidu_secret_key="baidu_secret_key")
retriever = db.as_retriever()
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(llm, retriever, memory=memory)
qa({"question": "藜怎么防治虫害?"})
>>>
{'question': '藜怎么防治虫害?',
'chat_history': [HumanMessage(content='藜怎么防治虫害?'),
 AIMessage(content='藜麦常见虫害有象甲虫、金针虫、蝼蛄、黄条跳甲、横纹菜蝽、萹蓄齿
胫叶甲、潜叶蝇、蚜虫、夜蛾等。防治方法:可每亩用3%的辛硫磷颗粒剂2-2.5千克于耕地前均
匀撒施,随耕地翻入土中。也可以每亩用40%的辛硫磷乳油250毫升,加水1-2千克,拌细土20-
25千克配成毒土,撒施地面翻入土中,防治地下害虫。')],
'answer': '藜麦常见虫害有象甲虫、金针虫、蝼蛄、黄条跳甲、横纹菜蝽、萹蓄齿胫叶甲、
潜叶蝇、蚜虫、夜蛾等。防治方法:可每亩用3%的辛硫磷颗粒剂2-2.5千克于耕地前均匀撒施,
随耕地翻入土中。也可以每亩用40%的辛硫磷乳油250毫升,加水1-2千克,拌细土20-25千克配
成毒土,撒施地面翻入土中,防治地下害虫。'}

2.7 高级用法

针对多轮对话场景,增加 question_generator对历史对话记录进行压缩生成新的question,增加 combine_docs_chain对检索得到的文本进一步融合

from langchain import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain, StuffDocumentsChain
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.prompts.chat import ChatPromptTemplate, SystemMessagePromptTemplate,
HumanMessagePromptTemplate
# 构建初始 messages 列表,这里可以理解为是 openai 传入的 messages 参数
messages = [
 SystemMessagePromptTemplate.from_template(qa_template),
 HumanMessagePromptTemplate.from_template('{question}')
]
# 初始化 prompt 对象
prompt = ChatPromptTemplate.from_messages(messages)
llm_chain = LLMChain(llm=llm, prompt=prompt)
combine_docs_chain = StuffDocumentsChain(
 llm_chain=llm_chain,
 document_separator="\n\n",
 document_variable_name="context",
)
q_gen_chain = LLMChain(llm=llm,
prompt=PromptTemplate.from_template(qa_condense_template))
qa = ConversationalRetrievalChain(combine_docs_chain=combine_docs_chain,
 question_generator=q_gen_chain,
return_source_documents=True,
return_generated_question=True,
retriever=retriever)
print(qa({'question': "藜麦怎么防治虫害?", "chat_history": []}))
>>>
{'question': '藜怎么防治虫害?',
'chat_history': [],
'answer': '根据背景知识,藜麦常见虫害有象甲虫、金针虫、蝼蛄、黄条跳甲、横纹菜蝽、萹
蓄齿胫叶甲、潜叶蝇、蚜虫、夜蛾等。防治方法如下:\n\n1. 可每亩用3%的辛硫磷颗粒剂2-
2.5千克于耕地前均匀撒施,随耕地翻入土中。\n2. 也可以每亩用40%的辛硫磷乳油250毫升,
加水1-2千克,拌细土20-25千克配成毒土,撒施地面翻入土中,防治地下害虫。\n\n以上内容
仅供参考,如果需要更多信息,可以阅读农业相关书籍或请教农业专家。',
'source_documents': [
Document(page_content='病害:主要防治叶斑病,使用12.5%的烯唑醇可湿性粉剂3000-4000倍
液喷雾防治,一般防治1-2次即可收到效果。\xa0[4]\xa0\n虫害:藜麦常见虫害有象甲虫、金
针虫、蝼蛄、黄条跳甲、横纹菜蝽、萹蓄齿胫叶甲、潜叶蝇、蚜虫、夜蛾等。防治方法:可每
亩用3%的辛硫磷颗粒剂2-2.5千克于耕地前均匀撒施,随耕地翻入土中。也可以每亩用40%的辛
硫磷乳油250毫升,加水1-2千克,拌细土20-25千克配成毒土,撒施地面翻入土中,防治地下害
虫', metadata={'source': './藜.txt'}),
Document(page_content='中期管理\n在藜麦8叶龄时,将行中杂草、病株及残株拔掉,提高整
齐度,增加通风透光,同时,进行根部培土,防止后期倒伏。\xa0[4]', metadata={'source':
知识星球
'./藜.txt'})], 'generated_question': '藜怎么防治虫害?'}

三、结语

大模型的时代已经到来,而RAG技术的应用,为我们打开了一扇通往更深层次AI应用的大门。希望通过本文的分享,能够激发你对大模型和RAG技术的兴趣,并在你的技术道路上提供帮助和启发。欢迎在评论区交流讨论,共同探索AI技术的无限可能。

👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值