基于 Python 的自然语言处理系列(73):RAG-Agent-Tools

1. 代理(Agents)

        代理的核心思想是使用大语言模型(LLM)来决定执行一系列操作的顺序。在链(Chains)中,操作顺序是硬编码在代码中的,而在代理(Agents)中,语言模型用于推理决定采取哪些行动以及采取的顺序。

  • LLM(大语言模型):为代理提供推理能力。

  • 工具(Tools):执行特定功能的函数,如 Google 搜索、数据库查询、Python 计算等。

  • 代理(Agent):用于管理工具并决定执行哪些操作。

2. 环境准备

# 安装必要的依赖
!pip install langchain-community
!pip install langchain-core
!pip install langchain-experimental
!pip install langchain==0.0.354
!pip install langchainhub

3. 加载 LLM

import os
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, BitsAndBytesConfig, pipeline
from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline

# 设置 GPU 设备
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

model_id = "models/fastchat-t5-3b-v1.0"

# 加载 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token_id = tokenizer.eos_token_id

bitsandbyte_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True
)

model = AutoModelForSeq2SeqLM.from_pretrained(
    model_id,
    quantization_config=bitsandbyte_config,
    device_map='auto',
    load_in_8bit=True,
)

pipe = pipeline(
    task="text2text-generation",
    model=model, 
    tokenizer=tokenizer, 
    max_new_tokens=256, 
    model_kwargs={ "temperature": 0, "repetition_penalty": 1.5 },
)

llm = HuggingFacePipeline(pipeline=pipe)

4. 工具(Tools)

        代理需要访问特定的工具,并且这些工具需要被清晰描述,以便 LLM 正确调用。

4.1 检索工具(Retriever Tool)
from langchain.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS
from langchain.agents.agent_toolkits import create_retriever_tool

# 加载文档
nlp_document = './docs/pdf/SpeechandLanguageProcessing_3rd_07jan2023.pdf'
loader = PyMuPDFLoader(nlp_document)
documents = loader.load()

# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=700, chunk_overlap=100)
docs = text_splitter.split_documents(documents)

# 向量数据库
embedding_model = HuggingFaceInstructEmbeddings(model_name='hkunlp/instructor-base', model_kwargs={'device': device})
vectordb = FAISS.from_documents(docs, embedding_model)
retriever = vectordb.as_retriever()

# 创建工具
retriever_tool = create_retriever_tool(
    retriever=retriever,
    name="search_nlp_stanford",
    description="搜索并返回关于 NLP 斯坦福课程的相关文档。",
)
4.2 搜索工具(Search Tool)
!pip install google-search-results

from langchain.agents.load_tools import load_tools
os.environ['SERPAPI_API_KEY'] = "your_serpapi_key"

tool_names = ["serpapi"]
list_load_tools = load_tools(tool_names)
google_search_tools = list_load_tools[0]
4.3 计算工具(Calculator Tool)
from langchain.chains import LLMMathChain
from langchain.agents import Tool

calculator = LLMMathChain.from_llm(llm=llm, verbose=True)
calculator_tool = Tool(
    name="Calculator",
    func=calculator.run,
    description="用于数学计算的问题。",
)
4.4 SQL 数据库工具(SQL Tool)
from langchain.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain

# 连接数据库
db = SQLDatabase.from_uri("sqlite:///docs/sql/Chinook.db")
db_chain = SQLDatabaseChain.from_llm(llm=llm, db=db, verbose=True)

db_tool = Tool(
    name='ChinookSearch',
    func=db_chain.run,
    description="用于查询 Chinook 数据库。",
)

5. 代理(Agent)

        代理的主要输入包括:

  • 工具(Tools):可用工具的描述

  • 用户输入(User Input):需要完成的目标

  • 中间步骤(Intermediate Steps):已执行的操作及其结果

        代理的输出是下一个要执行的操作或最终的用户响应。

from langchain.agents import AgentExecutor

# 定义代理可用的工具
tools = [retriever_tool, google_search_tools, db_tool]

# 打印工具信息
for tool in tools:
    print(tool.name)
    print(tool.description)
    print("="*100)

# 创建代理
agent_executor = AgentExecutor(
    agent=agent, 
    tools=tools, 
    verbose=True
)

# 测试代理
result = agent_executor.invoke({"input": "什么是 Transformers?"})
print(result)

6. 总结

        本篇文章介绍了如何基于 Python 和 LangChain 实现一个支持多种工具(搜索、检索、计算、数据库查询等)的智能代理。该代理基于 LLM 进行推理,并动态决定执行哪些工具,以满足用户的查询需求。

        欢迎在实际项目中尝试扩展更多工具,并优化 LLM 代理的能力!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值