无限可能LangChain——构建代理

(14-2)Langchin基础知识:使用LangChain构建应用 上下文压缩是指对文本中的上下文信息进行压缩或简化,以便在给定的令牌数量限制下处理文档。在处理文档时需要进行上下文压缩工作,因为 Llama2 模型的最大令牌数量为 2048。(1)请看下面的代码,功能是使用库 LangChain创建一个上下文压缩的检索器。 阅读详情

单独来看,语言模型无法采取行动 - 它们只能输出文本。LangChain的一个重要用例是创建代理。代理是使用LLM作为推理引擎的系统,用于确定要采取的行动以及这些行动的输入应该是什么。然后,这些行动的结果可以反馈给代理,并确定是否需要更多的行动,或者是否可以结束。

在本教程中,我们将构建一个可以与多个不同工具进行交互的代理:一个是本地数据库,另一个是搜索引擎。您将能够向该代理提问,观察它调用工具,并与它进行对话。

概念

我们将涵盖的概念是:

  • • 使用语言模型[1],特别是它们的工具调用能力

  • • 创建Retriever[2]以向我们的代理公开特定信息

  • • 使用搜索工具[3]在线查找内容

  • • 使用LangGraph代理[4],它使用LLM来思考要做什么,然后执行它

  • • 使用LangSmith[5] 调试和跟踪您的应用程序

安装

LangChain 支持 Python 和 JavaScript 两个开发版本,我们这个分享使用 python3.11 版本进行讲解。

  1. 安装 Python 参考文档:python安装[14]

  2. 安装 langchain (版本 v0.2):

pip install langchain

tavily

集成存在于 langchain-community 包中。我们还需要安装 tavily-python 包本身。

pip install -U langchain-community tavily-python langgraph

定义工具

我们首先需要创建我们想要使用的工具。我们将使用两个工具: Tavily[6](在线搜索),然后是我们将创建的本地索引上的检索器。

Tavily[7]

我们在LangChain中有一个内置工具,可以轻松地使用Tavily搜索引擎作为工具。请注意,这需要一个API密钥。但是如果你没有或者不想创建一个,你可以忽略这一步。

Tavily :https://tavily.com/。创建API密钥后,您需要将其导出为:

image.png

export TAVILY_API_KEY="..."
from langchain_community.tools.tavily_search import TavilySearchResults  
  
search = TavilySearchResults(max_results=1)  
  
result = search.invoke("今天重庆的天气预报")  
print(result)

image.png

**API Reference:**TavilySearchResults[8]

Retriever

我们还将在我们自己的一些数据上创建一个检索器。有关此处每个步骤的更深入解释,请参阅 教程[9]。

安装依赖:

pip install faiss-cpu
from langchain_community.document_loaders import WebBaseLoader  
from langchain_community.vectorstores import FAISS  
from langchain_community.embeddings import DashScopeEmbeddings  
from langchain_text_splitters import RecursiveCharacterTextSplitter  
  
loader = WebBaseLoader("https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5")  
docs = loader.load()  
documents = RecursiveCharacterTextSplitter(  
    chunk_size=1000, chunk_overlap=200  
).split_documents(docs)  
vector = FAISS.from_documents(documents, DashScopeEmbeddings())  
retriever = vector.as_retriever()  
  
result = retriever.invoke("灵积模型是什么?")  
print(result)

**API Reference:**WebBaseLoader[10] | FAISS[11] | OpenAIEmbeddings[12] | RecursiveCharacterTextSplitter[13]

现在我们已经填充了我们将进行检索的索引,我们可以很容易地将其转换为工具(代理正确使用它所需的格式)

from langchain.tools.retriever import create_retriever_tool  
  
retriever_tool = create_retriever_tool(  
    retriever,  
    "搜索灵积模型",  
    "搜索灵积模型的信息,你可以使用这个工具!",  
)

**API Reference:**create_retriever_tool[14]

工具列表

现在我们已经创建了两者,我们可以创建一个我们将在下游使用的工具列表。

# 创建工具列表  
toolList = [search, retriever_tool]

使用语言模型

接下来,让我们通过调用工具来学习如何使用语言模型。LangChain 支持许多不同的语言模型,您可以互换使用-在下面选择您要使用的语言模型!

LangChain 支持内置的 Tavily 工具、支持 DashScopeEmbeddings 工具、支持自定义函数工具。

