llm-universe | 四. 构建RAG应用

构建RAG应用

  • 一.将LLM 接入 LangChain
  • 二.构建检索问答链
    • 1.加载向量数据库
    • 2.创建一个 LLM
    • 3.构建检索问答链
    • 4.检索问答链效果测试
    • 5.添加历史对话的记忆功能
      • 5.1 记忆(Memory)
      • 5.2 对话检索链(ConversationalRetrievalChain)
  • 三. 部署知识库助手
    • 1. Streamlit 简介
    • 2、构建应用程序

一.将LLM 接入 LangChain

使用 LangChain 调用智谱 GLM

使用的是智谱 GLM API,需要将封装的代码zhipuai_llm.py下载到本 Notebook 的同级目录下,才可以运行下列代码来在 LangChain 中使用 GLM。

# 需要下载源码
from zhipuai_llm import ZhipuAILLMfrom dotenv import find_dotenv, load_dotenv
import os_ = load_dotenv(find_dotenv())# 获取环境变量 API_KEY
api_key = os.environ["ZHIPUAI_API_KEY"] #填写控制台中获取的 APIKey 信息zhipuai_model = ZhipuAILLM(model="chatglm_std", temperature=0, api_key=api_key)
zhipuai_model("你好,请你自我介绍一下!")

返回结果

' 你好,我是 智谱清言,是清华大学KEG实验室和智谱AI公司共同训练的语言模型。我的目标是通过回答用户提出的问题来帮助他们解决问题。由于我是一个计算机程序,所以我没有自我意识,也不能像人类一样感知世界。我只能通过分析我所学到的信息来回答问题。'

二.构建检索问答链

1.加载向量数据库

首先,我们加载在前一章已经构建的向量数据库。注意,此处你需要使用和构建时相同的 Emedding。

import sys
sys.path.append("../C3 搭建知识库") # 将父目录放入系统路径中# 使用智谱 Embedding API,注意,需要将上一章实现的封装代码下载到本地
from zhipuai_embedding import ZhipuAIEmbeddingsfrom langchain.vectorstores.chroma import Chromafrom dotenv import load_dotenv, find_dotenv
import os_ = load_dotenv(find_dotenv())    # read local .env file
zhipuai_api_key = os.environ['ZHIPUAI_API_KEY']# 定义 Embeddings
embedding = ZhipuAIEmbeddings()# 向量数据库持久化路径
persist_directory = '../data_base/vector_db/chroma'# 加载数据库
vectordb = Chroma(persist_directory=persist_directory,  # 允许我们将persist_directory目录保存到磁盘上embedding_function=embedding
)
print(f"向量库中存储的数量:{vectordb._collection.count()}")

返回结果

向量库中存储的数量:40
question = "什么是prompt engineering?"
docs = vectordb.similarity_search(question,k=3)
print(f"检索到的内容数:{len(docs)}")
for i, doc in enumerate(docs):print(f"检索到的第{i}个内容: \n {doc.page_content}", end="\n-----------------------------------------------------\n")

返回结果

检索到的内容数:3
检索到的第0个内容: 相反,我们应通过 Prompt 指引语言模型进行深入思考。可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在 Prompt 中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。综上所述,给予语言模型充足的推理时间,是 Prompt Engineering 中一个非常重要的设计原则。这将大大提高语言模型处理复杂问题的效果,也是构建高质量 Prompt 的关键之处。开发者应注意给模型留出思考空间,以发挥语言模型的最大潜力(此处省略)

2.创建一个 LLM

# 需要下载源码
from zhipuai_llm import ZhipuAILLMfrom dotenv import find_dotenv, load_dotenv
import os_ = load_dotenv(find_dotenv())# 获取环境变量 API_KEY
api_key = os.environ["ZHIPUAI_API_KEY"] #填写控制台中获取的 APIKey 信息
llm = ZhipuAILLM(model="chatglm_std", temperature=0, api_key=api_key)
llm.invoke("请你自我介绍一下自己!")

3.构建检索问答链

