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 代理的能力!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!