跳至内容

快速入门

本快速入门指南将介绍如何构建一个简单的代理,该代理可以查找互联网上的信息。然后,我们将将其部署到 LangGraph Cloud,使用 LangGraph Studio 可视化和测试它,并使用 LangGraph SDK 与其交互。

设置要求

本教程将使用

  • Anthropic 作为 LLM - 注册并获取 API 密钥 此处
  • Tavily 作为搜索引擎 - 注册并获取 API 密钥 此处
  • LangSmith 作为托管 - 注册并获取 API 密钥 此处

设置本地文件

  1. 使用以下目录和文件创建一个新的应用程序
<my-app>/
|-- agent.py            # code for your LangGraph agent
|-- requirements.txt    # Python packages required for your graph
|-- langgraph.json      # configuration file for LangGraph
|-- .env                # environment files with API keys
<my-app>/
|-- agent.ts            # code for your LangGraph agent
|-- package.json        # Javascript packages required for your graph
|-- langgraph.json      # configuration file for LangGraph
|-- .env                # environment files with API keys
  1. agent.py/agent.ts 文件应包含定义图的代码。以下代码是一个简单的示例,重要的是在文件中的某个地方编译您的图并将编译后的图分配给变量(在本例中为 graph 变量)。此示例代码使用 create_react_agent,这是一个预构建的代理。您可以阅读更多相关信息 此处
from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langgraph.prebuilt import create_react_agent

model = ChatAnthropic(model="claude-3-5-sonnet-20240620")

tools = [TavilySearchResults(max_results=2)]

graph = create_react_agent(model, tools)
import { ChatAnthropic } from "@langchain/anthropic";
import { TavilySearchResults } from "@langchain/community/tools/tavily_search";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const model = new ChatAnthropic({
  model: "claude-3-5-sonnet-20240620",
});

const tools = [
  new TavilySearchResults({ maxResults: 3, }),
];

export const graph = createReactAgent({ llm: model, tools });
  1. requirements.txt/package.json 文件应包含图所需的所有依赖项。在本例中,我们的图运行只需要四个包。
langgraph
langchain_anthropic
tavily-python
langchain_community
{
  "name": "my-app",
  "packageManager": "[email protected]",
  "dependencies": {
    "@langchain/community": "^0.2.31",
    "@langchain/core": "^0.2.31",
    "@langchain/langgraph": "0.2.0",
    "@langchain/openai": "^0.2.8"
  }
}
  1. langgraph.json 文件是一个配置文件,描述了您要托管哪些图。在本例中,我们只有一个要托管的图:来自 agent.py/agent.ts 的编译后的 graph 对象。
{
  "dependencies": ["."],
  "graphs": {
    "agent": "./agent.py:graph"
  },
  "env": ".env"
}
{
  "node_version": "20",
  "dockerfile_lines": [],
  "dependencies": ["."],
  "graphs": {
    "agent": "./src/agent.ts:graph"
  },
  "env": ".env"
}

了解有关 LangGraph CLI 配置文件的更多信息 此处

  1. .env 文件应包含运行图所需的任何环境变量。这仅用于本地测试,因此如果您没有进行本地测试,则可以跳过此步骤。注意:如果您确实添加了此文件,则不应将其检入 git。对于此图,我们需要两个环境变量

    ANTHROPIC_API_KEY=...
    TAVILY_API_KEY=...
    

现在我们已在本地文件系统上设置好所有内容,就可以托管我们的图了。

测试本地图构建

LangGraph Studio Desktop

使用 LangGraph Studio 桌面版可以轻松地本地测试您的图。LangGraph Studio 提供了一种开发 LLM 应用程序的新方法,它提供了一个专门的代理 IDE,可以可视化、交互和调试复杂的代理应用程序。

通过可视化图形和编辑状态的能力,您可以更好地理解代理工作流程并更快地进行迭代。LangGraph Studio 集成了 LangSmith,以便您可以与团队成员协作调试故障模式。

使用 LangGraph CLI

在部署到云端之前,我们可能希望先在本地测试图的构建。这有助于确保我们已正确配置了 CLI 配置文件 以及图是否可以运行。

为此,我们首先可以安装 LangGraph CLI

pip install langgraph-cli

