版本改动
这是具体改动的链接
官方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