基于书籍简单记录要点
LangChain 提供了多种模板供选择
- LangChain 提供了以下格式化 SQL 提示词模板(翻译):
1. 你是一个 PostgreSQL 专家。给定一个输人问题,首先创建一个语法正确的 PostgreSQL查询来运行,然后查看查询结果,扑返回针对输人问题的答案。 2. 除非用户明确指定了要返回的结果数量,否则应使用 PostgreSQL 的LIMIT 子句来限制查询结果,最多返回top.k条记录。你可以对结果进行排序,以返回数据库中最有信息价值的数据。 3. 绝对不要查询表中的所有列。你只能在询回答问题所需的列。用双引号(")将每个列名包裹起来,表示官们是界定的标识符。 4. 注意只使用你在表巾可以看到的列名,不要责询不存在的列。此外,要注意哪一列在哪个表中。 5. 如果问题涉及“今天”,请注意使用 CURRENT_DATE 函数获取当前日期。 使用以下格式: 问题:这里的问题 SQL查询:要运行的 SQL 查询 SQL结果:SQL 查询的结果 答案:这里的最终答案 只使用以下表: (table_info) 问题:{input}
- 想象一下,如果没有 LangChain 提供的这个提示词模板,当你要开始编写一段SQL查询代码时,会走多少弯路?LLM 应用开发的最后1公里,其意义是确保开发者无须为了一个小细节而多走弯路,正如居民无须跑很远坐公交车一样,每一个关键的细节都能得到及时而准确的处理,使得整个开发过程更为高效。
记忆提示词
创建提示词是最重要的环节。在创建的过程中你可以理解为什么加人记忆组件后,“聊天备忘录”有了内容,让链组件有了“记忆”。使用提示词模板包装器,自定义一个提示词模板字符串。
提示词内容分为四部分:
- 一是对模型的指导词:“请你回答问题的时候,依据文档内容和聊天记录回答,如果在其中找不到相关信息或者答案,请回答不知道。”;
- 二是使用问题检索到的相关文档内容;“文档内容是:{context}”;三是记忆组件输出的记忆内容:“聊天记录是:{chat_history}”;四是用户的输人:“Human:(human _input)”
template = "n*你是说中文的 chatbot. 请你回答问题的时候,依据文持内容和脚天记录回答,如果在其中找不到相关信息戒着答案,请回答 不知道。 文档内容是:{context) 聊天记录是:{chat_history) Human: (human_input) Chatbot:"""
LangChain 框架由以下开发库组成。
- (1)LangChain-Core:基础抽象和 LangChain 表达语言(LCEL)。
- (2)LangChain-Community:组件及内置的大量第三方技术集成模块,一般被封装为合作伙伴模块(例如 LangChain-openai)。
- (3)LangChain:构成应用架构的上层核心组件,包括 Chains、Agents 等。
- (4)Templates:官方提供的一些常见的应用模板。
- (5)LangServe:将 LangChain 链部署为 REST API 的平台。
- (6)LangSmith:帮助开发者跟踪调试、测试、评估和监控大模型应用的在线平台。
其他
Langchain agent是怎么找到search工具并使用的
- 可以正确识别和调用它,因为它主要是通过 description 语义匹配,而不是看 name 的具体字符串。
- 但 name 仍然有一定作用,比如:LLM 可能会参考 name 来做初步判断;调试时 name 可以帮助你看日志,知道 Agent 选了哪个工具
LLM本身没有内在记忆,每个查询都是独立进行的
- 所谓的记忆和检索增强生成(RAG)是通过外部手段实现的,即将相关信息添加到提示词模板中
扩展
Langchain是怎么做到通过分析语义找到对应工具的
- From ChatGPT (2025-02-18)
LangChain 通过 LLM(大模型)+ ReAct 框架 来分析语义并选择工具。它的核心逻辑是让 LLM 先思考,再决定用哪个工具,并按照工具的格式调用它。
核心机制
- 解析用户问题 → 让 LLM 提取关键语义
- 匹配工具描述 → 让 LLM 判断哪个工具最适合
- 生成调用指令 → LLM 生成工具的调用格式并执行
- 工具返回结果 → LLM 解析工具返回的数据并回复用户
这套逻辑基于 ReAct(Reasoning + Acting) 框架,在 LangChain 里 Agent 主要是用这个方法来动态决策。
1. 解析用户问题
假设你输入:
1 | agent.run("计算 25 * 4 + 10") |
LangChain 会把这个问题交给 LLM(如 GPT-4),让它理解用户的意图。
LLM 可能会把你的问题理解成:
- 这是一个数学计算问题
- 需要找到一个能进行数学计算的工具
- 计算表达式
25 * 4 + 10
2. 匹配工具描述
假设你有两个工具:
1 | Tool( |
LLM 会对比问题和 description
,发现 Calculator 的描述里提到了“数学计算”,所以它会选择 Calculator
这个工具。
关键点:LangChain 让 LLM 直接读
description
,所以工具的名字name
只是一个标识,核心还是description
的语义匹配。
3. 生成调用指令
LangChain 让 LLM 生成一个类似 JSON 的格式,表示它要调用哪个工具:
1 | { |
然后 LangChain 会解析这个指令,找到 Calculator
工具,并把 25 * 4 + 10
传给 func
去执行。
4. 工具返回结果
计算工具执行:
1 | eval("25 * 4 + 10") # 计算得到 110 |
LangChain 把 110
返回给 LLM,LLM 可能会回复:
1 | 25 * 4 + 10 = 110 |
最终 agent.run()
会输出这个结果。
总结
LangChain 让 LLM 负责:
- 分析用户语义
- 匹配工具(通过
description
) - 生成调用工具的指令
- 解释工具返回的结果
它的核心是利用 LLM 的推理能力,结合 ReAct 让它“思考后再行动”。所以只要 description
够清晰,即使 name
乱写,它也能找到正确的工具!
Reference
- 《LangChain入门指南构建高可复用、可扩展的LLM应用程序》
- 《基于大模型的RAG应用开发与优化——构建企业级LLM应用》