LangChain Chat和Agent基础使用

1 LLM

  • 继承BaseChatModel或者SimpleChatModel
  • 设计理念:专注于模型层面,不要预设系统提示词,工具调用时仅输出ToolMessage而不是在内部调用工具

2 Chain

chain = prompt | llm | output_parser
print(chain.invoke(xxx))
"""本质上就是
v1 = prompt.invoke(xxx)
v2 = llm.invoke(v1)
v3 = output_parser(v2)
print(v3)
"""

2.1 ChatPromptTemplate

一般情况下prompt通过ChatPromptTemplate构造,或者自行写一个

from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个{domain}专家"),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])
output = prompt.invoke({"domain": "数学",
                        "input": "10*80",
                        "agent_scratchpad": [HumanMessage(content='test')]
                        })
print(type(output)) # ChatPromptValue
for msg in output.to_messages():
    print(msg)
"""
content='你是一个数学专家' additional_kwargs={} response_metadata={}
content='10*80' additional_kwargs={} response_metadata={}
content='test' additional_kwargs={} response_metadata={}
"""

prompt.invoke()返回的是ChatPromptValue对象,llm的invoke函数input接收的LanguageModelInput类型和ChatPromptValue都继承了PromptValue,会通过_convert_input转换为PromptValue列表,后续再调用llm类实现的generate方法

2 Agent

agent 是一个使用LLM选择一系列action的类。在chain中,一系列的action是被硬编码在里面的。但是,在agent内,LLM被用作一个推理引擎,来决定使用哪些action,又以哪种方式来使用action。

系统提示的定位原则

  • ​模型无关性​:系统提示属于应用层逻辑,应与模型实现解耦
  • ​动态注入​:通过ChatPromptTemplate​在调用链中动态添加,而非固化在LLM初始化中
  • ​多角色管理​:遵循LangChain消息角色规范(System/Human/AI)

1.1 核心基类

基类作用子类
BaseSingleActionAgent单动作代理基类,每次决策仅执行一个动作例如ZeroShotAgent​、OpenAIFunctionsAgent​,适用于单一任务的场景。
BaseMultiActionAgent多动作代理基类,支持并行或连续执行多个动作如OpenAIMultiFunctionsAgent​,适合需要同时调用多个工具的场景
Runnable一种流程化接口,RunnableAgent​和RunnableMultiActionAgent​基于此实现,支持链式调用与LangChain的Chain模块兼容,便于集成到复杂流程中。

1.2 常见Agent

名称描述
zero-shot-react-description(默认)没有任何上下文信息,直接生成问题的回复,依赖模型自身能力
react-docstore与文档进行交互。它可以访问一个或多个预先定义的文档库,从中提取相关信息来回答问题。
self-ask-with-search回答问题前先进行自我提问,然后使用搜索引擎或其他信息检索工具来寻找答案。适合实时获取信息或复杂问题
conversational-react-description这种代理类型在对话上下文中生成反应和回答。它能够记住对话的历史内容,并根据对话的上下文进行更为连贯和相关的回答。这对于持续对话或需要上下文理解的任务非常有效

备注:ReAct框架(Reasoning + Acting)

langchain其他用于构建Agent的类

AgentType : Agent的类型

AgentExecutor : Agent的执行器

AgentOutputparser : Agent的输出格式化

AgentExecutorIterator : Agent的迭代执行器

AgentAction : Agent的动作

AgentFinish : Agent的结束标识

逻辑

1. 调用file/upload方法,携带文件流上传;文件会放到FILE_UPLOAD_BASE_DIR/tmp目录,同时返回SM4(文件相对路径)后的加密code

2. 调用save方法,传递code、fileType;系统会通过code找到文件全路径然后根据fileType放到对应目录下,例如type=RAG那么就会放到文件会放到FILE_UPLOAD_BASE_DIR/RAG/目录下,然后再给数据库存一条上传记录(fileId, fileName, fileAbsPath, fileMd5, 最新fileCode)备份,然后将fileId传给前端

3. 后续要访问文件,只需要携带fileId就可以下载或者获取文件信息