from langchain_community.tools.tavily_search import TavilySearchResults  
search = TavilySearchResults(max_results=1)  
  
  
from langchain_community.document_loaders import WebBaseLoader  
from langchain_community.vectorstores import FAISS  
from langchain_community.embeddings import DashScopeEmbeddings  
from langchain_text_splitters import RecursiveCharacterTextSplitter  
loader = WebBaseLoader("https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5")  
docs = loader.load()  
documents = RecursiveCharacterTextSplitter(  
    chunk_size=1000, chunk_overlap=200  
).split_documents(docs)  
vector = FAISS.from_documents(documents, DashScopeEmbeddings())  
retriever = vector.as_retriever()  
  
  
from langchain.tools.retriever import create_retriever_tool  
retriever_tool = create_retriever_tool(  
    retriever,  
    "search_dashscope_knowledge",  
    "当需要搜索灵积模型相关知识的时候必须使用该工具",  
)  
  
from langchain_core.tools import tool  
@tool  
def multiply(first_int: int, second_int: int) -> int:  
    """两个数的乘积."""  
    return first_int * second_int  
  
  
# 创建工具列表  
toolList = [search, retriever_tool, multiply]  
  
from langchain_community.chat_models.tongyi import ChatTongyi  
llm = ChatTongyi(model="qwen-max")  
llm_with_tools = llm.bind_tools([search, retriever_tool, multiply])  
  
# 未使用工具  
msg = llm.invoke("你好")  
print(msg)  
  
# 建议使用工具:search_dashscope_knowledge  
msg = llm_with_tools.invoke("灵积模型是什么")  
print(msg)  
  
# 建议使用工具:multiply  
msg = llm_with_tools.invoke("计算 10 的 5 倍")  
print(msg)

image.png

LangSmith 日志记录: human: 你好[15] 搜索通义千问模型[16] 自定义工具[17]

image.png

这还没有调用那个工具——大模型只是告诉我们建议使用哪个工具。为了真正调用它,下面我们需要创建我们的代理。

创建代理

我们现在可以在几个查询上运行代理!请注意,目前,这些都是 无状态查询(也就是它不会记住以前的交互)。 请注意,代理将返回最终交互结束时的状态(包括任何输入,我们稍后将看到如何仅获取输出)。

首先,让我们看看当不需要调用工具时它是如何响应的:

# 创建一个代理  
agent_executor = create_react_agent(llm, toolList)
msg = agent_executor.invoke(  
    {"messages": [HumanMessage(content="你好")]}  
)  
print(msg)  

{'messages': [HumanMessage(content='你好', id='3ef97e5e-e34d-4ca9-81e3-fddee5ecb1a7'), AIMessage(content='你好!有什么可以帮助你的吗?', response_metadata={'model_name': 'qwen-max', 'finish_reason': 'stop', 'request_id': '5ac46b01-4af0-9c07-bb72-0871767e00a5', 'token_usage': {'input_tokens': 376, 'output_tokens': 7, 'total_tokens': 383}}, id='run-1e3c757e-7b6d-44d2-9979-c38be2a9d7da-0')]}

image.png

为了准确地看到到底发生了什么(并确保它没有调用工具),我们可以看看 LangSmith[18] 跟踪

现在让我们在一个应该调用检索器的示例上尝试一下