然后,我们可以本地测试我们的 API 服务器。这需要访问 LangGraph 的封闭测试版。为了在本地运行服务器,您需要将您的 LANGSMITH_API_KEY 添加到 .env 文件中,以便我们验证您是否有权访问 LangGraph 的封闭测试版。

langgraph up

这将在本地启动 LangGraph API 服务器。如果成功运行,您应该会看到类似以下内容

Ready!
- API: https://127.0.0.1:8123
2024-06-26 19:20:41,056:INFO:uvicorn.access 127.0.0.1:44138 - "GET /ok HTTP/1.1" 200

您现在可以测试它了!**注意:此本地服务器仅用于本地测试目的,性能不足以用于生产应用程序,因此请勿将其用于此目的。**要测试它,您可以转到另一个终端窗口并运行

curl --request POST \
    --url https://127.0.0.1:8123/runs/stream \
    --header 'Content-Type: application/json' \
    --data '{
    "assistant_id": "agent",
    "input": {
        "messages": [
            {
                "role": "user",
                "content": "How are you?"
            }
        ]
    },
    "metadata": {},
    "config": {
        "configurable": {}
    },
    "multitask_strategy": "reject",
    "stream_mode": [
        "values"
    ]
}'

如果您收到有效的响应,则表示一切正常!

部署到云端

将您的代码推送到 GitHub

<my-app> 目录转换为 GitHub 存储库。如果您愿意,可以使用 GitHub CLI,或者手动创建存储库(如果不熟悉,请参考 此处 的说明)。

使用 LangGraph Cloud 从 GitHub 部署

创建包含已编译图的 Python 文件以及包含图托管配置的 langgraph.json 文件的 GitHub 存储库后,您可以转到 LangSmith 并点击左侧导航栏上的 🚀 图标以创建新的部署。然后点击“+ 新部署”按钮。

Langsmith Workflow

**如果您以前从未部署到 LangGraph Cloud:** 将会出现一个按钮,显示“从 GitHub 导入”。您需要按照此流程将 LangGraph Cloud 连接到 GitHub。

**设置 GitHub 连接后:** 新部署页面将如下所示

Deployment before being filled out

要部署您的应用程序,您应该执行以下操作

  1. 从选择器中选择您的 GitHub 用户名或组织
  2. 在搜索栏中搜索要部署的存储库并选择它
  3. 选择任何名称
  4. 在“LangGraph API 配置文件”字段中,输入 langgraph.json 文件的路径(在本例中仅为 langgraph.json)。
  5. 对于 Git 参考,您可以选择要部署的代码的 Git 分支,或选择确切的提交 SHA。
  6. 如果您的链依赖于环境变量,请在其中添加这些变量。它们将传播到底层服务器,以便您的代码可以访问它们。在本例中,我们需要 ANTHROPIC_API_KEYTAVILY_API_KEY

将所有这些放在一起,您应该为部署详细信息设置如下内容

Deployment filled out

点击“提交”,您的应用程序将开始部署!

检查跟踪 + 监控服务

部署视图

部署完成后,您的部署页面应如下所示

Deployed page

您可以看到,默认情况下,您可以访问“跟踪计数”监控图表和“最近跟踪”运行视图。这些由 LangSmith 提供支持。

您可以点击“所有图表”查看服务器的所有监控信息,或者点击“查看跟踪项目”获取有关单个跟踪的更多信息。

访问文档

您可以通过点击 API 文档链接访问文档,这应该会将您发送到如下所示的页面

API Docs page

在未经授权的情况下,您实际上无法测试任何 API 端点。为此,请获取您的 Langsmith API 密钥并将其添加到顶部“API 密钥 (X-API-KEY)”处。您现在应该能够选择任何 API 端点,点击“测试请求”,输入要传递的参数,然后点击“发送”以查看 API 调用的结果。

通过 LangGraph Studio 与您的部署交互

如果点击您的部署,您应该会看到右上角有一个蓝色按钮,上面写着“LangGraph Studio”。点击此按钮将带您到如下所示的页面

Studio UI before being run

在此页面上,您可以通过传入初始状态并点击“开始运行”来测试您的图(这应该与调用 .invoke 的行为相同)。然后,您将能够查看每次运行的执行线程并探索图为了生成输出而采取的步骤。

