首页 > 其他分享 >手把手教你用 LangChain 实现大模型 Agent

手把手教你用 LangChain 实现大模型 Agent

时间:2024-08-22 18:23:17浏览次数:14  
标签:LangChain 教你用 Agent langchain Agents agent LLM import 模型

关于智能体(Agents)

图片
通常,大型语言模型(LLM)通常通过RAG(Retrieval-Augmented Generation)架构来增强其存储器能力。然而,LLM智能体(LLM Agents)不仅能增强存储器,还将推理、工具、答案和操作都集成到了其系统中。

LLMS是一种人工智能技术,可以生成类似人类语言的文本,而LLM智能体则是一种扩展了LLMS的系统,它可以执行更复杂的任务,例如搜索信息、使用工具和执行操作。

本文给大家介绍如何从头开始构建LLM智能体系统。

步骤1:规划

图片简单的“输入-输出”LLM使用方式与思维链、具有自洽性的思维链、思维树等技术之间的视觉差异。

LLM的性能得到不断的改进,有许多技术和方法用来提升。我们探讨以下技术:

  • 思维链(Chain of Thought):这是一种逐步思考的技术,模型被要求按步骤进行推理,从而实现自我纠正。这种方法有助于改善模型的输出质量。

  • 具有自洽性的思维链(Chain of Thought with Self-Consistency):这是对思维链的进一步发展,强调了模型在思考过程中保持一致性的重要性。模型在不同步骤之间保持一致,以提高输出的准确性。

  • 思维树(Tree of Thoughts):这是一种更广义的方法,其中多个思维被创建、重新评估并合并,以生成最终的输出。这种方法允许模型在不同路径上探索多个可能性,从而更全面地理解输入并生成更好的回复。

这些技术的应用有助于改善大型语言模型在各种自然语言处理任务上的性能,使其更加强大和灵活。

本文大量使用了Langsmith平台,该平台用于生产化LLM应用程序。例如,在构建思维树提示时,将子提示保存在提示存储库中,然后进行加载:

from langchain import hub
from langchain.chains import SequentialChain

cot_step1 = hub.pull("rachnogstyle/nlw_jan24_cot_step1")
cot_step2 = hub.pull("rachnogstyle/nlw_jan24_cot_step2")
cot_step3 = hub.pull("rachnogstyle/nlw_jan24_cot_step3")
cot_step4 = hub.pull("rachnogstyle/nlw_jan24_cot_step4")

model = "gpt-3.5-turbo"

chain1 = LLMChain(
llm=ChatOpenAI(temperature=0, model=model),
prompt=cot_step1,
output_key="solutions"
)

chain2 = LLMChain(
llm=ChatOpenAI(temperature=0, model=model),
prompt=cot_step2,
output_key="review"
)

chain3 = LLMChain(
llm=ChatOpenAI(temperature=0, model=model),
prompt=cot_step3,
output_key="deepen_thought_process"
)

chain4 = LLMChain(
llm=ChatOpenAI(temperature=0, model=model),
prompt=cot_step4,
output_key="ranked_solutions"
)

overall_chain = SequentialChain(
chains=[chain1, chain2, chain3, chain4],
input_variables=["input", "perfect_factors"],
output_variables=["ranked_solutions"],
verbose=True
)

在这里想说明的是在像Langsmith这样的LLMOps系统中定义推理步骤和版本化它们的正确过程。此外,还可以在公共存储库查看其他流行推理技术的示例,如ReAct或带搜索功能的 Self-ask:

prompt = hub.pull("hwchase17/react")
prompt = hub.pull("hwchase17/self-ask-with-search")

其他值得注意的方法包括:

  • 反思(Reflexion):用于使Agents具有动态内存和自我反思能力,以提高推理技能。

  • 回顾链(Chain of Hindsight):鼓励模型查看过去的输出序列,以改善自身输出,从而更好地满足用户需求。

第2步:内存