# 建议使用工具:search_dashscope_knowledge  
msg = agent_executor.invoke(  
    {"messages": [HumanMessage(content="灵积模型是什么")]}  
)  
print(msg)
{'messages': [HumanMessage(content='灵积模型是什么', id='af2612cf-5c10-4c1a-a4ef-b2835e4c135b'), AIMessage(content='', additional_kwargs={'tool_calls': [{'function': {'name': 'search_dashscope_knowledge', 'arguments': '{"query": "灵积模型"}'}, 'id': '', 'type': 'function'}]}, response_metadata={'model_name': 'qwen-max', 'finish_reason': 'tool_calls', 'request_id': '91288216-0c80-9f2e-9e41-b5644cd1adf3', 'token_usage': {'input_tokens': 379, 'output_tokens': 22, 'total_tokens': 401}}, id='run-7430443e-0e55-4a01-87de-47ebda298634-0', tool_calls=[{'name': 'search_dashscope_knowledge', 'args': {'query': '灵积模型'}, 'id': ''}]), ToolMessage(content='什么是DashScope灵积模型服务_模型服务灵积(DashScope)-阿里云帮助中心\n\n\n\n\n\n\n\n\n\n\n\n\n产品解决方案文档与社区权益中心定价云市场合作伙伴支持与服务了解阿里云备案控制台\n文档产品文档输入文档关键字查找\n模型服务灵积\n\n\n\n\n产品概述\n\n\n\n\n\n快速入门\n\n\n\n\n\n操作指南\n\n\n\n\n\n开发参考\n\n\n\n\n\n实践教程\n\n\n\n\n\n服务支持\n\n\n\n首页\n\n\n\n模型服务灵积\n\n\n\n产品概述\n\n反馈上一篇:产品简介下一篇:产品计费 \n文档推荐\n\nDashScope灵积模型服务通过标准化的API提供“模型即服务”(Model-as-a-Service,MaaS)。不同于以往以任务为中心的AI API,DashScope构建在面向未来的、以模型为中心的理念下,因此也引入了一些新的概念和术语。开发者可以通过本文了解DashScope灵积模型服务的有关概念和术语,从而更好的使用DashScope进行AI应用开发。模型和模型服务“模型即服务”是DashScope灵积模型服务的本质:让各种模型的能力触手可得。DashScope将各类AI模型通过标准化的封装形成API服务,以方便应用开发者调用。通过DashScope,丰富多样化的模型不仅能通过推理API被集成,也能通过训练微调API实现模型定制化。DashScope为AI模型提供云原生的Serverless服务,使得开发者无需关注模型服务API背后的服务器管理,也可直接获得稳定可靠的服务。此外DashScope也为有需求的用户提供特定模型的独占服务。在DashScope灵积模型服务中,每个模型都拥有其唯一的模型名称字符串。例如,qwen-turbo\xa0代表的是通义千问大模型、paraformer-v1\xa0代表的是Paraformer语音识别模型等等。模型名称字符串是模型的代号,用于在DashScope API中以指定被调用的模型,通过model=‘模型名称字符串’\xa0给出。API-KEYDashScope灵积模型服务使用API-KEY作为调用API的密钥。API-KEY承担了调用鉴权、计量计费等功能。API-KEY被广泛应用于DashScope API中,通过 api-key\n\nAPI详情\n\n\n安装DashScope SDK\n\n\n快速开始\n\n\n快速开始\n\n\n计量计费\n\n\n模型介绍\n\n\n计量计费规则\n\n\n模型体验中心\n\n\n\n本页导读 (0)\n为什么选择阿里云什么是云计算全球基础设施技术先进稳定可靠安全合规分析师报告产品和定价全部产品免费试用产品动态产品定价价格计算器云上成本管理解决方案技术解决方案文档与社区文档开发者社区天池大赛培训与认证权益中心免费试用高校计划企业扶持计划推荐返现计划支持与服务基础服务企业增值服务迁云服务官网公告健康看板信任中心关注阿里云关注阿里云公众号或下载阿里云APP,关注云资讯,随时随地运维管控云服务联系我们:4008013260法律声明Cookies政策廉正举报安全举报联系我们加入我们友情链接阿里巴巴集团淘宝网天猫全球速卖通阿里巴巴国际交易市场1688阿里妈妈飞猪阿里云计算AliOS万网高德UC友盟优酷钉钉支付宝达摩院淘宝海外阿里云盘饿了么© 2009-2024 Aliyun.com 版权所有 增值电信业务经营许可证: 浙B2-20080101 域名注册服务机构许可: 浙D3-20210002 京D3-20220015浙公网安备 33010602009975号浙B2-20080101-4', name='search_dashscope_knowledge', id='fd5f24e8-7316-44c8-bb53-bcc9ae9c68a3', tool_call_id=''), AIMessage(content='DashScope灵积模型服务是阿里云提供的一种“模型即服务”(Model-as-a-Service,MaaS)解决方案。它允许开发者通过标准化API访问多种AI模型,不仅提供了模型的推理API,还支持模型的训练和微调,以便进行定制化服务。不同于传统以任务为中心的AI API,DashScope更侧重于模型本身,使模型能力更易于获取和集成。\n\n每个模型在DashScope中都有一个唯一的模型名称字符串,作为其标识符,用于在API调用中指定所要使用的模型。例如,`qwen-turbo`代表通义千问大模型,`paraformer-v1`代表Paraformer语音识别模型等。\n\n服务的特点包括:\n- **云原生Serverless**:用户无需管理服务器,即可获得稳定、可靠的服务。\n- **API-KEY鉴权与计费**:通过API-KEY进行调用鉴权和计量计费,简化了开发者在集成AI功能时的权限管理和成本控制流程。\n- **模型多样化**:提供丰富的预训练模型,覆盖多种应用场景,如语言处理、图像识别、语音识别等。\n- **可定制化**:用户可根据特定需求对模型进行微调,以更好地适应个性化场景。\n\n总之,DashScope灵积模型服务旨在降低AI应用的开发门槛,加速AI技术的应用落地,让企业和开发者能够更加便捷地利用先进的AI模型来提升产品和服务的智能化水平。', response_metadata={'model_name': 'qwen-max', 'finish_reason': 'stop', 'request_id': 'e0b22a7d-91a3-9a10-b0d5-0d2dba07fe2b', 'token_usage': {'input_tokens': 1176, 'output_tokens': 305, 'total_tokens': 1481}}, id='run-52a6b054-4460-494c-8cca-2c6a3e3a6041-0')]}

