【吴恩达deeplearning.ai】基于LangChain开发大语言应用模型(下)

news2025/1/11 0:06:02

以下内容均整理来自deeplearning.ai的同名课程

Location 课程访问地址

DLAI - Learning Platform Beta (deeplearning.ai)

 LangChain for LLM Application Development 基于LangChain开发大语言应用模型(上)

一、LangChain: Q&A over Documents基于文档的检索问答

langchain具有检索能力,可以通过检索用户提供的文档内容,进行相应的回答。以下具体讲解实现逻辑

技术原理

1、【准备阶段】将文档内容(如列表)拆分成多个分片

2、【准备阶段】将分片通过embed技术转换为空间向量数组

3、【提问阶段】用户提问时,程序自动将提问内容embed为空间向量

4、【提问阶段】将提问的空间向量和文档生成的空间向量数组比较,找到最相似的几个

5、 【回答阶段】根据对应相关的文档切片,通过大预言模型,得到最终结果

实现方式1(检索csv进行回答)

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.vectorstores import DocArrayInMemorySearch
from IPython.display import display, Markdown
# 安装包

file = 'OutdoorClothingCatalog_1000.csv'
loader = CSVLoader(file_path=file)
# 加载文件

from langchain.indexes import VectorstoreIndexCreator
index = VectorstoreIndexCreator(
    vectorstore_cls=DocArrayInMemorySearch
).from_loaders([loader])
# 将文件内容,转换成空间向量组

query ="Please list all your shirts with sun protection \
in a table in markdown and summarize each one."
response = index.query(query)
display(Markdown(response))
# 基于问题和空间向量的相似度,找到对应相关的内容进行回答。(通过markdown转换文本到表格)

实现方式2(检索docs进行回答)

# -------------------- 单个内容转换空间向量 --------------------

from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# 加载包

embed = embeddings.embed_query("Hi my name is Harrison")
print(len(embed))
print(embed[:5])
# 将提问内容,转换为空间向量
# [-0.021913960576057434, 0.006774206645786762, -0.018190348520874977, -0.039148248732089996, -0.014089343138039112]

# ---------------- 在文档中检索相关内容进行解答 -----------------

db = DocArrayInMemorySearch.from_documents(
    docs, 
    embeddings)
# 基于需要检索的文档,分片转换为空间向量组

query = "Please suggest a shirt with sunblocking"
docs = db.similarity_search(query)
len(docs)
docs[0]
# 在文档生成的空间向量组中检索和提问相关的内容


llm = ChatOpenAI(temperature = 0.0)
# 创建一个大语言进程

qdocs = "".join([docs[i].page_content for i in range(len(docs))])
response = llm.call_as_llm(f"{qdocs} Question: Please list all your \
shirts with sun protection in a table in markdown and summarize each one.") 
display(Markdown(response))
# 将文档中相关的内容+提问内容,通过llm进程获取解答



检索器

langchain支持直接通过标准检索器模板,进行内容检索。以下是一些检索器介绍。

 1、stuff检索器直接将全文内容压缩,并通过语言模型进行回答。压缩过程中,可能导致信息缺失。

2、其他检索器:就不一一介绍了,看图理解

3、stuff检索器代码实现

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.vectorstores import DocArrayInMemorySearch
from IPython.display import display, Markdown
# 加载包

file = 'OutdoorClothingCatalog_1000.csv'
loader = CSVLoader(file_path=file)
docs = loader.load()
# 加载docs

from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
db = DocArrayInMemorySearch.from_documents(
    docs, 
    embeddings
)
# 转换空间向量组

retriever = db.as_retriever()
# 基于空间向量组,创建检索器

qa_stuff = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=retriever, 
    verbose=True
)
# 创建会话

query =  "Please list all your shirts with sun protection in a table \
in markdown and summarize each one."
response = qa_stuff.run(query)
# 生成回答

 二、Evaluation评估

langchain支持基于内容生成QA问答对,也支持评估已有的QA问答对,相对于实际内容的准确程度。