图片我们可以将大脑中不同类型的记忆映射到LLM架构的各个组成部分上

  • 感官记忆:这个记忆组件捕捉了直接的感官输入,如我们所看到的、听到的或感觉到的。在提示工程和人工智能模型中,提示是一种短暂的输入,类似于瞬时触感,用于触发模型进行处理。它是初始的刺激,引导模型生成相应的输出。

  • 短期记忆:短期记忆暂时保存信息,通常与正在进行的任务或对话相关。在提示工程中,这相当于保留最近的聊天历史记录。这种记忆使Agents能够在互动过程中保持上下文和一致性,确保响应与当前对话相匹配。在代码中,通常将其添加为对话历史记录:

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain.agents import AgentExecutor
from langchain.agents import create_openai_functions_agent

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
tools = [retriever_tool]
agent = create_openai_functions_agent(
llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

message_history = ChatMessageHistory()
agent_with_chat_history = RunnableWithMessageHistory(
agent_executor,
lambda session_id: message_history,
input_messages_key="input",
history_messages_key="chat_history",
)

  • 长期记忆:长期记忆存储事实性知识和程序性指示。在人工智能模型中,这表现为用于训练和微调的数据。此外,长期记忆还支持RAG框架的操作,使Agents能够访问并将已学信息合并到其响应中。就像是Agents提供有关和相关输出的全面知识存储库一样。在代码中,通常将其添加为向量化数据库:
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

loader = WebBaseLoader("https://neurons-lab.com/")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()

步骤3:工具

图片在实际操作中,希望通过单独的推理链来增强Agents(可以是另一种 LLM,即特定领域或另一种用于图像分类的 ML 模型),或者使用基于规则或API的方法来增强Agents。

ChatGPT Plugins 和 OpenAI API 函数调用就是利用工具使用能力增强 LLM 在实践中发挥作用的良好范例。

  • 内置Langchain工具:Langchain内置了一系列工具,从互联网搜索和Arxiv工具包到Zapier和雅虎财经。本文使用Tavily提供的互联网搜索:
from langchain.utilities.tavily_search import TavilySearchAPIWrapper
from langchain.tools.tavily_search import TavilySearchResults

search = TavilySearchAPIWrapper()
tavily_tool = TavilySearchResults(api_wrapper=search)

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.0)
agent_chain = initialize_agent(
[retriever_tool, tavily_tool],
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
)

  • 自定义工具:定义自己的工具也非常简单。以计算字符串长度的工具为例进行分析。需要使用@tooldecorator让Langchain知道这个工具。然后,不要忘记输入和输出的类型。但最重要的部分是函数注释之间的""" """ ——这就是Agents如何知道这个工具是做什么的,并将此描述与其他工具的描述进行比较:
from langchain.pydantic_v1 import BaseModel, Field
from langchain.tools import BaseTool, StructuredTool, tool

@tool
def calculate_length_tool(a: str) -> int:
"""The function calculates the length of the input string."""
return len(a)

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.0)
agent_chain = initialize_agent(
[retriever_tool, tavily_tool, calculate_length_tool],
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
)

你可能会看到一个错误——它没有正确提取Neurons Lab公司的描述,尽管调用了正确的自定义长度计算函数,最终结果却是错误的。可以试着进行修复。

步骤4:整合在一起

可以将所有架构部件组合在一起成为简洁版本。注意,可以很容易地分解并单独定义:

  • 所有类型的工具(搜索、自定义工具等)

  • 所有类型的记忆(感知作为提示,短期作为可运行消息历史记录,并在提示中作为素描板,以及长期作为从向量数据库检索)

  • 任何类型的规划策略(作为从LLMOps系统拉取的提示的一部分)

最终的Agents定义会像这样简单:

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_with_chat_history = RunnableWithMessageHistory(
agent_executor,
lambda session_id: message_history,
input_messages_key="input",
history_messages_key="chat_history",
)

我们定义了一个完整的架构,其中短期记忆起着至关重要的作用。Agents获得了消息历史记录和一个作为推理结构的素描板,使其能够拉取正确的网站描述并计算其长度。

结束语

