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

news2024/9/20 22:46:40

以下内容均整理来自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评估

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/675432.html

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

相关文章

bert4rec简介

1、bert4rec提出动机 用户行为动态变化&#xff0c;序列行为建模取得了不错的效果 单向结构限制了行为序列中隐藏信息的挖掘 序列神经网络顺序依赖&#xff0c;无法并行计算 为此&#xff0c;提出了 基于双向self-attention和Cloze task的用户行为序列建模方法。据我们所知…

解决Jenkins报错

解决Jenkins报错 1 linux空间不够问题1.1 报错现象1.2 定位问题1.3 解决措施 2 bash问题2.1 问题现象2.2 问题定位2.3 解决措施 3 虚拟环境问题3.1 问题现象3.2 问题定位3.3 解决措施 4 jenkins构建完成但一直转圈问题4.1 问题现象4.2 问题定位4.3 解决措施 5 jenkins自动化部署…

C高级6.24

一、整理grep、find、cut、tar、apt-get、dpkg、ln、ln-s指令 1.grep ----->查找字符串 grep 字符串 文件名 -w:按单词查找 -R:实现递归查找&#xff0c;主要用于路径是目录的情况 -i:不区分大小写 -n:显示行号 grep -w "^ubuntu" /etc/passwd ---->查找以ub…

【深度学习】RepVGG解析和学习体会

文章目录 前言0. Vgg1.RepVGG Block 详解 前言 论文名称&#xff1a;RepVGG: Making VGG-style ConvNets Great Again 论文下载地址&#xff1a;https://arxiv.org/abs/2101.03697 官方源码&#xff08;Pytorch实现&#xff09;&#xff1a;https://github.com/DingXiaoH/RepV…

今天是世界Wi-Fi日!

很多人都不知道&#xff0c;今天其实是世界Wi-Fi日&#xff1a; 这个特殊的纪念日&#xff0c;是由无线宽带联盟&#xff08;Wireless Broadband Alliance&#xff09;确定的&#xff0c;并得到了互联城市咨询委员会 &#xff08;CCAB&#xff09;等组织的大力支持。 无线宽带联…

数据处理神器tidyverse!教你如何秒速搞定数据处理!

一、前言 在R语言中&#xff0c;tidyverse是一个庞大的数据分析生态系统&#xff0c;它由一系列数据可视化和数据处理软件包组成&#xff0c;能够极大地提高数据分析的效率和准确性。 在使用 Tidyverse 的过程中&#xff0c;我们会经常用到以下几个工具&#xff1a; ggplot2&am…

chatgpt赋能python:Python浮点数:介绍、精度和应用

Python浮点数&#xff1a;介绍、精度和应用 Python是一种高级编程语言&#xff0c;许多程序员使用Python编写计算机程序。与其他编程语言不同&#xff0c;Python是一种动态类型的语言&#xff0c;并且它处理浮点数时更加灵活。在本文中&#xff0c;我们将介绍Python浮点数的概…

python自动化办公——读取PPT写入word表格

Python自动化办公——读取PPT内容写入word表格 文章目录 Python自动化办公——读取PPT内容写入word表格一、需求分析二、导入依赖三、代码四、结果及总结 一、需求分析 &#x1f4d6;由于我们知识图谱课程需要将课堂小组汇报的PPT总结成word文档&#xff0c;而我觉得一页一页复…

win10安装nginx的配置和使用方法(图文)

window10系统安装nginx服务&#xff0c;提供网页方面的服务。下面为详细图文安装配置教程。 1&#xff09;下载nginx软件 官方下载地址&#xff1a;http://nginx.org/en/download.html 2&#xff09;解压缩软件 unzip nginx-1.20.1.zip 或者 使用解压缩软件&#xff0c;下…

视频与AI,与进程交互(二) pytorch 极简训练自己的数据集并识别

目标学习任务 检测出已经分割出的图像的分类 2 使用pytorch pytorch 非常简单就可以做到训练和加载 2.1 准备数据 如上图所示&#xff0c;用来训练的文件放在了train中&#xff0c;验证的文件放在val中&#xff0c;train.txt 和 val.txt 分别放文件名称和分类类别&#xff…

