LangChain项目agent源码梳理(一)
agent概念
什么是agent?agent是输入处理模块、llm作为大脑、tools作为手脚,memory用于状态保持,并提供复盘优化的智能体。
源码梳理(基于langchain0.3.23版本)
入口函数
def create_react_agent (
llm: BaseLanguageModel,
tools: Sequence[ BaseTool] ,
prompt: BasePromptTemplate,
output_parser: Optional[ AgentOutputParser] = None ,
tools_renderer: ToolsRenderer = render_text_description,
* ,
stop_sequence: Union[ bool , List[ str ] ] = True ,
) - > Runnable:
. . .
重要参数:tools
class DuckDuckGoSearchRun ( BaseTool) :
api_wrapper: DuckDuckGoSearchAPIWrapper = Field(
default_factory= DuckDuckGoSearchAPIWrapper
)
def _run (
self,
query: str ,
run_manager: Optional[ CallbackManagerForToolRun] = None ,
) - > str :
"""Use the tool."""
return self. api_wrapper. run( query)
重要参数:prompt
prompt需要包含一些必要信息:
也可以使用langchain hub中的prompt模板,用于更好的简化输入,以hub中比较热门的prompt-maker为例:
from langchain import hub
prompt_maker = hub. pull( "prompt-maker" , include_model= True ,
api_key= "hub账号的key" ,
api_url= "https://smith.langchain.com/hub/hardkothari/prompt-maker" )
重要参数:output_parser
class XMLAgentOutputParser ( AgentOutputParser)
class StructuredChatOutputParser ( AgentOutputParser)
简单demo,创建agent
from pydantic import SecretStr
from langchain import hub
from langchain. agents. react import agent
from langchain. prompts import PromptTemplate
from langchain. agents. structured_chat. output_parser import StructuredChatOutputParser
from langchain_community. chat_models. tongyi import ChatTongyi
from langchain_community. tools. ddg_search import DuckDuckGoSearchRun
llm = ChatTongyi( model= "deepseek-r1" , api_key= SecretStr( 'YOUR_API_KEY' ) )
tools = [ DuckDuckGoSearchRun( ) ]
hub_maker_prompt = hub. pull(
"prompt-maker" ,
include_model= True ,
api_key= "" ,
api_url= ""
)
custom_prompt = f"""
{ hub_maker_prompt. template}
你拥有以下工具:
{{{{tools}}}}
工具名称列表:{{{{tool_names}}}}
按照以下格式执行:
Question: 需要回答的问题
Thought: 思考过程(必须分析是否需要使用工具)
Action: 选择工具(必须是 [{{{{tool_names}}}}] 之一)
Action Input: 工具输入参数
Observation: 工具返回结果
...(可重复多次)
Thought: 现在可以生成最终答案
Final Answer: 最终回答
开始!
Question: {{{{input}}}}
{{{{agent_scratchpad}}}}"""
text_prompt = PromptTemplate(
input_variables= [ "input" , "tools" , "tool_names" , "agent_scratchpad" ] ,
template= custom_prompt
)
out = StructuredChatOutputParser( )
text_agent = agent. create_react_agent(
llm= llm,
tools= tools,
prompt= text_prompt,
output_parser= out
)
进一步展开说明
langchain包含很多组件,上述的tools, prompt, output_parser等都有丰富的组件可以选用,如:
工具类名称 功能描述 输入参数 典型场景 BaseTool 所有工具的基类 自定义 开发自定义工具时继承使用 StructuredTool 结构化参数工具 args_schema (Pydantic) 需要严格参数校验的场景 DuckDuckGoSearchRun DuckDuckGo 搜索 query: str 实时信息检索(如新闻、赛事结果)
prompt类名称 用途 关键参数 特点 BasePromptTemplate 所有prompt的基类 invoke / format_template 开发自定义prompt时继承 StringPromptTemplate 动态渲染生成模版string format_template 支持f-string和jinja2模版引擎 ChatPromptTemplate 对话式提示 messages 支持组合system,ai,human等message类型
parser类名称 作用 输出类型 特点 BaseOutputParser 所有output的基类 StringOutputParser 原始字符串输出 str 直接返回LLM生成的文本 ChatOutputParser 将输出转换为agentAction 或 agentFinish对象 agentAction 用于chat agent使用
需要结合业务的特点选择合适的组件工具,或者自定义实现,后续慢慢补充。