image.png

让我们来看看 LangSmith[19]跟踪 看看发生了什么。

image.png

现在让我们尝试一个需要调用自定义工具的示例:

# 建议使用工具:multiply  
msg = llm_with_tools.invoke("计算 10 的 5 倍等于的结果")  
print(msg)
content='' additional_kwargs={'tool_calls': [{'function': {'name': 'multiply', 'arguments': '{"first_int": 10, "second_int": 5}'}, 'id': '', 'type': 'function'}]} response_metadata={'model_name': 'qwen-max', 'finish_reason': 'tool_calls', 'request_id': '7896135e-75e2-93e3-af68-2edb0af85023', 'token_usage': {'input_tokens': 387, 'output_tokens': 25, 'total_tokens': 412}} id='run-987b56a8-5a09-4d68-a217-9bf8459350da-0' tool_calls=[{'name': 'multiply', 'args': {'first_int': 10, 'second_int': 5}, 'id': ''}]

我们可以去看看 LangSmith跟踪[20] 以确保它有效地调用搜索工具。

image.png

流式消息

我们已经看到了如何使用.invoke调用代理以获取最终响应。如果代理正在执行多个步骤,这可能需要一段时间。为了显示中间进度,我们可以在消息发生时流回消息。

for chunk in agent_executor.stream(  
    {"messages": [HumanMessage(content="你好")]}  
):print(chunk)  
print("----")  
  
  
# 建议使用工具:search_dashscope_knowledge  
for chunk in agent_executor.stream(  
    {"messages": [HumanMessage(content="灵积模型是什么")]}  
):print(chunk)  
print("----")  
  
  
# 建议使用工具:multiply  
for chunk in llm_with_tools.stream("计算 10 的 5 倍的结果"):print(chunk)  
print("----")
{'agent': {'messages': [AIMessage(content='你好!有什么可以帮助你的吗?', response_metadata={'model_name': 'qwen-max', 'finish_reason': 'stop', 'request_id': 'f6587cb5-91d9-9abe-a314-2603e821293d', 'token_usage': {'input_tokens': 376, 'output_tokens': 7, 'total_tokens': 383}}, id='run-0ac0c665-226f-4f4e-9c6d-e48db1122731-0')]}}  
----  
{'agent': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'function': {'name': 'search_dashscope_knowledge', 'arguments': '{"query": "灵积模型"}'}, 'id': '', 'type': 'function'}]}, response_metadata={'model_name': 'qwen-max', 'finish_reason': 'tool_calls', 'request_id': 'e116a070-fc52-9585-8379-8bbac48c92c9', 'token_usage': {'input_tokens': 379, 'output_tokens': 22, 'total_tokens': 401}}, id='run-a0d58c7f-8534-47e5-8208-462ba2cc975c-0', tool_calls=[{'name': 'search_dashscope_knowledge', 'args': {'query': '灵积模型'}, 'id': ''}])]}}  
{'tools': {'messages': [ToolMessage(content='什么是DashScope灵积模型服务_模型服务灵积(DashScope)-阿里云帮助中心\n\n\n\n\n\n\n\n\n\n\n\n\n产品解决方案文档与社区权益中心定价云市场合作伙伴支持与服务了解阿里云备案控制台\n文档产品文档输入文档关键字查找\n模型服务灵积\n\n\n\n\n产品概述\n\n\n\n\n\n快速入门\n\n\n\n\n\n操作指南\n\n\n\n\n\n开发参考\n\n\n\n\n\n实践教程\n\n\n\n\n\n服务支持\n\n\n\n首页\n\n\n\n模型服务灵积\n\n\n\n产品概述\n\n反馈上一篇:产品简介下一篇:产品计费 \n文档推荐\n\nDashScope灵积模型服务通过标准化的API提供“模型即服务”(Model-as-a-Service,MaaS)。不同于以往以任务为中心的AI API,DashScope构建在面向未来的、以模型为中心的理念下,因此也引入了一些新的概念和术语。开发者可以通过本文了解DashScope灵积模型服务的有关概念和术语,从而更好的使用DashScope进行AI应用开发。模型和模型服务“模型即服务”是DashScope灵积模型服务的本质:让各种模型的能力触手可得。DashScope将各类AI模型通过标准化的封装形成API服务,以方便应用开发者调用。通过DashScope,丰富多样化的模型不仅能通过推理API被集成,也能通过训练微调API实现模型定制化。DashScope为AI模型提供云原生的Serverless服务,使得开发者无需关注模型服务API背后的服务器管理,也可直接获得稳定可靠的服务。此外DashScope也为有需求的用户提供特定模型的独占服务。在DashScope灵积模型服务中,每个模型都拥有其唯一的模型名称字符串。例如,qwen-turbo\xa0代表的是通义千问大模型、paraformer-v1\xa0代表的是Paraformer语音识别模型等等。模型名称字符串是模型的代号,用于在DashScope API中以指定被调用的模型,通过model=‘模型名称字符串’\xa0给出。API-KEYDashScope灵积模型服务使用API-KEY作为调用API的密钥。API-KEY承担了调用鉴权、计量计费等功能。API-KEY被广泛应用于DashScope API中,通过 api-key\n\nAPI详情\n\n\n安装DashScope SDK\n\n\n快速开始\n\n\n快速开始\n\n\n计量计费\n\n\n模型介绍\n\n\n计量计费规则\n\n\n模型体验中心\n\n\n\n本页导读 (0)\n为什么选择阿里云什么是云计算全球基础设施技术先进稳定可靠安全合规分析师报告产品和定价全部产品免费试用产品动态产品定价价格计算器云上成本管理解决方案技术解决方案文档与社区文档开发者社区天池大赛培训与认证权益中心免费试用高校计划企业扶持计划推荐返现计划支持与服务基础服务企业增值服务迁云服务官网公告健康看板信任中心关注阿里云关注阿里云公众号或下载阿里云APP,关注云资讯,随时随地运维管控云服务联系我们:4008013260法律声明Cookies政策廉正举报安全举报联系我们加入我们友情链接阿里巴巴集团淘宝网天猫全球速卖通阿里巴巴国际交易市场1688阿里妈妈飞猪阿里云计算AliOS万网高德UC友盟优酷钉钉支付宝达摩院淘宝海外阿里云盘饿了么© 2009-2024 Aliyun.com 版权所有 增值电信业务经营许可证: 浙B2-20080101 域名注册服务机构许可: 浙D3-20210002 京D3-20220015浙公网安备 33010602009975号浙B2-20080101-4', name='search_dashscope_knowledge', tool_call_id='')]}}  
{'agent': {'messages': [AIMessage(content='DashScope灵积模型服务是阿里云提供的一种“模型即服务”(Model-as-a-Service,MaaS)解决方案。它允许开发者访问和利用多种人工智能模型,而无需直接管理底层基础设施或复杂的模型部署。与传统以任务为中心的AI API不同,DashScope侧重于以模型为中心的方法,使得模型的能力更易于获取和应用。\n\n### 关键特点:\n\n- **模型多样化**: DashScope集成了多种AI模型,涵盖自然语言处理、图像识别、语音识别等多种领域,如通义千问大模型(qwen-turbo)、Paraformer语音识别模型(paraformer-v1)等。\n  \n- **标准化API接口**: 所有模型都通过标准化的API提供服务,便于开发者集成到自己的应用程序中,只需指定模型名称即可调用相应的服务。\n\n- **云原生Serverless服务**: DashScope以Serverless方式提供模型服务,这意味着开发者无需担心服务器管理和运维,即可获得稳定、弹性的模型服务支持。\n\n- **API-KEY鉴权与计费**: 通过API-KEY进行调用鉴权和计量计费,确保服务的安全可控及透明计费。\n\n- **模型定制化能力**: 不仅提供模型推理服务,还支持对特定模型进行训练微调,以满足用户的个性化需求。\n\n- **服务模式灵活**: 提供既有共享模型服务,也有针对特定需求的独占模型服务选项。\n\n总之,DashScope灵积模型服务降低了企业和开发者应用先进AI技术的门槛,使其能够更加聚焦于业务创新和模型的应用,而非模型的搭建和运维。', response_metadata={'model_name': 'qwen-max', 'finish_reason': 'stop', 'request_id': '8730206d-bd5f-98f2-a23b-0ef2d3c8e8d0', 'token_usage': {'input_tokens': 1176, 'output_tokens': 334, 'total_tokens': 1510}}, id='run-a4dddf0b-4ad2-416e-a3c8-f79dc953ee63-0')]}}  
----  
content='' additional_kwargs={'tool_calls': [{'type': 'function', 'function': {'name': 'multiply', 'arguments': ''}, 'id': ''}]} id='run-3eef0407-3cf6-4531-bdc8-9180e0543b50' invalid_tool_calls=[{'name': 'multiply', 'args': '', 'id': '', 'error': None}] tool_call_chunks=[{'name': 'multiply', 'args': '', 'id': '', 'index': 0}]  
content='' additional_kwargs={'tool_calls': [{'type': 'function', 'function': {'name': '', 'arguments': '{"first_int": 1'}, 'id': ''}]} id='run-3eef0407-3cf6-4531-bdc8-9180e0543b50' tool_calls=[{'name': '', 'args': {'first_int': 1}, 'id': ''}] tool_call_chunks=[{'name': '', 'args': '{"first_int": 1', 'id': '', 'index': 0}]  
content='' additional_kwargs={'tool_calls': [{'type': 'function', 'function': {'name': '', 'arguments': '0, "second_int": 5'}, 'id': ''}]} id='run-3eef0407-3cf6-4531-bdc8-9180e0543b50' invalid_tool_calls=[{'name': '', 'args': '0, "second_int": 5', 'id': '', 'error': None}] tool_call_chunks=[{'name': '', 'args': '0, "second_int": 5', 'id': '', 'index': 0}]  
content='' additional_kwargs={'tool_calls': [{'type': 'function', 'function': {'name': '', 'arguments': '}'}, 'id': ''}]} id='run-3eef0407-3cf6-4531-bdc8-9180e0543b50' invalid_tool_calls=[{'name': '', 'args': '}', 'id': '', 'error': None}] tool_call_chunks=[{'name': '', 'args': '}', 'id': '', 'index': 0}]  
content='' additional_kwargs={'tool_calls': [{'type': 'function', 'function': {'name': '', 'arguments': ''}, 'id': ''}]} response_metadata={'finish_reason': 'tool_calls', 'request_id': '1b6594da-f866-94fa-83ab-b812a20678b0', 'token_usage': {'input_tokens': 387, 'output_tokens': 25, 'total_tokens': 412}} id='run-3eef0407-3cf6-4531-bdc8-9180e0543b50' invalid_tool_calls=[{'name': '', 'args': '', 'id': '', 'error': None}] tool_call_chunks=[{'name': '', 'args': '', 'id': '', 'index': 0}]  
----

