LangChain 实践之工具使用

news2024/12/24 2:15:18

参考:LangChain中文入门教程

LangChain官网

通过 Google 搜索并返回答案

import os
os.environ["OPENAI_API_KEY"] = "xxx"
os.environ['SERPAPI_API_KEY'] = "xxx"

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI



# First, let's load the language model we're going to use to control the agent.
llm = OpenAI(temperature=0)

# chroma搜索
# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
tools = load_tools(["serpapi", "llm-math"], llm=llm)


# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# Now let's test it out!
agent.run("What was the  high temperature in SF yesterday in Fahrenheit? What 42 raised to the .023 power?")

关于agent type 几个选项的含义:

  • zero-shot-react-description: 根据工具的描述和请求内容的来决定使用哪个工具(最常用)
  • react-docstore: 使用 ReAct 框架和 docstore 交互, 使用Search 和Lookup 工具, 前者用来搜, 后者寻找term, 举例: Wipipedia 工具
  • self-ask-with-search 此代理只使用一个工具: Intermediate Answer, 它会为问题寻找事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 工具
  • conversational-react-description: 为会话设置而设计的代理, 它的prompt会被设计的具有会话性, 且还是会使用 ReAct 框架来决定使用来个工具, 并且将过往的会话交互存入内存

在这里插入图片描述

Gradio工具

stable fiffusion作图

from gradio_tools.tools import StableDiffusionTool
local_file_path = StableDiffusionTool().langchain.run("Please create a photo of a fox riding a skateboard")

在这里插入图片描述

构建本地知识库问答机器人

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI,VectorDBQA
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA

# 加载文件夹中的所有txt类型的文件
loader = DirectoryLoader('../source_documents/', glob='*.txt')
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()

# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)

# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
docsearch = Chroma.from_documents(split_docs, embeddings)

# 创建问答对象
qa = VectorDBQA.from_chain_type(llm=OpenAI(), chain_type="stuff", vectorstore=docsearch,return_source_documents=True)
# 进行问答
query = "who the little prince meet first"
result = qa({"query": query})
print(result)

# 链式问答
from langchain.chains.question_answering import load_qa_chain
docs = docsearch.similarity_search(query, include_metadata=True)

llm = OpenAI(temperature=0)
chain = load_qa_chain(llm, chain_type="stuff", verbose=True)
chain.run(input_documents=docs, question=query)

在这里插入图片描述

视频问答


# 加载 youtube 频道
loader = YoutubeLoader.from_youtube_url('https://www.youtube.com/watch?v=9qq6HTr7Ocw')
loader = BiliBiliLoader(['https://www.bilibili.com/video/BV1xt411o7Xu/'])
# loader = BiliBiliLoader(['https://www.bilibili.com/video/BV1Ch411j7Bb']) Return Empty transcript.
# 加载blibili 频道

# 将数据转成 document
documents = loader.load()

# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(
  chunk_size=1000,
  chunk_overlap=20
)

# 分割 youtube documents
documents = text_splitter.split_documents(documents)

# 初始化 openai embeddings
embeddings = OpenAIEmbeddings()

# 将数据存入向量存储
vector_store = Chroma.from_documents(documents, embeddings)
# 通过向量存储初始化检索器
retriever = vector_store.as_retriever()

system_template = """
Use the following context to answer the user's question.
If you don't know the answer, say you don't, don't try to make it up. And answer in Chinese.
-----------
{context}
-----------
{chat_history}
"""

# 构建初始 messages 列表,这里可以理解为是 openai 传入的 messages 参数
messages = [
  SystemMessagePromptTemplate.from_template(system_template),
  HumanMessagePromptTemplate.from_template('{question}')
]

# 初始化 prompt 对象
prompt = ChatPromptTemplate.from_messages(messages)


# 初始化问答链
qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.1,max_tokens=2048),retriever,condense_question_prompt=prompt)


chat_history = []
while True:
  question = input('问题:')
  # 开始发送问题 chat_history 为必须参数,用于存储对话历史
  result = qa({'question': question, 'chat_history': chat_history})
  chat_history.append((question, result['answer']))
  print(result['answer'])

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

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

相关文章

华为OD机试真题 Java 实现【优秀学员统计】【2023Q1 100分】

一、题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。 请你实现…

进入阿里外包一个月,我离职了

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

设计模式详解之工厂模式

作者:刘文慧 本文将着眼于工厂模式,从简单工厂模式、工厂方法模式和抽象工厂模式出发,展开学习和深入探讨。 ​ 一、概述 我们在进行软件开发时要想实现可维护、可扩展,就需要尽量复用代码,并且降低代码的耦合度&…

SwiftUI 实现一个 iOS 上 Files App 兼容的文件资源管理器

功能需求 在 SwiftUI 中自己白手起家写一个 iOS(或iPadOS)上迷你的文件资源管理器是有些难度滴,不过从 iOS 11 (2017年) 官方引入自家的 Files App 之后,我们就可以借助它的魔力轻松完成这一个功能了。 …

防抖和节流 含义及区别图文详解秒懂