Outline:概要内容

  • Example generation 示例生成
  • Manual evaluation (and debuging) 人工评估
  • LLM-assisted evaluation 大语言模型辅助评估

Create our QandA application 创建一个基于stuff检索的会话

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.vectorstores import DocArrayInMemorySearch
# 加载包

file = 'OutdoorClothingCatalog_1000.csv'
loader = CSVLoader(file_path=file)
data = loader.load()
# 加载数据

index = VectorstoreIndexCreator(
    vectorstore_cls=DocArrayInMemorySearch
).from_loaders([loader])
# 基于数据创建向量空间组

llm = ChatOpenAI(temperature = 0.0)
qa = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=index.vectorstore.as_retriever(), 
    verbose=True,
    chain_type_kwargs = {
        "document_separator": "<<<<>>>>>"
    }
)
# 创建一个基于stuff检索的会话

Hard-coded examples手工编写QA示例

examples = [
    {
        "query": "Do the Cozy Comfort Pullover Set\
        have side pockets?",
        "answer": "Yes"
    },
    {
        "query": "What collection is the Ultra-Lofty \
        850 Stretch Down Hooded Jacket from?",
        "answer": "The DownTek collection"
    }
]

LLM-Generated examples通过大语言模型生成QA示例

from langchain.evaluation.qa import QAGenerateChain
# 加载包

example_gen_chain = QAGenerateChain.from_llm(ChatOpenAI())
# 创建QA生成链

new_examples = example_gen_chain.apply_and_parse(
    [{"doc": t} for t in data[:5]]
)
# 基于数据内容生成QA示例

Combine examples合并人工示例和大语言模型生成的示例

examples += new_examples
# 合并

Manual Evaluation人工评估

import langchain
langchain.debug = True
# 加载包

qa.run(examples[0]["query"])
# 生成示例提问的AI答案(用于印证)

langchain.debug = False

LLM assisted evaluation大语言模型辅助评估

predictions = qa.apply(examples)
# 对所有的示例基于大语言模型,生成回答

from langchain.evaluation.qa import QAEvalChain
llm = ChatOpenAI(temperature=0)
eval_chain = QAEvalChain.from_llm(llm)
# 创建评估链

graded_outputs = eval_chain.evaluate(examples, predictions)
# 对示例问题和回答进行评估

for i, eg in enumerate(examples):
    print(f"Example {i}:")
    print("Question: " + predictions[i]['query'])
    print("Real Answer: " + predictions[i]['answer'])
    print("Predicted Answer: " + predictions[i]['result'])
    print("Predicted Grade: " + graded_outputs[i]['text'])
    print()
# 显示评估结果

三、 Agents代理

大语言模型一般来说并不能完成用于知识的问答(因为其知识是被压缩的,不完整),而更适合作为一个可以链接和调用工具的真人。

我们只要提供给大语言模型一些工具和信息,他就能更好的帮助我们处理特定问题

Outline:概要

  • Using built in LangChain tools: DuckDuckGo search and Wikipedia使用langchain提供的工具
  • Defining your own tools自定义工具

Built-in LangChain tools使用自带工具

from langchain.agents.agent_toolkits import create_python_agent
from langchain.agents import load_tools, initialize_agent
from langchain.agents import AgentType
from langchain.tools.python.tool import PythonREPLTool
from langchain.python import PythonREPL
from langchain.chat_models import ChatOpenAI
# 加载包

llm = ChatOpenAI(temperature=0)
tools = load_tools(["llm-math","wikipedia"], llm=llm)
# 创建一个工具箱

agent= initialize_agent(
    tools, 
    llm, 
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_errors=True,
    verbose = True)
# 创建一个代理,加载工具箱。

agent("What is the 25% of 300?")
# 调用代理回答问题,代理会自动识别此问题需要调用math数学计算,并调用计算函数获得结果


question = "Tom M. Mitchell is an American computer scientist \
and the Founders University Professor at Carnegie Mellon University (CMU)\
what book did he write?"
result = agent(question) 
# 调用代理回答问题,代理会自动判断此问题需要调用wiki百科页面,获取相关百科的词条信息,并基于词条信息,生成最终的答案

