LangChain Chat和Agent基础使用
- Python
- 8小时前
- 4热度
- 0评论
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就可以下载或者获取文件信息
