版本改动

这是具体改动的链接
在这里插入图片描述
官方blog首先说明了:
所有软件包已在内部从 Pydantic 1 升级到 Pydantic 2。
所有软件包都完全支持在用户代码中使用 Pydantic 2,而无需使用 langchain_core.pydantic_v1 或 pydantic.v1 等桥接程序。
由于 Pydantic 1 已于 2024 年 6 月到期,因此将不再对其提供支持。
Python 3.8 的生命周期将于 2024 年 10 月结束,因此将不再对其提供支持。这是最大的改变!!

总结一下:就是从py38升级更高的版本把!

改变

包的改变

langchain-community包在0.3中已经被废弃,langchain-community中的内容已经相继搬到langchain-x包中了,包的引用改变需要多多注意下。具体可以看这个链接,目前该链接还停留在v0.2估计后续官方会做更新。

2.X工具的改变

官方在这篇文章里,说简化了工具的使用
具体怎么简化的,我们可以来看示例
在这里插入图片描述

from typing import List
from typing_extensions import TypedDict

from langchain_anthropic import ChatAnthropic

class Address(TypedDict):
    street: str
    city: str
    state: str

# 这个tool单纯的就是一个方法,并不像v0.2版本需要tool装饰器
def validate_user(user_id: int, addresses: List[Address]) -> bool:
    """Validate user using historical addresses.

    Args:
        user_id: (int) the user ID.
        addresses: Previous addresses.
    """
    return True

llm = ChatAnthropic(
    model="claude-3-sonnet-20240229"
).bind_tools([validate_user])

result = llm.invoke(
    "Could you validate user 123? They previously lived at "
    "123 Fake St in Boston MA and 234 Pretend Boulevard in "
    "Houston TX."
)
result.tool_calls


-------------------------
[{'name': 'validate_user',
  'args': {'user_id': 123,
   'addresses': [{'street': '123 Fake St', 'city': 'Boston', 'state': 'MA'},
    {'street': '234 Pretend Boulevard', 'city': 'Houston', 'state': 'TX'}]},
  'id': 'toolu_011KnPwWqKuyQ3kMy6McdcYJ',
  'type': 'tool_call'}]

在这之前,我们是怎么使用tools的

import os

from langchain_community.chat_models import QianfanChatEndpoint
from typing import Annotated, Literal, TypedDict
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import END, StateGraph, MessagesState
from langgraph.prebuilt import ToolNode

# 设置API
os.environ["QIANFAN_AK"] = ""
os.environ["QIANFAN_SK"] = ""
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = ""
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_PROJECT"] = 'default'

# 自定义工具给agent
@tool
def search(query: str):
    """Call to surf the web."""
    print(query)
    if "武汉" in query.lower() or "武 汉" in query.lower():
        return ["25° 多云"]
    return ["35° 晴天"]


tools = [search]
tool_node = ToolNode(tools)
# 定义模型
model = QianfanChatEndpoint(
    model="ERNIE-Bot-turbo",
    temperature=0.9
).bind_tools(tools)


# 定义条件
def should_continue(state: MessagesState) -> Literal["tools", END]:
    print(state)
    messages = state['messages']
    last_message = messages[-1]
    print(last_message.tool_calls)
    if last_message.tool_calls:
        return "tools"
    return END


# 定义执行
def call_model(state: MessagesState):
    messages = state['messages']
    response = model.invoke(messages)
    return {"messages": [response]}


# 创建工作流
workflow = StateGraph(MessagesState)

workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)


workflow.set_entry_point("agent")

workflow.add_conditional_edges(
    "agent",
    should_continue,
)


workflow.add_edge("tools", 'agent')

checkpointer = MemorySaver()

app = workflow.compile(checkpointer=checkpointer)

final_state = app.invoke(
    {"messages": [HumanMessage(content="武汉今天多少度")]},
    config={"configurable": {"thread_id": 42}}
)

print(final_state["messages"][-1].content)

# 现在,当我们传递相同的thread_id时,对话上下文通过保存的状态(即存储的消息列表)保留"thread_id"
final_state = app.invoke(
    {"messages": [HumanMessage(content="那北京情况如何呢?")]},
    config={"configurable": {"thread_id": 42}}
)

print(final_state["messages"][-1].content)

相比之下,langchain 0.3之前使用tools看起来确实有点臃肿。

接下来看官方给的第二示例:

from typing import List, Literal
from typing_extensions import TypedDict

from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent


llm = ChatOpenAI(temperature=0)

# validate_user就是上面代码中的tool,llm+tool=agent
user_info_agent = create_react_agent(llm, [validate_user])


class Message(TypedDict):
    role: Literal["human"]
    content: str
# agent -> tool,对gent进行一次封装,设定tool的一些参数
# 也就是说问题通过agent可以转发到下层,或者二级代理
# 如果是0.2低版本,可能需要创建workflow加边啥的
# 整体上看,构建简单的链路确实更简单了
agent_tool = user_info_agent.as_tool(
    arg_types={"messages": List[Message]},
    name="user_info_agent",
    description="Ask questions about users.",
)


agent = create_react_agent(llm, [agent_tool])

怎么升级 0.2 -——> 0.3

pip install langchain >=0.3
pip install langchain-community >=0.3
pip install langchain-text-splitters >=0.3
pip install langchain-core >=0.3
pip install langchain-experimental >=0.3
跟langchain相关的一些库也需要更新

langserve

升级后需要注意什么?
pydantic 版本升级
# v0.2x
from langchain_core.pydantic_v1 import BaseModel
# v0.3
from pydantic import BaseModel

Users using the following APIs:

BaseChatModel.bind_tools
BaseChatModel.with_structured_output
Tool.from_function
StructuredTool.from_function

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