希望本文关于LLM Agents架构的核心元素的讲解对读者有所帮助。这里再次强调LLM Agents中所有元素的重要性。比如缺少短期记忆或者工具的描述不完整会影响LLM Agents的推理并提供错误的答案,即使是对于简单任务也是如此。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

标签:LangChain,教你用,Agent,langchain,Agents,agent,LLM,import,模型
From: https://blog.csdn.net/xiangxueerfei/article/details/141434802

相关文章

  • 基于大模型(LLM)的Agent 应用开发
    目前,业界一般认为基于大模型的应用集中在两个方向上:RAG和Agent,无论哪一种应用,设计、实现和优化能够充分利用大模型(LLM)潜力的应用都需要大量的努力和专业知识。随着开发人员开始创建日益复杂的LLM应用程序,开发流程不可避免地变得更加复杂。那么,什么又是Agent呢?1.什么......
  • Voice agent connected!回顾一场 24 小时的黑客松
       ......
  • AI大模型应用开发实战-Agent应用对话情感优化
    1使用prompt设计agent性格与行为添加系统prompt:代码语言:python代码运行次数:0复制CloudStudio代码运行self.SYSTEMPL="""你是一个非常厉害的算命先生,你叫JavaEdge人称Edge大师。以下是你的个人设定:1.你精通阴阳五行,能够算命、紫薇斗数、姓名测算......
  • 小琳AI课堂:agent和智能体
    ......
  • Summarization with Langchain
    教程链接—https://youtu.be/w6wOhSThnoo摘要是自然语言处理(NLP)的一个关键方面,它能够将大量文本浓缩成简洁的摘要。LangChain,作为NLP领域中的一个强大工具,提供了三种不同的摘要技术:stuff、map_reduce和refine。每种方法都有其独特的优点和局限性,使它们适用于不同的情况。本文深......
  • 大模型入门书籍推荐:动手做AI Agent(PDF版免费下载)
    动手做AIAgent人工智能时代一种全新的技术Agent正在崛起。这是一种能够理解自然语言并生成对应回复以及执行具体行动的人工智能体。它不仅是内容生成工具,而且是连接复杂任务的关键纽带。本书将探索Agent的奥秘,内容包括从技术框架到开发工具,从实操项目到前沿进展,通过带着......
  • 主流AI Agent框架对比,让你轻松构建企业专属大模型!
    大模型的出现为AIAgent提供了足够聪明的“大脑”,并重新定义了AIAgent。各大科技公司正在投入巨额资金来创建AIAgent,包括OpenAI的SamAltman在内的许多专家都表示,AIAgent已成为下一个大热门方向。AIAgent是感知环境并采取行动以实现特定目标或目的的软件或系统。可以是简单......
  • sign_and_send_pubkey: signing failed: agent refused operation
    报错描述ssh连接远程主机时,出现sign_and_send_pubkey:signingfailed:agentrefusedoperation错误,并且还是需要输入密码实验环境Master[root@kvm-master~]#ssh-copy-id-i.ssh/id_rsa.pubroot@kvm-slave/usr/bin/ssh-copy-id:INFO:Sourceofkey(s)tobeinstal......
  • 手把手教你用Go开发客户端软件(使用Go + HTML)
    开发桌面客户端软件一直是程序员的常见任务之一,而Go语言凭借其简洁、高效以及丰富的第三方库,越来越多地被用于开发各类应用程序。今天我们将结合Go语言和HTML,使用开源项目Sciter的Go绑定库go-sciter,为大家展示如何用最少的开发精力构建一个跨平台的桌面客户端。什么是......
  • 一个AI原生数据应用数据库开发框架,专为数据3.0时代设计,支持私域问答、多数据源交互、
    前言在数字化转型的浪潮中,企业在数据处理和分析方面面临着巨大的挑战。传统软件往往存在复杂的数据库交互、低效的数据整合流程以及缺乏智能化数据分析能力等痛点。这些问题不仅拖慢了企业决策的步伐,也限制了创新的发展。因此,急需一款能够简化数据库交互、智能化数据处理的软......