from langchain.prompts import PromptTemplatetemplate = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答
案。最多使用三句话。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。
{context}
问题: {question}
"""QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],template=template)

基于模板

from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectordb.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})

创建检索 QA 链的方法 RetrievalQA.from_chain_type() 有如下参数:

  • llm:指定使用的 LLM
  • 指定 chain type : RetrievalQA.from_chain_type(chain_type=“map_reduce”),也可以利用load_qa_chain()方法指定chain type。
  • 自定义 prompt :通过在RetrievalQA.from_chain_type()方法中,指定chain_type_kwargs参数,而该参数:chain_type_kwargs = {“prompt”: PROMPT}
  • 返回源文档:通过RetrievalQA.from_chain_type()方法中指定:return_source_documents=True参数;也可以使用RetrievalQAWithSourceChain()方法,返回源文档的引用(坐标或者叫主键、索引)

4.检索问答链效果测试

question_1 = "什么是南瓜书?"
question_2 = "王阳明是谁?"

基于召回结果和 query 结合起来构建的 prompt 效果

result = qa_chain({"query": question_1})
print("大模型+知识库后回答 question_1 的结果:")
print(result["result"])

返回结果

大模型+知识库后回答 question_1 的结果:南瓜书是一个在线的书籍共享平台,用户可以在上面分享自己喜欢的书籍,也可以下载其他用户分享的书籍。该平台旨在让用户能够更方便地分享和获取书籍资源。谢谢你的提问!
result = qa_chain({"query": question_2})
print("大模型+知识库后回答 question_2 的结果:")
print(result["result"])

返回结果

大模型+知识库后回答 question_2 的结果:王阳明是中国明代著名的哲学家、政治家和军事家。他是心学派别的创立者,提出了“知行合一”的哲学观点,对中国文化产生了深远的影响。

大模型自己回答的效果

prompt_template = """请回答下列问题:{}""".format(question_1)### 基于大模型的问答
llm.predict(prompt_template)

返回结果

' 南瓜书是一本针对人工智能领域中的数学难题的书籍,由开源组织Datawhale发起,团队成员谢文睿、秦州牵头。南瓜书针对一些难以理解的公式进行解析,对跳跃性较大的公式进行推导,帮助读者解决数学难题。该书的发布受到了广大学习者的好评,并且有幸得到西瓜书作者周志华教授的好评。南瓜书的项目地址在GitHub上,star数已经突破1.1万。'
prompt_template = """请回答下列问题:{}""".format(question_2)### 基于大模型的问答
llm.predict(prompt_template)

返回结果

' 王阳明,原名王守仁,是明代著名的思想家、哲学家、文学家和军事家。他出生于浙江余姚,曾在朝廷担任兵部尚书等要职,也是心学流派的创立者。王阳明提出了“心即理”的哲学观点,认为人的本性本善,只要克服私欲,就能达到道德的境界。他的思想影响深远,被誉为中国古代哲学的瑰宝之一。'

5.添加历史对话的记忆功能

5.1 记忆(Memory)

使用 ConversationBufferMemory ,它保存聊天消息历史记录的列表,这些历史记录将在回答问题时与问题一起传递给聊天机器人,从而将它们添加到上下文中。

from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory(memory_key="chat_history",  # 与 prompt 的输入变量保持一致。return_messages=True  # 将以消息列表的形式返回聊天记录,而不是单个字符串
)

5.2 对话检索链(ConversationalRetrievalChain)

对话检索链(ConversationalRetrievalChain)在检索 QA 链的基础上,增加了处理对话历史的能力。

它的工作流程是:

  1. 将之前的对话与新问题合并生成一个完整的查询语句。
  2. 在向量数据库中搜索该查询的相关文档。
  3. 获取结果后,存储所有答案到对话记忆区。
  4. 用户可在 UI 中查看完整的对话流程。
from langchain.chains import ConversationalRetrievalChainretriever=vectordb.as_retriever()qa = ConversationalRetrievalChain.from_llm(llm,retriever=retriever,memory=memory
)
question = "我可以学习到关于提示工程的知识吗?"
result = qa({"question": question})
print(result['answer'])
 是的,你可以通过吴恩达老师的《Prompt Engineering for Developer》课程学习到关于提示工程的知识。该课程由吴恩达老师与 OpenAI 技术团队成员 Isa Fulford 老师合作授课,内容涵盖了软件开发提示词设计、文本总结、推理、转换、扩展以及构建聊天机器人等语言模型典型应用场景。通过学习该课程,你可以了解到如何提升大语言模型应用效果的各种技巧和最佳实践,从而激发你的想象力,开发出更出色的语言模型应用。
question = "为什么这门课需要教这方面的知识?"
result = qa({"question": question})
print(result['answer'])
 吴恩达老师的《Prompt Engineering for Developer》课程需要教授关于提示工程的知识,因为提示工程是开发人员使用大语言模型(LLM)的关键技能。通过学习提示工程的最佳实践和技巧,开发人员可以更好地利用 LLM 的强大功能,并通过 API 接口快速构建软件应用程序。此外,提示工程对于提高语言模型应用的效果和构建出色的语言模型应用也至关重要。

三. 部署知识库助手

1. Streamlit 简介

Streamlit 是一种快速便捷的方法,可以直接在 *Python 中通过友好的 Web 界面演示机器学习模型*

Streamlit 提供了一组简单而强大的基础模块,用于构建数据应用程序:

  • st.write():这是最基本的模块之一,用于在应用程序中呈现文本、图像、表格等内容。

  • st.title()、st.header()、st.subheader():这些模块用于添加标题、子标题和分组标题,以组织应用程序的布局。

  • st.text()、st.markdown():用于添加文本内容,支持 Markdown 语法。

  • st.image():用于添加图像到应用程序中。

  • st.dataframe():用于呈现 Pandas 数据框。

  • st.table():用于呈现简单的数据表格。

  • st.pyplot()、st.altair_chart()、st.plotly_chart():用于呈现 Matplotlib、Altair 或 Plotly 绘制的图表。

  • st.selectbox()、st.multiselect()、st.slider()、st.text_input():用于添加交互式小部件,允许用户在应用程序中进行选择、输入或滑动操作。

  • st.button()、st.checkbox()、st.radio():用于添加按钮、复选框和单选按钮,以触发特定的操作。

2、构建应用程序

导入必要的 Python 库。

import streamlit as st
# from langchain_openai import ChatOpenAI
from zhipuai_llm import ZhipuAILLMfrom dotenv import find_dotenv, load_dotenv
import os# 读取本地/项目的环境变量。# find_dotenv()寻找并定位.env文件的路径
# load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())# 获取环境变量 API_KEY
api_key = os.environ["ZHIPUAI_API_KEY"] #填写控制台中获取的 APIKey 信息
# llm = ZhipuAILLM(model="chatglm_std", temperature=0, api_key=api_key)

创建应用程序的标题st.title

st.title('🦜🔗 动手学大模型应用开发')

添加一个文本输入框,供用户输入其 zhipu API 密钥

zhipu_api_key = st.sidebar.text_input('ZhiPu API Key', type='password')

**定义一个函数,使用用户密钥对 zhipu API 进行身份验证、发送提示并获取 AI 生成的响应。**该函数接受用户的提示作为参数,并使用st.info来在蓝色框中显示 AI 生成的响应

def generate_response(input_text):llm = ZhipuAILLM(temperature=0.7, zhipu_api_key=zhipu_api_key)st.info(llm(input_text))

**使用st.form()创建一个文本框(st.text_area())供用户输入。**当用户单击Submit时,generate-response()将使用用户的输入作为参数来调用该函数

with st.form('my_form'):text = st.text_area('Enter text:', 'What are the three key pieces of advice for learning how to code?')submitted = st.form_submit_button('Submit')if not openai_api_key.startswith('sk-'):st.warning('Please enter your Zhipu API key!', icon='⚠')if submitted and openai_api_key.startswith('sk-'):generate_response(text)

保存当前的文件streamlit_app.py

返回计算机的终端以运行该应用程序

streamlit run streamlit_app.py

在这里插入图片描述

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

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

相关文章

ts可选参数

可选参数 参数后加个问号,代表这个参数是可选的 function bdd(x:number,y?:number){return x y } console.log(bdd(2,3)) function bdd(x:number,y?:number){return x y } console.log(bdd(2))

从0到1构建自己的短链接系统

1. 短链系统简介 1.1 短链系统的定义与用途 短链系统是指将一个较长的URL地址,通过特定的算法生成一个较短的、具备唯一性的URL地址。这种系统广泛应用于社交网络、短信、邮件营销等场景,它能帮助用户在字数受限的情况下分享链接,并且还具有…

Jenkins 创建流水线任务

Jenkins是一个流行的持续集成(Continuous Integration,CI)工具。 Jenkins 创建任务 选择“流水线”类型,该类型的优点是定制化程度非常高 (可选)添加“参数化构建” 配置仓库选项(ssh连接、分支)和凭据…

上古世纪台服注册账号+下载客户端全方位图文教程

又一款新的MMRPG游戏即将上线啦,游戏名称叫做《上古世纪》游戏采用传统MMO类型游戏的玩法,但是开发商采用了先进的游戏引擎,让玩家们可以享受到极致的视觉体验。同时游戏的背景是建立在大陆分崩离析的基础上。各个部落因为领地的原因纷纷开战…

设计模式——责任链

责任链模式是一种行为设计模式,用于将请求的发送者和接收者解耦。在这种模式中,请求通过一条由多个对象组成的链传递,直到有一个对象能够处理该请求为止。每个对象都可以决定是否处理请求以及是否将请求传递给下一个对象。 责任链模式通常在…

螺丝扭断力试验机SJ-12

一、设备简介: 螺丝扭断力试验机用于测试螺丝的耐扭断力。本机将螺丝产品所受到轴向扭转力与反作用力,常用扭力扳手来计量。本机可对产品进行转力测、锁动测试、锁动扭力测试等多种测试方式。 二、设备使用: 1、将螺丝强度扭力试验机底座锁于…

代码随想录-Day41

46. 携带研究材料(第六期模拟笔试) 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实…

Mysql数据库学习

1、数据库基本认知 一:数据库分类 关系型数据库:SQL 主要有MySQL,Oracle,Sql Server等,其主要通过表与表之间,行与列之间的关系进行数据的存储。可以通过外键来建立表之间的关联。 非关系型数据库:NoSQL 主要有HB…

分享一个 MySQL 简单快速进行自动备份和还原的脚本和方法

前言 数据备份和还原在信息技术领域中具有非常重要的作用,不论是人为误操作、硬件故障、病毒感染、自然灾害还是其他原因,数据丢失的风险都是存在的。如果没有备份,一旦数据丢失,可能对个人、企业甚至整个组织造成巨大的损失。 …

uniapp H5端使用百度地图

1、登录百度地图开放平台 https://lbsyun.baidu.com/(没有账号则先去创建一个百度账号) 2、进入百度地图开放平台控制台(导航栏“控制台”),点击“应用管理”-“我的应用” 3、选择“创建应用”,应用模块选…

msvcr110.dll丢失的解决方法,亲测有效的几种解决方法

最近,我在启动一个程序时,系统突然弹出一个错误提示,告诉我电脑缺失了一个名为msvcr110.dll的文件。这让我感到非常困惑,因为我之前从未遇到过这样的问题。经过一番搜索和尝试,我总结了5种靠谱的解决方法。下面分享给大…

高效运维:标准化与智能化的运维流程管理实践

高效运维:标准化与智能化的运维流程管理实践 在信息化建设日益深化的今天,运维流程管理已成为企业确保其信息系统稳定、高效运行的关键手段。通过系统化、标准化的运维流程管理,企业能够有效预防系统故障,提升服务质量&#xff0…

React的路由(ReactRouter)-路由导航跳转

1.第一步 // createBrowserRouter路由 RouterProvider组件 import {createBrowserRouter,RouterProvider} from react-router-dom // 创建router实例对象&#xff0c;并配置路由对应关系 const routercreateBrowserRouter([{path:/login,element:<div>我是登录页</di…

vue3-登录小案例(借助ElementPlus+axios)

1.创建一个vue3的项目。 npm create vuelatest 2.引入Elementplus组件库 链接&#xff1a;安装 | Element Plus npm install element-plus --save 在main.js中引入 import ElementPlus from "element-plus";import "element-plus/dist/index.css";ap…

python--序列化模块json与pickle

什么叫序列化&#xff1f; 将原本的字典、列表等内容转换成一个字符串的过程就 叫做序列化。 多用的两个序列化模块&#xff1a;json与pickle json&#xff0c;用于字符串 和 python数据类型间进行转换 pickle&#xff0c;用于python特有的类型 和 python的数据类型间进行转换 …

Scania斯堪尼亚SHL题库综合能力性格测试真题题型解析及面试经验

一、走进Scania斯堪尼亚 Scania是一家成立于1891年的瑞典公司&#xff0c;专注于重型卡车和巴士的制造&#xff0c;以其模块化系统和环保设计闻名。作为全球领先的运输解决方案提供商&#xff0c;Scania不仅提供高质量的车辆&#xff0c;还提供相关服务和融资解决方案。公司秉…

Ruby langchainrb gem and custom configuration for the model setup

题意&#xff1a;Ruby 的 langchainrb gem 以及针对模型设置的自定义配置 问题背景&#xff1a; I am working in a prototype using the gem langchainrb. I am using the module assistant module to implemente a basic RAG architecture. 我正在使用 langchainrb 这个 ge…

实战|记一次java协同办公OA系统源码审计

前言 因为笔者也是代码审计初学者&#xff0c;写得不好的地方请见谅。该文章是以项目实战角度出发&#xff0c;希望能给大家带来启发。 审计过程 审计思路 1、拿到一个项目首先要看它使用了什么技术框架&#xff0c;是使用了ssh框架&#xff0c;还是使用了ssm框架&#xff…

C#基于SkiaSharp实现印章管理(2)

上一篇文章最后提到基于System.Text.Json能够序列化SKColor对象&#xff0c;但是反序列化时却无法解析本地json数据。换成Newtonsoft.Json进行序列化和反序列化也是类似的问题。   通过百度及查看微软的帮助文档&#xff0c;上述情况下需自定义转换类以处理SKColor类型数据的…

搜维尔科技:【研究】触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验

自然交互可提高VR模拟的有效性。研究表明&#xff0c;触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验。 以下是验证 医疗培训中的触觉技术 “ 95.5%的参与者表示触摸是 XR 教育的重要组成部分&#xff0c;90.9% 的参与者表示 XR 触觉将提供一个安全的学习场所。…