https://smith.langchain.com/public/de70d1a5-8f4f-4b7e-b98b-98f20abda3c2/r

image.png

https://smith.langchain.com/public/e66cecfe-06fb-447a-91ab-e7ba4a39e668/r

image.png

https://smith.langchain.com/public/50d1ab01-b39c-454d-804a-eaacb1bd61d3/r

image.png

Streaming tokens

除了流回消息之外,流回令牌也很有用。我们可以使用 .astream_events方法。

此.astream_events方法仅适用于Python 3.11或更高版本。

async def main():  
     async for event in agent_executor.astream_events(  
        {"messages": [HumanMessage(content="你好")]},version="v1"  
    ):  
        kind = event["event"]  
        if kind == "on_chain_start":  
            if (  
                event["name"] == "Agent"  
            ):   
                print(  
                    f"Starting agent: {event['name']} with input: {event['data'].get('input')}"  
                )  
        elif kind == "on_chain_end":  
            if (  
                event["name"] == "Agent"  
            ):    
                print()  
                print("--")  
                print(  
                    f"Done agent: {event['name']} with output: {event['data'].get('output')['output']}"  
                )  
        if kind == "on_chat_model_stream":  
            content = event["data"]["chunk"].content  
            if content:  
                print(content, end="|")  
        elif kind == "on_tool_start":  
            print("--")  
            print(  
                f"Starting tool: {event['name']} with inputs: {event['data'].get('input')}"  
            )  
        elif kind == "on_tool_end":  
            print(f"Done tool: {event['name']}")  
            print(f"Tool output was: {event['data'].get('output')}")  
            print("--")  
  
