跳到主要内容LangChain 框架与智能 Agent 构建实战指南 | 极客日志PythonAI算法
LangChain 框架与智能 Agent 构建实战指南
LangChain 是构建 LLM 应用的开源框架,通过模块化组件(模型、提示词、索引、记忆、链、代理)简化开发。本文详解 LangChain 核心概念,展示基于人脸识别场景的智能排查助手实战案例,涵盖工具定义、向量检索及 Agent 执行流程。此外,探讨了智能体发展趋势,包括 Gorilla、ToolLLaMa 等增强工具调用能力的模型,以及 MetaGPT、ChatDev 等多智能体协同框架,为构建下一代 AI 助手提供技术参考。
猫巷少女2 浏览 LangChain 框架与智能 Agent 构建实战指南
LangChain 为大型语言模型提供了一种全新的搭建和集成方式,通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。本文从 LangChain 是什么到实际案例再到智能体的快速发展做了全面的讲解。
LangChain 概念和结构
LangChain 是什么?
LangChain 是一个开源的软件框架,帮助开发者像搭乐高一样快速构建和优化基于语言模型的应用。它不是一个实物,而是一个工具箱,让我们能将语言模型积木组合成有趣应用。
为什么需要 LangChain?
即使有了强大的 LLM(如 GPT-4),它们也需要'说明书'和'工具'来更好地服务于现实世界的需求。比如访问最新的数据、与外部 API 互动、处理用户的上下文信息等。LangChain 就是这样一套组件,让 LLM 能够更好地融入到我们的应用中去。
LangChain 主要概念
LangChain 主要提供了 6 大类组件帮助我们更好的使用大语言模型,可以视为开源版的插件,提供了丰富的大语言模型工具,可以在开源模型基础上快速增强模型的能力。
Models(模型)
- LLMs(大型语言模型):基础积木,为构建复杂的语言理解和生成任务提供坚实基础。
- Chat Models(聊天模型):让应用程序进行流畅的对话。
- Text Embedding Models(文本嵌入模型):理解文本深度含义,帮助其他模块更好地理解内容。
Prompts(提示)
- Prompt Templates(提示模板):指导模型如何回答问题或者生成文本的剧本。
Indexes(索引)
LangChain 通过 Indexes 索引允许文档结构化,让 LLM 更直接、更有效地与文档互动。
- Document Loaders(文档加载器):将文档加载到系统中,方便模型快速查找。
- Text Splitters(文本分割器):将长篇文本拆分成易于处理的小块。
- Vector Stores(向量存储):特殊的存储设施,帮助模型记住文本的数学表示(向量)。
- Retrievers(检索器):在向量存储中检索和提取信息。
Memory(记忆)
LangChain 通过 Memory 工具类为 Agent 和 Chain 提供了记忆功能,让智能应用能够记住前一次的交互,比如在聊天环境中这一点尤为重要。
- Chat Message History(聊天消息历史):建立记忆网络,使智能体能够记住过去的对话,保持连贯性。
Chains(链)
Chain 模块整合了大型语言模型、向量数据库、记忆系统及提示,通过 Agents 的能力拓展至各种工具,形成一个能够互相合作的独立模块网络。它不仅比大模型 API 更加高效,还增强了模型的各种应用,诸如问答、摘要编写、表格分析和代码理解等。
Agents(代理)
在 LangChain 的世界里,Agent 是一个智能代理,它的任务是听取你的需求(用户输入)和分析当前的情境(应用场景),然后从它的工具箱(一系列可用工具)中选择最合适的工具来执行操作。
Agent 接受一个任务,使用 LLM 作为它的'大脑'或'思考工具',通过这个大脑来决定为了达成目标需要执行什么操作。它就像是一个有战略眼光的指挥官,指挥小队完成更复杂的任务。
Agent 执行过程:AgentExecutor
AgentExecutor 负责迭代运行代理,直至满足设定的停止条件,这使得 Agent 能够像生物一样循环处理信息和任务。
- 观察(Observation):接收外部触发,解析输入,提取关键信息。
- 思考(Thought):分析观察到的信息,确定如何响应,评估行动方案。
- 行动(Action):执行特定行动,如调用工具、提供答案。
- 输出:将生成的响应输出给用户或系统。
Agent 推理方式:AgentType
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
代理类型决定了代理如何使用工具、处理输入以及与用户进行交互。常见的代理类型如下:
| 智能代理类型 | 预期模型类型 | 支持聊天历史 | 支持多输入工具 | 支持并行函数调用 | 何时使用 |
|---|
| OpenAI Tools | 聊天型 | ✅ | ✅ | ✅ | 较新的 OpenAI 模型(1106 及以后) |
| OpenAI Functions | 聊天型 | ✅ | ✅ | - | OpenAI 模型或微调支持函数调用的开源模型 |
| XML | 大型语言模型 | ✅ | - | - | Anthropic 模型或其他擅长 XML 的模型 |
| Structured Chat | 聊天型 | ✅ | ✅ | - | 需要支持具有多个输入的工具 |
| JSON Chat | 聊天型 | ✅ | - | - | 擅长 JSON 的模型 |
| ReAct | 大型语言模型 | ✅ | - | - | 简单模型,推理观察再行动 |
| Self Ask With Search | 大型语言模型 | - | - | - | 简单模型,只有一个搜索工具 |
LangChain 实际案例:人脸技术问题的智能排查助手
使用 LangChain 处理人脸识别问题的排查
随着人脸识别服务的日调用量增加,团队面临排查问题费时费力的挑战。决定使用 LangChain 构建一个智能排查助手,分析用户问题、错误日志,与 API 交互,生成修复建议。
首先,我们需要导入依赖的函数,主要来自各个现有日志系统的接口:
from face_functions import (
extract_compare_scores,
extract_local_group_size,
extract_actual_group_size,
perform_logic_judgement,
search_by_exact_query,
search_by_fuzzy_query,
blacklist
)
定义工具
zmng_query 工具
当用户遇到人脸比对失败的情况时,通过 zmng_query 工具提取 UID,查询相关用户信息,包括黑名单状态、比对分数等。
def zmng_query(uid):
return "需要调用 compare_scores_tool, extract_local_group_size, extract_actual_group_size, blacklist_query, perform_logic_judgement 这五个 tool,用于问题的排查输入"
zmng_query_tool = Tool(
name="zmng_query",
func=zmng_query,
description=(
"当用户刷脸比对不通过,需要确认是否为黑名单或其他原因时使用此工具。"
"此工具能查询黑名单状态,提取比对分数,并获取机具端及实际的 groupSize 信息。"
"至少提供一个参数 ['uid'] 或 ['zid']。"
)
)
extract_compare_scores 工具
用于从日志文件中提取比对分数。
compare_scores_tool = Tool(
name="extract_compare_scores",
func=extract_compare_scores,
description="当用户刷脸比对不通过时,用于提取日志中的比对分数。"
)
extract_local_group_size 和 extract_actual_group_size 工具
分别用于提取机具端和实际的人脸库大小(groupSize)。
local_group_size_tool = Tool(
name="extract_local_group_size",
func=extract_local_group_size,
description="当用户刷脸比对不通过时,用于提取日志中机具端的人脸库大小 groupSize。"
)
actual_group_size_tool = Tool(
name="extract_actual_group_size",
func=extract_actual_group_size,
description="当用户刷脸比对不通过时,用于提取实际的人脸库大小 groupSize。"
)
blacklist_query 工具
查询指定用户是否在黑名单中。
blacklist_query_tool = Tool(
name="blacklist_query",
func=blacklist,
description="查询指定 UID 是否在黑名单中。"
)
perform_logic_judgement 工具
根据比对分数和本地库与实际库的大小,给出比对不通过的分析结论。
logic_judgement_tool = Tool(
name="perform_logic_judgement",
func=perform_logic_judgement,
description="根据比对分数和本地与实际库的大小,给出比对不通过的分析结论。"
)
tools = [
compare_scores_tool,
local_group_size_tool,
actual_group_size_tool,
blacklist_query_tool,
zmng_query_tool
]
聊天模型实例化与用户交互
创建聊天模型实例,允许代理与用户进行自然语言交互。
agent = initialize_agent(tools, chat_model, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
print("您好,有什么能帮助您?(输入 'exit' 结束对话)")
while True:
user_input = input("You: ")
if user_input.lower() in ["exit", "goodbye", "quit"]:
print("再见!")
break
response = agent.run(user_input)
print("Agent:", response)
完整的技术链路示例
用户询问:'为什么我的脸无法被系统识别?'代理按照 Observation-Thought-Action 模式处理请求。
利用 LangChain 与人脸问答知识库进行交互
模块 1: 问题与答案数据的加载
读取问题和答案对,存储到字典结构中。
def load_qa_data(filepath):
qa_data = {}
with open(filepath, 'r', encoding='utf-8') as file:
lines = file.readlines()
current_question = None
answer_lines = []
for line in lines:
if line.startswith('问题: '):
if current_question:
qa_data[current_question] = ' '.join(answer_lines).strip()
current_question = line[len('问题: '):].strip()
answer_lines = []
elif current_question:
answer_lines.append(line.strip())
if current_question and answer_lines:
qa_data[current_question] = ' '.join(answer_lines).strip()
return qa_data
模块 2: 嵌入向量的生成和 Faiss 索引创建
Faiss 是 Facebook AI Research 精心打造的一款强大向量数据库,专为高效执行相似性搜索而设计。
embeddings_model = OpenAIEmbeddings()
def create_faiss_index(embedding_matrix):
dimension = embedding_matrix.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embedding_matrix.astype(np.float32))
return index
def search_faiss_index(query_embedding, index):
query_embedding = np.array(query_embedding).astype(np.float32)
_, indices = index.search(np.array([query_embedding]), 1)
return indices[0][0]
模块 3 & 4: 精确匹配与模糊匹配查询
增加 search_by_exact 和 search_by_fuzzy 两个工具能力。
tools = [
Tool(
name="search_by_exact",
func=search_by_exact_query,
description="当需要准确回答用户问题时使用此工具。使用时需提供参数 ['query']。"
),
Tool(
name="search_by_fuzzy",
func=search_by_fuzzy_query,
description="当需要回答用户问题时使用此工具。使用时需提供参数 ['query']。"
),
send_email_tool,
compare_scores_tool,
local_group_size_tool,
actual_group_size_tool,
blacklist_query_tool,
zmng_query_tool
]
智能体的快速发展
智能体的基本概念
一句话总结,LangChain 这个开发框架,是为了让我们更容易更低成本的构建大语言模型的智能应用,其中有自主行动能力,能够思考跟外部环境/工具交互的叫 Agent,智能体。
AI Agent 业界定义是具有环境感知、决策制定和行动执行能力的智能实体,并且能够通过独立思考和工具调用来逐步实现既定目标。关键特征包括自治性、知觉、反应能力、推理与决策能力、学习能力、通信能力以及目标导向性。
智能体的发展方向
- 工具使用能力增强:早期模型可能需要明确的指令才能调用几十个工具,现在部分模型可以根据目标自由调用上万个工具。
- 多代理系统转变:从单一代理到多代理协同,多个代理同时工作,协同完成更复杂的任务。
- 人机交互自然化:引入人类决策,智能代理不仅是工具的操作者,更是人类的合作者。
增强智能体的工具使用能力
最近一些开源的大语言模型能够自由地与各种外部工具交互,比如 Toolformer、Gorilla、ToolLLama 等模型。
Gorilla:精准调用 1600+ API 的智能体进步
Gorilla 是一个基于检索感知的 LLaMA-7B 大型语言模型,也是一种基础的智能体,它能够使用各种 API 工具。它能准确地调用超过 1600 个 API,并且这个数量还在增长。
Gorilla-CLI:提升命令行互动体验
Gorilla-CLI 是一个由加州大学伯克利分校开发,基于 Gorilla 模型的提升命令行交互体验的工具。
pip install gorilla-cli
gorilla 从当前目录下找到 qa.txt 文件
ToolLLaMa:实现 16000+ API 的精准协同调用
ToolLLaMA 也是一个基于开源 LLaMA-7B 语言模型的框架,旨在增强模型执行复杂任务的能力,特别是遵循指令使用外部工具 API。支持大量的真实世界 API,共 16464 个,覆盖 49 个类别。
智能体的发展:从单任务到多代理协同与人代理交互
MetaGPT
MetaGPT 是由 Deep Wisdom 联合几个大学发布的一个基于大型语言模型(LLMs)专门为高效整合人类工作流程而设计的多智能体合作框架。通过将标准化操作程序(SOPs)编码到智能体的提示序列中,MetaGPT 简化了工作流程。
在 MetaGPT 系统中,智能体根据装配线原则被分配不同的角色,以协同完成复杂任务。例如,在软件工程的协作任务中,MetaGPT 展现出了相较于传统基于聊天的多智能体系统更一致的解决方案生成能力。
安装步骤:
conda create -n metagpt python=3.9
conda activate metagpt
git clone https://github.com/geekan/MetaGPT.git
cd MetaGPT
pip3 install -e .
metagpt "Create a 2048 game in python"
ChatDev
ChatDev 是 OpenBMB 联合清华大学 NLP 实验室共同开发的大模型全流程自动化软件开发框架,它模拟了一家虚拟软件公司,由担任不同职能的多个智能代理运作。
ChatDev 通过模拟软件开发的瀑布模型,实现了智能的分阶段、分聊天的协作。每个阶段包含多个原子聊天,而在每个聊天中,两个扮演不同角色的智能体通过任务导向的对话来协同完成子任务。
安装步骤:
git clone https://github.com/OpenBMB/ChatDev.git
conda create -n ChatDev_conda_env python=3.9 -y
conda activate ChatDev_conda_env
cd ChatDev
pip3 install -r requirements.txt
export OPENAI_API_KEY="your_OpenAI_API_key"
python3 run.py --task "[description_of_your_idea]" --name "[project_name]"
MetaGPT 和 ChatDev 的异同
| 功能特点 | MetaGPT | ChatDev |
|---|
| 流程标准化 | 标准化操作程序 | 聊天链 |
| 任务解决模式 | 按指令操作 | 智能体间通信 |
| 缓解代码幻觉 | - | 思维指令 |
| 记忆 | 上下文检索 | 短时记忆共享 |
| 版本管理 | - | Git |
结语
LangChain 为大型语言模型提供了一种全新的搭建和集成方式,正如乐高积木提供了无尽的创造可能。通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。
在智能体的发展中,我们看到了诸如 Gorilla 和 ToolLLaMa 这样的进步,它们通过增强大型语言模型(LLMs)本身的工具使用能力,为我们带来直观、高效的互动体验。另一方向是多代理协同,像 MetaGPT 和 ChatDev 这样的系统展示了通过多智能体的合作可以如何高效解决问题。
随着技术的不断进化,智能代理正在从单一任务执行者转变为能够协同工作的团队成员。这一转变不仅扩大了智能体在各行各业中的应用范围,也为未来出现的人与智能体之间的互动提供了基础。