Android之 弹框总结

一 简介 1.1 弹框即浮与页面之上的窗口&#xff0c;如键盘弹框&#xff0c;吐司弹框&#xff0c;确认弹框&#xff0c;下拉选择框&#xff0c;应用悬浮框等 1.2 弹框控件也很多&#xff0c;比如常用的Spinner&#xff0c;Dialog&#xff0c;Toast&#xff0c;PopWindow等&…

小主机折腾记14

1.m72e主机&#xff0c;3240t-2390t-3470t测试&#xff1b; 2390t官方参数 在m72e上 全核3.08Ghz 单核3.28-3.31Ghz 核显2帧 评分 3470t官方参数 在m72e上 全核睿频3.28 单核最高3.44 核显1.2帧&#xff1f;&#xff1f;&#xff1f;还不如那啥HD2000 最后评分 进入…

chatgpt赋能python:Python求累加的方法及其应用

Python求累加的方法及其应用 在Python编程中&#xff0c;经常需要对一系列数字进行求和或累加的操作。那么在Python中&#xff0c;我们可以通过哪些方法来实现这个功能呢&#xff1f;本文将为大家介绍Python求累加的方法及其应用。 1. Python中的for循环 首先&#xff0c;我…

05-事件循环

事件循环 以下知识点都涉及到事件循环 计时器&#xff0c;promise&#xff0c;ajax&#xff0c;node 明白此知识点&#xff0c;是前端的分水岭&#xff0c;可以提高效率&#xff0c;js中奇怪的东西都可以得到解决&#xff0c;整个过程是根据W3C和谷歌源码进行 浏览器的进程…

一文理解cast转换

目录 写在前边 1. what&#xff1f;又报错&#xff1a; 2. 靠&#xff0c;难道是这样&#xff1f; 3. 小试牛刀 4. 实际中的“坑” 写在后边 写在前边 关于$cast转换的结论无外乎以下四条&#xff1a; 如果将子类句柄复制给父类句柄&#xff0c;可以实现父类句柄的向下转换…

翻筋斗觅食策略改进灰狼算法

目录 一、动态扰动因子策略 二、翻筋斗觅食策略 三、改进灰狼算法收敛曲线图 灰狼优化算法(grey wolf optimization,GWO)存在收敛的不合理性等缺陷&#xff0c;目前对GWO算法的收敛性改进方式较少&#xff0c;除此之外&#xff0c;当GWO迭代至后期&#xff0c;所有灰狼个体…

企业版:Select.PDF Library for .NET

HTML 到 PDF API SelectPdf提供了一个REST API&#xff0c;可用于通过我们的专用云服务将html转换为任何语言的pdf。 另存为 PDF 链接 以非常简单的方式将“转换为PDF”功能添加到您的网站或博客。只需添加一个指向您的网页的链接&#xff0c;您就完成了。 适用于 .NET 的 PD…

Redis 通用命令

通用命令介绍 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令&#xff0c;比如删除键、对键进行改名、判断键是否存在等。简单说&#xff0c;就是 keys 分类的命令&#xff0c;如下图。 上图中圈中的部分&#xff0c;就是所谓的通用的命令…

chatgpt赋能python:Python对于SEO的重要性:浏览网页的技术分析

Python对于SEO的重要性&#xff1a;浏览网页的技术分析 越来越多的网站需要搜索引擎优化&#xff08;SEO&#xff09;&#xff0c;以便他们的网站上的内容能够被更多人浏览与访问。这就要求我们使用一些工具和技术&#xff0c;例如Python&#xff0c;来帮助我们分析网页的技术…

通过调整图像hue值并结合ImageEnhance库以实现色调增强

前言 PIL库中的ImageEnhance类可用于图像增强&#xff0c;可以调节图像的亮度、对比度、色度和锐度。 通过RGB到HSV的变换加调整可以对图像的色调进行调整。 两种方法结合可以达到更大程度的图像色调增强。 调整hue值 __author__ TracelessLe __website__ https://blog…