Python Agent使用python代理工具

agent = create_python_agent(
    llm,
    tool=PythonREPLTool(),
    verbose=True
)
# 创建一个python代理

customer_list = [["Harrison", "Chase"], 
                 ["Lang", "Chain"],
                 ["Dolly", "Too"],
                 ["Elle", "Elem"], 
                 ["Geoff","Fusion"], 
                 ["Trance","Former"],
                 ["Jen","Ayai"]
                ]
agent.run(f"""Sort these customers by \
last name and then first name \
and print the output: {customer_list}""") 
# 运行代理,代理会自动判断完成词任务需要用到sorted()方法,进行如下计算sorted_customers = sorted(customers, key=lambda x: (x[1], x[0])),并最终获得结果。

langchain.debug=True
agent.run(f"""Sort these customers by \
last name and then first name \
and print the output: {customer_list}""") 
langchain.debug=False
# 可以通过debug查看具体的运行细节

Define your own tool自定义工具

from langchain.agents import tool
from datetime import date
# 加载包

@tool
def time(text: str) -> str:
    """Returns todays date, use this for any \
    questions related to knowing todays date. \
    The input should always be an empty string, \
    and this function will always return todays \
    date - any date mathmatics should occur \
    outside this function."""
    return str(date.today())
# 自定义函数工具

agent= initialize_agent(
    tools + [time], 
    llm, 
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_errors=True,
    verbose = True)
# 创建代理,调用自定义函数工具

try:
    result = agent("whats the date today?") 
except: 
    print("exception on external access")

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

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

相关文章

SpringMVC原理分析 | Controller配置、RestFul风格

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Controller配置 控制器Controller 控制器复杂提供访问应用程序的行为&#xff0c;通常通过接口定义或注释定义的两种方法实现控制器负责解析用户的请求并将其转换为一…

ModaHub AI模型开源社区——Milvus向量数据库存储相关概念

目录 存储相关概念 分区和数据段 数据段&#xff08;segment&#xff09; 分区&#xff08;partition&#xff09; 集合、分区和数据段的关系 元数据 常见问题 存储相关概念 分区和数据段 建立集合时&#xff0c;Milvus 根据参数 index_file_size 控制数据段的大小。另…

R+VIC 模型融合实践技术应用及未来气候变化模型预测

目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&#xff0c;由于适用的尺度主要的是中小流域&#xff0c;所以在预测气候变化对水文过程影响等方面都有所不足。 VIC模型…

“未来之光:揭秘创新科技下的挂灯魅力“

写在前面&#xff1a; 高度信息化当下时代&#xff0c;对电脑及数字设备的需求与日俱增无处不在&#xff0c;随之而来的视觉疲劳和眼睛问题也攀升到了前所未有的高度。传统台灯对于长时间使用电脑的人群来说是完全无法解决这些问题的。一款ScreenBar Halo 屏幕挂灯&#xff0c;…

【Java】Java核心要点总结 71:ThreadPoolExecutor

文章目录 1)为什么需要线程池&#xff1f;2)线程池内部怎么保证线程安全?3)创建线程的方式 newSingleThreadExecutor底层4) ThreadPoolExecutor参数使用5) 线程池的工作机制6)拒绝策略分四种7)队列有哪些&#xff1f; 参考&#xff1a; 1)为什么需要线程池&#xff1f; 重复利…

设计模式之备忘录模式笔记

设计模式之备忘录模式笔记 说明Memento(备忘录)目录白箱备忘录模式备忘录模式示例类图游戏角色类备忘录角色类备忘录对象管理对象测试类 黑箱备忘录模式备忘录模式示例类图备忘录接口游戏角色类备忘录对象管理对象测试类 说明 记录下学习设计模式-备忘录模式的写法。JDK使用版…

JDBC小记——连接池

目录 连接池介绍 常用连接池 DBCP连接池 硬编码方式 配置文件方式 C3P0连接池 C3P0和DBCP的区别 硬编码方式 配置文件方式 Druid连接池 硬编码方式 配置文件方式 DBUtils 连接池介绍 由于建立数据库连接是一种非常耗时、耗资源的行为&#xff0c;所以预先通过连接…