防抖和节流都是为解决短时间内频繁触发某个功能函数而导致的性能问题。比如,触发频率过高而导致响应速度跟不上,以致出现延迟,假死或卡顿的现象。 防抖 图解:一件事情,计划5s以后触发,结果中途意外触发了…

一款可以自动写代码的编辑器,解放你的双手

Cursor 是集成了 GPT-4 的 IDE 工具,目前免费并且无需 API Key,支持 Win、Mac、Linux 平台,可以按要求生成代码,或者让 AI 帮助优化代码,分析代码。Cursor目前已经集成了openai的GPT-4,它或将彻底改变我们写…

gdb调试 与 coredump

gdb调试 与 coredump调试 1. 启动gdb2.gdb中的相关命令3. coredump调试(附属于gdb调试中一种,当程序出现错误时,会使用coredump调试)1)coredump是什么?2)前期设置3)什么情况下会导致…

JavaEE进阶5/25

1.五大类注解详解(重点 1.Controller 控制器,用于业务逻辑层,来控制用户的行为。它用来检查用户参数的有效性。 当用户的参数有效的话会继续分发到服务层。controller可以理解为程序的安保系统 2.Service 服务层。归属服务层,调用…

MySQL---SQL优化上(explain分析执行计划、查看SQL的执行效率、定位低效率SQL)

1. 查看SQL的执行效率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当前数据库的主要操作类型。 --下面的命令显示了当前 session 中所有统计参数的值 show session status like Com____…

【滴水逆向P77】加载进程(PE查看器)应用程序源码解析

在上一篇文章中讲解了通用控件,做了一个基本的加载进程(PE查看器)的应用程序项目,Win32通用控件,加载进程(PE查看器)项目初步,大家如果有不懂的可以去看看,由于不是很了解…

如何搭建一个高效、可靠的积分商城系统?

互联网购物的普及,积分商城系统已经成为商家和消费者之间互动的一种常见方式。它不仅可以帮助商家增加品牌影响力,还可以提高顾客体验,从而增加销售额。下面就如何搭建一个高效、可靠的积分商城系统作一些简单介绍。 第一步:确定需…

MyBatis源码学习三之查询主逻辑

MyBatis源码学习三之查询主逻辑 继续上一章节。 MyBatis的一个主要流程图。从图中可以看出,核心的东西主要集中在3个Handler中。分别是入参处理,执行sql语句处理,以及返回结果处理。 一 实例 Test public static void main(String[] args…

Revit建模|10种方法帮你解决Revit操作卡顿!

大家好,这里是建模助手。 相信各位BIMer在使用Revit建模时,肯定遇到过软件加载慢或者程序未响应的现象。我们经过测试发现,除了硬件配置及软件本身的问题以外,建模习惯及软件使用方法不当也会造成软件卡顿。 以下就是我们总结的…

TPlinker解读

参考: 关系抽取之TPLinker解读加源码分析 TPLinker 实体关系抽取代码解读 实体关系联合抽取:TPlinker TPLinker中文注释版 Tagging TPLinker模型需要对关系三元组(subject, relation, object)进行手动Tagging,过程分为三部分: &…

阿里面试,HR说我不配21K,直接翻脸.....

好家伙,这奇葩事可真是多,前两天和粉丝聊天,他说前段时间面试阿里的测开岗,最后和面试官干起来了。 我问他为什么,他说没啥,就觉得面试官太装了,我说要21K,他说太高了,说…

【全国产龙芯平台】迅为iTOP-LS3A5000_7A2000开发板+银河麒麟操作系统

硬件准备 1.M.2.ssd硬盘(最好大于等于128G); 2.迅为LS3A5000开发板; 3.U盘(需大于8g),制作启动盘使用; 4.hdmi显示器; 5.搭载linux环境的计算机。 安装步骤 1 制作…

【多线程】两阶段终止模式

目录 一、两阶段终止模式说明二、错误思路三、实现思路图四、实现思路五、方法说明六、interrupt实现6.1 代码示例6.2 示例截图 七、volatile实现7.1 代码示例7.2 示例截图 一、两阶段终止模式说明 1.在一个线程t1中优雅地终止另一个线程t2,指终止t2线程前&#xff…

【C++】位图/布隆过滤器+海量数据处理

✍作者:阿润菜菜 📖专栏:C 文章目录 前言一 位图1.位图法介绍2.位图实现的细节 二、布隆过滤器1.布隆过滤器概念2.布隆过滤器实现 三、海量数据处理1. 位图应用2. 哈希切割3. 布隆过滤器 前言 题目 给40亿个不重复的无符号整数,没…

Java

FileOutputStream写数据的3种方式 void write(int b) //一次写一个字节的数据 void write(byte[] b) //一次写一个字节数组数据 void write(byte[] b, int off,int len) //一次写一个字节数组的部分数据 参数一:数组;参数二:起始索引 0;参数三:个数换行: windows:“\r\n” lin…

springboot+java小区社区宽带安装管理系统

本次程序软件的开发的目的就是让使用者可以通过使用该软件提高信息数据的管理效率,同时该程序软件也需要针对不同的操作用户设置对应的功能,因此,此程序的操作流程应该尽量与用户日常操作软件的行为习惯相贴合,另外,程…