import asyncio  
if __name__ == "__main__":  
    asyncio.run(main())
/opt/homebrew/lib/python3.11/site-packages/langchain_core/_api/beta_decorator.py:87: LangChainBetaWarning: This API is in beta and may change in the future.  
  warn_beta(  
你好|!|有什么|可以帮助你的吗?|% 

内存缓存

如前所述,这个代理是无状态的。这意味着它不记得以前的交互。为了给它内存,我们需要传入一个检查指针。传入检查指针时,我们还必须传入一个 thread_id 调用代理时(因此它知道从哪个线程/对话恢复)。

# 创建缓存  
from langgraph.checkpoint.sqlite import SqliteSaver  
memory = SqliteSaver.from_conn_string(":memory:")  
  
  
# 创建代理  
from langgraph.prebuilt import create_react_agent  
from langchain_core.messages import HumanMessage  
agent_executor = create_react_agent(llm, toolList, checkpointer=memory)  
config = {"configurable": {"thread_id": "abc123"}}
agent_executor = chat_agent_executor.create_tool_calling_executor(  
    model, tools, checkpointer=memory  
)  
  
config = {"configurable": {"thread_id": "abc123"}}
for chunk in agent_executor.stream(  
    {"messages": [HumanMessage(content="你好,我是小明")]},config=config  
):print(chunk)
{'agent': {'messages': [AIMessage(content='你好,小明!很高兴能为你服务。有什么可以帮助你的吗?', response_metadata={'model_name': 'qwen-max', 'finish_reason': 'stop', 'request_id': '9b6a6bc9-0814-990b-8d0e-b57d22accb99', 'token_usage': {'input_tokens': 380, 'output_tokens': 15, 'total_tokens': 395}}, id='run-652cdac8-b1e9-4c9d-9efc-eb0a01bd5d5d-0')]}}
for chunk in agent_executor.stream(  
    {"messages": [HumanMessage(content="我的名字是什么?")]},config=config  
):print(chunk)
{'agent': {'messages': [AIMessage(content='你的名字是小明。', response_metadata={'model_name': 'qwen-max', 'finish_reason': 'stop', 'request_id': '6643c950-f2f1-960e-a38a-24fcb7557099', 'token_usage': {'input_tokens': 409, 'output_tokens': 6, 'total_tokens': 415}}, id='run-4639c443-a3fb-413a-a294-c8a72ee67df2-0')]}}

运行日志: https://smith.langchain.com/public/2813f856-3042-4ae8-88fd-aea5e3b92931/r https://smith.langchain.com/public/1dba567b-446f-47a9-9133-ded23ea64f38/r

结论

就这样结束了!在这个快速的开始中,我们介绍了如何创建一个简单的代理。然后我们展示了如何流回响应——不仅是中间步骤,还有令牌!我们还添加了内存,这样你就可以和他们对话了。代理是一个复杂的话题,有很多东西要学!

有关代理的更多信息,请查看 LangGraph[21] 文档。这有它自己的一组概念、教程和操作指南。

​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

AI大模型探索之路-应用篇9:Langchain框架LangSmith模块-AI模型监控神器 在经过前面多个篇章的学习后,我们已经了解到Langchain框架是一个为开发人员提供的全方位服务方案。从模型封装调用、提示词模板封装、Chain链式操作、检索增强,再到上线部署,它都提供了一站式解决方案。本章将重点讲解最后一个核心框架LangSmith,以补充完整最后的运维监控管理版块。 阅读详情

相关推荐

【AI Agent系列】【LangGraph】2. 再进阶:给你的LangGraph加入循环逻辑(Cycles)

今天我们继续学习 LangGraph 的基础内容。前面两篇文章我们学习了 LangGraph 的[基本用法]和[条件分支],本文继续学习如何利用 LangGraph 实现一个环(循环)结构。

同学小张的博客 1884

tavily - 简单使用

2024-10-18(五)

AI工程化、开源分享、文档翻译、代码笔记 1万+

LVI-SAM适配KITTI数据集避坑指南:IMU频率与数据同步问题解析

本文深入解析了将LVI-SAM框架适配KITTI数据集时,在IMU频率与多传感器数据同步方面遇到的核心挑战与解决方案。针对KITTI数据集中sync与extract两种数据包的差异,文章提供了从数据选择、参数调优到时间戳诊断与修复的完整避坑指南,帮助开发者实现稳定高效的SLAM系统部署。

7z8x2c4v6b9的博客 247

SpringBoot 整合LangChain4j 集成 Tavily 实现联网搜索,如何获取Tavily API_KEY(一篇文章解决AI联网搜索全部问题)

本文介绍了如何通过LangChain4j集成Tavily API实现联网搜索功能。主要内容包括:1)获取Tavily API密钥的步骤;2)项目配置方法,通过YAML文件设置API参数和搜索结果数量限制;3)创建WebSearchConfig类管理搜索配置;4)实现ContentRetriever接口进行内容检索;5)构建WebSearchAgent代理服务,结合@AiService注解完成联网搜索功能。文章提供了完整的代码示例和配置说明,帮助开发者快速集成网络搜索能力到LangChain4j项目中。