在vite+vue3项目中配置使用css预处理器(less/sass)以及路径别名

一、在vite项目中使用css预处理器 vite已经将这些预处理器的loader内置了&#xff0c;我们不用再像在webpack项目中那样&#xff0c;需要下载和配置一堆相关的loader&#xff0c;我们只需要下载less&#xff0c;sass依赖&#xff0c;就能直接在项目中使用啦 使用npm或者yarn来…

Springboot-- 注解字段校验,并统一设置返回值

Springboot-- 注解字段校验&#xff0c;并统一设置返回值 引包&#xff1a;import org.springframework.validation.annotation.Validated; <!--web--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

配置鼠标右键菜单功能 :一键csv转excel

配置右键菜单功能 &#xff1a;一键csv转excel 无需点开文件&#xff0c;双击即可以生成新的excel文件 步骤&#xff1a; 1、配置Python&#xff0c;安装依赖库 pip install openpyxl pip install pandas2、创建Python文件 csv_to_excel.py # -*- coding:utf-8 -*- impor…

【计算机组成原理】函数栈帧

目录 一、源代码理论分析 二、主函数的创建 三、c语言代码的汇编 注&#xff1a;不同编译器环境的函数栈帧存在一定差异&#xff0c;本文使用VS2019 一、源代码理论分析 源代码&#xff1a; int Add(int x, int y) {int z 0;z x y;return z; }int main() {int a 10;…

u盘安装centos 7

1.下载 通过阿里云站点&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64/&#xff0c;下载iso文件。 2.制作启动u盘镜像 2.1 下载制作工具 下载u启动 http://uqidong.als98.cn/ 。 2.2 制作镜像 准备u盘&#xff0c;插入机器&#xff0c;运行u启动。 注意…

机器学习之基于PCA的人脸识别

目录 PCA人脸数据降维 matlab代码实现 思路分析 PCA人脸重构 matlab代码实现 思路分析 PCA人脸可视化 matlab代码实现 思路分析&#xff1a; PCA人脸识别 matlab代码实现 思路分析 PCA人脸数据降维 matlab代码实现 picturesdir(C:\Users\Yezi\Desktop\机…

数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路

目录 半导体三极管 三极管的放大的条件 基本放大电路计算 基本线性运放电路 同相放大电路 反相放大电路 加法器放大电路 正弦波振荡电路 正弦波振荡的条件 半导体三极管 三极管的放大的条件 主要是依靠它的发射极电流能够通过基区传输&#xff0c;然后到达集电极而实现…

【KMP算法】时间复杂度O(N)的字符串匹配算法

目录 案例&#xff1a;假定我们给出字符串 ”ababcabcdabcde”作为主串&#xff0c; 然后给出子串&#xff1a; ”abcd”,现在我们需要查找子串是否在主串中 出现&#xff0c;出现返回主串中的第一个匹配的下标&#xff0c;失败返回-1 ; 1.BF算法&#xff08;暴力算法&#x…

java8新特性之--强大的Stream API详细讲解

强大的Stream API Stream API说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则 是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。 这是目前为止对Java类库最好的补充&#xff0c;因为Stream API可以极…

CVPR 23 | 高分辨率缺陷异常定位新范式:PyramidFlow

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2303.02595 论文代码&#xff1a;暂未发布 0. 背景 由于复杂的工业制造过程中的不可控因素&#xff0c;不可避免地会给产品带来不可预见的缺陷。由于人类视觉系…

使用亮数据Bright Data解决出境电商问题

目录 一、出境电商的困境和问题1、困境一&#xff1a;获取准确的市场数据&#xff08;1&#xff09;数据的时效性和可靠性&#xff08;2&#xff09;数据的全面性和多样性&#xff08;3&#xff09;数据的实时更新和持续监测 2、困境二&#xff1a;克服地域限制和语言障碍&…

scratch数星星 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch数星星 一、题目要求 1、准备工作 2、功能实现 二、案例分析

基于Java学生信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…