Studio UI once being run

与 SDK 结合使用

使用 LangGraph Studio 测试托管图按预期工作后,您可以开始通过使用 LangGraph SDK 在整个组织中使用托管图。让我们看看如何访问托管图并从 python 文件中执行运行。

首先,通过调用 pip install langgraph_sdk 确保已安装 SDK。

在使用之前,您需要获取 LangGraph 部署的 URL。您可以在“部署”视图中找到它。点击 URL 将其复制到剪贴板。

您还需要确保已正确设置 API 密钥,以便您可以对 LangGraph Cloud 进行身份验证。

export LANGSMITH_API_KEY=...

使用 SDK 时,首先要做的是设置我们的客户端、访问我们的助手并创建一个线程来执行运行

from langgraph_sdk import get_client

client = get_client(url=<DEPLOYMENT_URL>)
# get default assistant
assistants = await client.assistants.search()
assistant = [a for a in assistants if not a["config"]][0]
# create thread
thread = await client.threads.create()
print(thread)
import { Client } from "@langchain/langgraph-sdk";

const client = new Client({ apiUrl: <DEPLOYMENT_URL> });
// get default assistant
const assistants = await client.assistants.search();
const assistant = assistants.find(a => !a.config);
// create thread
const thread = await client.threads.create();
console.log(thread)
curl --request POST \
    --url <DEPLOYMENT_URL>/assistants/search \
    --header 'Content-Type: application/json' \
    --data '{
        "limit": 10,
        "offset": 0
    }' | jq -c 'map(select(.config == null or .config == {})) | .[0]' && \
curl --request POST \
    --url <DEPLOYMENT_URL>/threads \
    --header 'Content-Type: application/json' \
    --data '{}'

然后,我们可以在线程上执行运行

input = {"messages":[{"role": "user", "content": "Hello! My name is Bagatur and I am 26 years old."}]}

async for chunk in client.runs.stream(
        thread['thread_id'],
        assistant["assistant_id"],
        input=input,
        stream_mode="updates",
    ):
    if chunk.data and chunk.event != "metadata":
        print(chunk.data)
const input = { "messages":[{ "role": "user", "content": "Hello! My name is Bagatur and I am 26 years old." }] };

const streamResponse = client.runs.stream(
  thread["thread_id"],
  assistant["assistant_id"],
  {
    input,
  }
);
for await (const chunk of streamResponse) {
  if (chunk.data && chunk.event !== "metadata" ) {
    console.log(chunk.data);
  }
}
curl --request POST \
  --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/stream \
  --header 'Content-Type: application/json' \
  --data "{
    \"assistant_id\": <ASSISTANT_ID>,
    \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"Hello! My name is Bagatur and I am 26 years old.\"}]},
  }" | sed 's/\r$//' | awk '
  /^event:/ { event = $2 }
  /^data:/ {
      json_data = substr($0, index($0, $2))

      if (event != "metadata") {
      print json_data
      }
  }'

输出

{'agent': {'messages': [{'content': "Hi Bagatur! It's nice to meet you. How can I assist you today?", 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop', 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_9cb5d38cf7'}, 'type': 'ai', 'name': None, 'id': 'run-c89118b7-1b1e-42b9-a85d-c43fe99881cd', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}}

下一步

恭喜!如果您已完成本教程,那么您已朝着成为 LangGraph Cloud 专家迈出了坚实的一步。以下是一些其他资源,可帮助您继续成为专家之路

LangGraph Cloud 操作指南

如果您想了解有关从托管图进行流传输的更多信息,请查看流传输 操作指南

要了解有关双文本发送以及在应用程序中处理它的所有方法的更多信息,请阅读这些 操作指南

要了解如何在图中包含不同的循环人参与行为,请查看 这些操作指南

LangGraph 教程

在托管之前,您必须编写一个要托管的图。以下是一些教程,可帮助您更熟悉编写 LangGraph 图并为您想要托管的图类型提供灵感。

本教程 将引导您完成如何使用 LangGraph 编写客户支持机器人。

如果您有兴趣编写 SQL 代理,请查看 本教程

查看 LangGraph 教程 页面以了解更多令人兴奋的用例。

评论