2301_80100192的博客 3045

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 333

PLSQL 14.0.6 下载使用教程

众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下,

qq976511508的博客 2134

无限可能LangChain——概念指南之架构

本节包含对 LangChain 关键部分的介绍。

JackWu1024 1883

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4614

无限可能LangChain——构建一个简单的LLM应用程序

在本快速入门中,我们将向您展示如何构建一个简单的LLM应用程序。该应用程序将文本从英语翻译成另一种语言。这是一个相对简单的LLM应用程序——它只是一个LLM调用加上一些提示。尽管如此,这仍然是开始使用LangChain的好方法——只需一些提示和一个LLM调用,就可以构建许多功能!

JackWu1024 1174

AD20 Channel-Offset Error 解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法一、问题现象二、解决办法 前言 AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法 一、问题现象 我们经常在使用Room格式快速布局相同模块电路时出现以下问题, 二、解决办法 相同模块电路PCB布局复制的过程网上有很多,这里不再做赘述,步骤都差不多,只说问题根源; 1:.

m0_47201213的博客 7625

【STM32CubeIDE入门】(一)工程创建&工程配置

​写在前面:如果是刚接触stm32cubeide的同学推荐与这一篇文章共同阅读,能够更加快速认识上手stm32cubeide。 1、打开stm32cubeide,选择好工作目录进入主界面后,点击创建工程。

涛涛子的博客 1万+

无限可能LangChain——开启大模型世界

大语言模型是一种人工智能模型,通常使用深度学习技术(如神经网络)来理解和生成人类语言。这些模型拥有非常多的参数,可以达到数十亿甚至更多,使得它们能够处理高度复杂的语言模式。我们可以将大语言模型视为一个巨大的预测机器,其训练过程基于“猜词”任务:给定一段文本的开头,模型需要预测下一个词是什么。通过大量的训练数据(如互联网上的文本),模型试图理解词语和词组的用法和含义,以及它们如何组合形成意义。通过不断学习和调整参数,模型的预测能力变得越来越准确。

weixin_59191169的博客 1150

UE5 蓝图节点图文大全(300+蓝图,9万字+)

本文采用虚幻5.2.1版本,以图文的方式对蓝图节点进行介绍,包括蓝图节点的输入输出参数解释,并有中英文节点名称可参考。

一碗清深的博客 2万+

langchain-Agent代理详解

Langchain Agent详解

weixin_45626120的博客 1万+

[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)(二十四)

本系统将密码学理论与软件工程实践相结合,为密评备考提供了高效解决方案。随着《密码法》的深入实施,掌握密评知识将成为信息安全从业者的核心竞争力。立即开始您的密码安全专家之旅!(注:实际应用请以最新发布版本为准)

曼岛_的博客 797

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

探索LangChain的无限可能:构建强大的AI应用

LangChain是一种强大的工具,可以用于开发基于自然语言处理的应用。它能够帮助开发者在各种应用场景中快速集成大型语言模型(LLM)。LangChain为构建AI应用提供了极大的便利,通过结合OpenAI等强大的模型,开发者能够更快速地实现智能对话等功能。LangChain 官方文档。

ppoojjj的博客 502

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

无限可能LangChain——构建聊天机器人

这允许用户看到进度。本节我们学习了 Chat Models[20] 、Prompt Templates[21]、Chat History[22] ,是非常有趣和值得去扩展的,快去实践一下吧,创造自己的聊天机器人搭子。我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。请注意,这稍微改变了输入类型-我们不再传递一个消息列表,而是传递一个字典,其中包含一个名为messages的键,其值是一个消息列表。

xxue345678的博客 2560

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Bit v1.6.140 版本解析:watch 增量导入、capsule 复用调试与根级 .bitignore 实战指南

本文以 Bit 仓库的 v1.6.140 版本发布说明([releases-docs/releases/v1.6.140.md](https://link.gitcode.com/i/9f4c799282b48d931584c60975ed91e0))为主线,围绕该版本新增的 `bit watch --import`、`bit build --rewrite/--reinstall`、根级 `.b

gitblog_00481的博客 721

如何用LangChain构建会思考的AI代理:从技术栈到实战突破

在人工智能技术快速演进的今天,构建智能应用不再是少数专家的专利。LangChain作为领先的代理工程平台,正重新定义我们与大型语言模型交互的方式。想象一下,你的AI应用不仅能回答问题,还能自主调用工具、执行复杂任务、甚至进行多轮推理——这正是LangChain带来的变革力量。 ## 当AI遇见工具:智能代理的进化之路 传统AI应用往往停留在简单的问答层面,而现代商业场景需要的是能真正解决问题的

gitblog_00648的博客 383
上一篇: 深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
下一篇: 快手「可灵」爆火:海外AI圈巨震,中国版Sora一号难求
我爱学大模型
博客等级 码龄3年 7883粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值