1. 基础构建:定义外部搜索工具

1.1. 概念解释

在LangChain中,“工具”(Tool)是Agent可以用来与外部世界交互的接口。这些接口可以是任何功能,例如查询API、访问数据库或进行网络搜索。通过为Agent提供工具,我们极大地扩展了它的能力范围,使其不再局限于语言模型内部的知识。

1.2. 实现Tavily搜索工具

我们将使用的第一个工具是,这是一个封装了Tavily Search API的便捷工具,可以为我们的代理提供实时网络搜索的能力。TavilySearchResults
以下代码展示了如何导入库、设置API密钥并初始化搜索工具。

import os
from langchain_community.tools.tavily_search import TavilySearchResults

# 定义 AVILY_KEY 密钥
os.environ["TAVILY_API_KEY"] = "tvly-dxv-leVQmxxxxxxxxxxxx1cCwoc"
# 查询 Tavily 搜索 API
search = TavilySearchResults(max_results=1)
# 执行查询
res = search.invoke("今天上海天气怎么样")
print(res)
[{'title': '12月3日上海天气阴有雨7°C-11°C', 'url': 'http://sh.bendibao.com/news/2022123/263718.shtm', 'content': '【导语】:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。\n\n12月3日上海天气\n\n\u3000\u3000天况:阴有雨\n\n\u3000\u3000气温:7℃-11℃\n\n\u3000\u3000风力:西北风3-4级\n\n\u3000\u3000空气质量:优到良\n\n\u3000\u3000穿衣指数:毛衣、羽绒服,带伞\n\n今日天气:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。这场雨会下两到三天,双休日将在阴阴雨雨中度过。受弱冷空气扩散影响,北向风为主,温度虽比前几天回升一些,但高湿+北风的气象条件下,体感会比较湿冷。\n\n天气趋势:下周上海晴雨参半,上半周以阴雨天气为主,受冷暖空气交汇影响,天空中云系多,不时有小雨出现,气温也稍有起伏。周一全天气温再度降至10℃以下,周二和周三气温小幅上升,但湿冷的体感依然如影随形。下半周天气形势发生调整,晴或多云天气为主,气温总体保持在7~14℃之间。\n\n未来几日天气\n\n\u3000\u300012月4日(周日):阴有雨,9~12度\n\n\u3000\u300012月5日(周一):阴有小雨转阴到多云,8~10度 [...] 天气趋势:下周上海晴雨参半,上半周以阴雨天气为主,受冷暖空气交汇影响,天空中云系多,不时有小雨出现,气温也稍有起伏。周一全天气温再度降至10℃以下,周二和周三气温小幅上升,但湿冷的体感依然如影随形。下半周天气形势发生调整,晴或多云天气为主,气温总体保持在7~14℃之间。\n\n未来几日天气\n\n\u3000\u300012月4日(周日):阴有雨,9~12度\n\n\u3000\u300012月5日(周一):阴有小雨转阴到多云,8~10度\n\n\u3000\u300012月6日(周二):阴到多云转阴有时有小雨,7~13度\n\n\u3000\u300012月7日(周三):阴有时有小雨转阴到多云有短时小雨,10~14度\n\n注:本文图片来源于上海天气。\n\n手机访问 上海本地宝首页\n\n相关推荐 上海天气预报 上海天气情况\n\n- 2025上海国庆天气预报(21~31℃ 多云为主)\n\n  今年国庆和中秋假期上海天气条件总体适宜出行。假期一头一尾天气较好。10月2-5日局地有弱降水。6日(中秋节)白天降水相对明显,夜间雨渐止,可见彩云追月。\n- 8月26日上海发布高温橙色预警 [...] 民生\n 办事\n 社保\n 公积金\n 交通\n 地铁\n 旅游\n 景点\n 活动\n 教育\n 网点\n 招聘\n 房产\n 特惠\n\n 生活指南\n 关注\n 生活\n 经济\n 旅游\n 社会\n 教育\n 文体\n 提醒\n 新政\n\n上海本地宝 > 资讯快递 > 上海天气 > 12月3日上海天气阴有雨7°C-11°C\n\n2022-12-03 09:04作者:紫罗【我要纠错】\n\n分享至\n\n【导语】:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。\n\n12月3日上海天气\n\n\u3000\u3000天况:阴有雨\n\n\u3000\u3000气温:7℃-11℃\n\n\u3000\u3000风力:西北风3-4级\n\n\u3000\u3000空气质量:优到良\n\n\u3000\u3000穿衣指数:毛衣、羽绒服,带伞\n\n今日天气:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。这场雨会下两到三天,双休日将在阴阴雨雨中度过。受弱冷空气扩散影响,北向风为主,温度虽比前几天回升一些,但高湿+北风的气象条件下,体感会比较湿冷。', 'score': 0.9979966}]

2.增强能力:构建本地知识搜索器

2.1. 搜索器(Retriever)概念

除了从外部网络获取信息,我们还希望Agent能够从我们自己的数据源中检索知识。这就是检索器(Retriever)的作用。在RAG(检索增强生成架构)中,检索器负责从文档或数据库中提取与用3户问题最相关的信息片段,并提供其给语言模型作为上下文,从而生成更准确、更可靠的答案。

2.2. 构建搜索器的步骤

构建一个基于搜索的搜索器通常包含以下五个核心步骤:

1.加载数据源:我们使用从指定的URL(这里是维基百科的“猫”页面)加载文档内容。WebBaseLoader
2.分割文档:长文档不利于精确搜索。因此,我们利用将加载的文档分割成更小、有重叠的文本块(chunks),以提高搜索效率和相关性。RecursiveCharacterTextSplitter
3.创建词处理:为了让计算机理解文本的语义,我们使用将每个文本块转换为高维处理。OpenAIEmbeddings
4.构建支撑数据库:我们将这些支撑化的文档存储在支撑数据库中。FAISS是一个快速的相似性搜索库,可以找到和查询支撑最相似的文档支撑。FAISS
5.创建搜索器对象:最后,我们从构建好的支持数据库中创建一个标准的对象,该对象封装了查询和搜索的逻辑。retriever

2.3. 完整实现代码

下面的代码整合了上述所有步骤,完整构建了一个针对维基百科“猫”页面的搜索器。

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
import os
import dotenv
dotenv.load_dotenv()

# 1. 提供一个大模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
embedding_model = OpenAIEmbeddings()

# 2.加载HTML内容为一个文档对象
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8C%AB")
docs = loader.load()

# 3.分割文档
splitter = RecursiveCharacterTextSplitter(
 chunk_size=1000,
 chunk_overlap=200
)
documents = splitter.split_documents(docs)

# 4.向量化 得到向量数据库对象
vector = FAISS.from_documents(documents, embedding_model)

# 5.创建检索器
retriever = vector.as_retriever()

3. 整合工具集:为Agent配备武器

3.1. 创建搜索工具

我们已经有了一个对象,但 Agent 无法直接使用它。我们需要使用函数将其包装成一个标准的 Agent 工具。在这个过程中,参数创建至关重要,因为 Agent 会根据这些信息来判断在语音情况下应该调用这个工具。清晰的描述可以帮助 Agent 做出正确的决策。

from langchain.tools.retriever import create_retriever_tool

# 创建一个工具来检索文档
retriever_tool = create_retriever_tool(
 retriever=retriever,
 name="wiki_search",
 description="搜索维基百科",
)

3.2. 构建工具列表

现在,我们拥有了两个强大的工具:一个用于实时网络搜索,另一个用于从维基百科知识库中搜索信息。我们将它们放入一个列表中,准备备用代理使用。

# 构建工具集
tools = [search, retriever_tool]

4.核心大脑:构建Agent执行器

4.1. 绑定工具与语言模型

Agent的决策核心是一个大型语言模型(LLM)。我们需要让模型知道它有哪些工具可以使用。通过方法,我们可以将前面创建的列表与我们选择的LLM(这里是的模型)进行绑定。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 获取大模型
model = ChatOpenAI(model="gpt-4o-mini")

# 模型绑定工具
model_with_tools = model.bind_tools(tools)

4.2. 创建Agent与AgentExecutor

Agent的行为逻辑由一个提示模板来指导。我们从拉取一个经过优化的预置提示( ),它专门用于指导模型如何调用工具。LangChain Hubhwchase17/openai-functions-agent
接下来,我们使用函数,它就像一个工厂,将模型、工具集和提示组成一个可执行的代理。create_tool_calling_agent
最后,我们创建。它是Agent的运行环境,负责接收用户输入,调用Agent进行思考和决策,执行Agent选择的工具,把工具的返回结果再排序Agent,如此循环往复,直到得到最终答案。AgentExecutor

from langchain import hub
prompt = hub.pull("hwchase17/openai-functions-agent")

from langchain.agents import create_tool_calling_agent
from langchain.agents import AgentExecutor


# 创建Agent对象
agent = create_tool_calling_agent(model, tools, prompt)

# 创建AgentExecutor对象
agent_executor = AgentExecutor(agent=agent, tools=tools,verbose=True)

5. 实战演练:运行并测试代理

5.1. 测试场景一:知识搜索

我们首先代理测试从本地知识库检索信息的能力。我们提出“猫的特征”,这个问题显然应该由我们之前构建的维基百科检索器来回答。

print(agent_executor.invoke({"input": "猫的特征"}))

Agent的执行日志清晰地展示了它的思考过程:
进入新的 AgentExecutor 链…
调用:使用wiki_search{'query': '猫的特征'}

感官[编辑]猫的感官渴望狩猎。在浣熊类动物中,猫的听觉、视觉、嗅觉、味觉、触觉极为敏锐。
视觉[编辑]猫的瞳孔能力缩得如线般的瞳孔小猫的瞳孔变化猫在昼间视觉纵深不及人类,夜视能力与追踪视觉上的活动物体却效果相当,夜视能力是人类的六倍,虽然综合色彩计算整体视觉系数则仅及人类的十分之一。猫的眼睛具有微光观察能力,即使只有微弱月光都可辨别物品,有关光线进入猫眼后可放大4050倍处理,令猫具有夜间活动的能力,即使在黑暗的地下室猫咪强光下,猫将瞳孔缩得如线般狭小,以减少对进步的伤害,但视野会因而缩小。由于猫眼具备高帧与高分辨率,故此瞳孔缩得如线般狭小,以减少对未来的伤害,但视野会因而缩小。 [51]另外,不只是光线会影响猫的瞳孔,感情也会发生。一般对于猫放松的时候瞳孔会缩小,而紧张时会放大。猫的背面背面有一层蓝色绿色如荧光一般的薄膜(绒毡层) Lucidum),可增加在暗处的视力。提示中,猫眼能呈现瞳孔颜色。类似多су食肉动物,猫眼长在面部朝正前方,赋予其辽阔的视野,单一猫眼视野为100度,双眼视野为285度,加上颈旋灵活性,总共视​​野比人类双眼只有100度灵活解剖。不过,猫只能聚焦其前30厘米至3米之物,相对人类而言属大近视。猫对三原色的视觉力很差,相对人类而言,猫有黄蓝色盲红绿色辨成灰黄色,与狗相似。关于猫的夜视能力,生物学家发现牛磺酸对猫的视觉忧虑很大作用,猫本身不能合成牛磺酸,必须由外食。缺乏牛磺酸,可使视觉及夜视能力变差,影响夜间据生物学家称,猫捕经常捕鼠,是因老鼠中部含牛鼻子。[52][53]可以通过猫的晶状体。当感觉光线微弱时,猫会用毛来改善行动力与捕捉能力。感觉毛主要分布于鼻子、下巴、双眼上方、两面部也有数根。感觉毛可感受到非常微弱的眼神,目视清晰时也能辨识辨别识隐位置。胡须快速尖端与双耳连成一线,恰是能通过障碍的最小范围,故猫可在黑夜中判断能力能否通过。猫有第三眼睑,当猫眼睑张第三开时,眨眼时眼睑会从旁遮盖眼睛。若猫生病,或睡眠,微笑,此眼皮会缩回上部。若猫长时间稠露第三眼睑,表示其健康有问题。
猫爪[编辑]猫的爪子定向还能有伸缩作用,能够向外露张开或者向内缩闭藏起来。猫的趾底有脂肪肉垫,从而行走无声。而按一下这个肉垫,定向的爪爪就会伸出来,养猫的人一般用这种方法来剪爪。大多数猫都有磨爪的习惯。而猫偏好的磨爪物各部分。猫可能会选择沙发、人类甚至人类的穿着等作为自己的磨爪物家。
感官[编辑]猫的感官渴望狩猎。在浣熊类动物中,猫的听觉、视觉、嗅觉、味觉、触觉极为敏锐。
^ 生物学特性和解剖生理特征-医生在线[永久失效链接]
^ 51.0 51.1 51.2 《宠艺透视》. 宠艺透视。 20137月:50^ 猫为什么要吃老鼠?德国生物学家解开谜团。中国.ibtimes.com。 [永久失效链接]
^ 美国艺术家模拟猫的观察猫眼看到的世界景像。 [2014-04-05]。 (原始内容文档于2014-04-07)。
^ 在家:护理/健康:了解猫。 [2005-08-15]。 (原始内容文档于2008-02-01)。
^ Strain,GM,狗和其他动物的听力如何?。 [2007-05-12]。 (原始内容文档于2011-08-28)。
^ 鼻子知道。关于.com。 [2006-11-29]。 (原始内容文档于2010-12-06)。
^ 李霞;李卫华、王宏、曹杰、Kenji Maehashi、Liquan Huang、Alexander A. Bachmanov、Danielle R. Reed、Véronique Legrand-Defretin、Gary K. Beauchamp、Joseph G. Brand。甜味受体基因的假性化解释了猫对糖的冷漠。 PLOS Genetics(公共科学图书馆)。 2005-07-25, 1 (1) [2006-11-08]。 doi:10.1371/journal.pgen.0010003。 (原始内容文档于2021-03-13)。 引文使用过时参数共同作者(帮助)
^ 胡苓芝、李冠群. 三花猫-花色形成的原因()(Calico Cat)。 科学在线。 2009-04-27 [2015-02-19]。 (原始内容文档于2015-02-19)。
听觉[编辑]猫每只耳各有32条独立的控制耳壳转动,双耳可分别对应不同的音源转动,使其向猎物移动时仍能对周遭其他音源保持直接接触。[54]除了苏格兰折耳猫同样基因相似的猫以外,猫极少有狗常见的「垂耳」,大多数猫耳向上直立。当猫贪婪愤怒或受惊时,耳朵会贴向对方,并发出咆哮与「嘶」声。猫与人类对低频声音相当于相若。人类中只有极少数的调音师能听到20 kHz以上的高频声音(8.4度的八度音),猫则达到64kHz(10度的八度音),比人类要高1.6个八度音,甚至比狗要高1个八度;但是猫认知音差须开最少5度,猫人类认知音差须开最少0.5度来得粗疏。[51][55]
嗅觉[编辑]家猫的嗅觉较人类灵敏14[56]。猫的鼻腔内有2亿个嗅觉受器,数量甚至超过某些品种的狗(狗嗅觉细胞约1.25亿~2.2亿)。
味觉[编辑]猫早期由于基因突变,失去了甜的味觉,[57]但猫不光能摄取酸、苦、咸的味,选择适合自己口味的食物,还能尝出水的味道,这一点是其他动物所不及的不过总括来说猫的味觉还不够完善,相比一般人类平均有9000个味蕾,猫一般平均只有473个味蕾且不喜好低于同类食物。因此,猫辨别食物乃凭嗅觉多于味觉。[51]
猫磨在蹭蹭时会涂抹出特别的费洛蒙,当这些强调的费洛蒙时,目的就是在宣誓誓言,提醒猫是我的其他行为,其实这种行为是装饰标记地盘的象征,会让他们有安心及安全感。猫的特征主要体现在其肠道、构造身体以及习性等方面。以下是一些主要特征:
1.感觉能力:
•视力:猫的夜视能力非常优秀,能够在微弱的视力下活动。它们的眼睛具有特殊的闪光膜,能够提升在暗处的视力。猫的视野约为285度,比人类更广,但它们的聚焦能力有限,一般只能看清前方30厘米到3米的视线。
•听觉:猫的耳朵有32条独立的被抓取,可以独立转动,能够准确定位声音来源。它们能够采集的高频声音高达64kHz,人类。
•嗅觉:猫的嗅觉比人类敏锐约14倍,鼻腔内约有2亿个嗅觉受器,是捕猎的关键能力。
•味觉:但猫的味觉比较有限,失去了对咸味的调味,对酸、苦和咸味仍然敏感。
2.爪子:猫的爪子非常锋利,并且具有伸缩功能,能够安静地行走。它们的趾底有脂肪垫,行走时不发出声音。
3.身体构造:猫灵活的结构使它们能够轻松地跳跃和攀爬。它们的感觉毛(触须)可以感知非常微弱的空气波动,帮助它们判断周围环境。
4.行为习惯:猫有磨爪子的习惯,常用爪子擦拭物体以维持爪子的健康。此外,猫会用气味标记地盘,通过死亡和身体上的肾上腺体上的特殊费洛蒙进行社交互动。
这些特征使得猫在喙中成为有效的捕猎者和适应环境的生物。
成品链条。
{'input': '猫的特征', 'output': '猫的特征主要体现在其感官、构造身体行为以及习性等方面。以下是一些主要特征:\n\n1.感官能力:\n -视力:猫的夜视能力非常优秀,能够在微弱的视觉下活动。它们的眼睛具有特殊的闪光膜,能够提升在暗处的视力。猫的视野约为285度,比人类更广,但它们的聚焦能力有限,一般只能看清前方30厘米到3米的物体。\n -听力:猫的耳朵有32条独立的被抓取,可以独立转动,能够精准定位声音来源。它们能够感知的近64kHz的声音,远近人类。\n -嗅觉:猫的嗅觉比人类敏锐约14倍,鼻腔内约有2亿个嗅觉受器,是捕猎的关键能力。\n -味觉:猫的但味觉比较有限,失去了对姿势的掌握,酸、苦和咸味仍然敏感。\n\n2.爪子:猫的爪子非常定向,并且具有伸缩功能,能够安静地行走。它们的趾部有脂肪垫,行走时对不发出声音。\n\n3.身体构造:猫灵活的身体结构使它们能够轻松地跳跃和攀爬。它们的感觉毛(触须)可以感知非常微弱的空气波动,帮助它们判断周围的环境。\n\n4.行为习性:猫有磨爪的习惯,常用爪子擦拭身体以维持爪子的健康。此外,猫会用气味标记地盘,通过护士和身体上的特殊的腺体上的费洛蒙进行社交互动。\n\n这些特征使猫在人类中成为有效的捕猎者和适应环境的生物。'}

分析:代理成功地调用了工具,并根据搜索到的内容,总结出一条条理清晰、内容丰富的答案。wiki_search

5.2. 测试场景二:实时搜索

接下来,我们测试Agent的实时信息获取能力。我们提出一个需要联网查询的问题:“今天上海天气怎么样”。

print(agent_executor.invoke({"input": "今天上海天气怎么样"}))

执行日志如下:
进入新的 AgentExecutor 链…
调用:使用tavily_search_results_json{'query': '上海天气'}



> Entering new AgentExecutor chain...

Invoking: `tavily_search_results_json` with `{'query': '今天上海天气'}`


[{'title': '12月3日上海天气阴有雨7°C-11°C', 'url': 'http://sh.bendibao.com/news/2022123/263718.shtm', 'content': '【导语】:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。\n\n12月3日上海天气\n\n\u3000\u3000天况:阴有雨\n\n\u3000\u3000气温:7℃-11℃\n\n\u3000\u3000风力:西北风3-4级\n\n\u3000\u3000空气质量:优到良\n\n\u3000\u3000穿衣指数:毛衣、羽绒服,带伞\n\n今日天气:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。这场雨会下两到三天,双休日将在阴阴雨雨中度过。受弱冷空气扩散影响,北向风为主,温度虽比前几天回升一些,但高湿+北风的气象条件下,体感会比较湿冷。\n\n天气趋势:下周上海晴雨参半,上半周以阴雨天气为主,受冷暖空气交汇影响,天空中云系多,不时有小雨出现,气温也稍有起伏。周一全天气温再度降至10℃以下,周二和周三气温小幅上升,但湿冷的体感依然如影随形。下半周天气形势发生调整,晴或多云天气为主,气温总体保持在7~14℃之间。\n\n未来几日天气\n\n\u3000\u300012月4日(周日):阴有雨,9~12度\n\n\u3000\u300012月5日(周一):阴有小雨转阴到多云,8~10度 [...] 天气趋势:下周上海晴雨参半,上半周以阴雨天气为主,受冷暖空气交汇影响,天空中云系多,不时有小雨出现,气温也稍有起伏。周一全天气温再度降至10℃以下,周二和周三气温小幅上升,但湿冷的体感依然如影随形。下半周天气形势发生调整,晴或多云天气为主,气温总体保持在7~14℃之间。\n\n未来几日天气\n\n\u3000\u300012月4日(周日):阴有雨,9~12度\n\n\u3000\u300012月5日(周一):阴有小雨转阴到多云,8~10度\n\n\u3000\u300012月6日(周二):阴到多云转阴有时有小雨,7~13度\n\n\u3000\u300012月7日(周三):阴有时有小雨转阴到多云有短时小雨,10~14度\n\n注:本文图片来源于上海天气。\n\n手机访问 上海本地宝首页\n\n相关推荐 上海天气预报 上海天气情况\n\n- 2025上海国庆天气预报(21~31℃ 多云为主)\n\n  今年国庆和中秋假期上海天气条件总体适宜出行。假期一头一尾天气较好。10月2-5日局地有弱降水。6日(中秋节)白天降水相对明显,夜间雨渐止,可见彩云追月。\n- 8月26日上海发布高温橙色预警 [...] 民生\n 办事\n 社保\n 公积金\n 交通\n 地铁\n 旅游\n 景点\n 活动\n 教育\n 网点\n 招聘\n 房产\n 特惠\n\n 生活指南\n 关注\n 生活\n 经济\n 旅游\n 社会\n 教育\n 文体\n 提醒\n 新政\n\n上海本地宝 > 资讯快递 > 上海天气 > 12月3日上海天气阴有雨7°C-11°C\n\n2022-12-03 09:04作者:紫罗【我要纠错】\n\n分享至\n\n【导语】:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。\n\n12月3日上海天气\n\n\u3000\u3000天况:阴有雨\n\n\u3000\u3000气温:7℃-11℃\n\n\u3000\u3000风力:西北风3-4级\n\n\u3000\u3000空气质量:优到良\n\n\u3000\u3000穿衣指数:毛衣、羽绒服,带伞\n\n今日天气:今天阴有短时小雨,上午转阴有雨,雨量可达中雨程度,雨势较为明显,大家外出记得携带雨具,注意交通安全。全天气温在7-11度。这场雨会下两到三天,双休日将在阴阴雨雨中度过。受弱冷空气扩散影响,北向风为主,温度虽比前几天回升一些,但高湿+北风的气象条件下,体感会比较湿冷。', 'score': 0.99762183}]今天上海的天气是阴有雨,气温在7°C到11°C之间。上午天气由短时小雨转为阴有雨,预计雨量达中雨程度。建议外出时携带雨具,并注意交通安全。风力为西北风3-4级,空气质量良好。适宜穿着毛衣和羽绒服。

未来几天的天气也会持续阴雨,具体情况如下:
- 124日(周日):阴有雨,9~12°C
- 125日(周一):阴有小雨转阴到多云,8~10°C

因此,出门时请准备好雨具和适合的衣物。[详细信息](http://sh.bendibao.com/news/2022123/263718.shtm)

> Finished chain.
{'input': '今天上海天气怎么样', 'output': '今天上海的天气是阴有雨,气温在7°C到11°C之间。上午天气由短时小雨转为阴有雨,预计雨量达中雨程度。建议外出时携带雨具,并注意交通安全。风力为西北风3-4级,空气质量良好。适宜穿着毛衣和羽绒服。\n\n未来几天的天气也会持续阴雨,具体情况如下:\n- 12月4日(周日):阴有雨,9~12°C\n- 12月5日(周一):阴有小雨转阴到多云,8~10°C\n\n因此,出门时请准备好雨具和适合的衣物。[详细信息](http://sh.bendibao.com/news/2022123/263718.shtm)'}

分析:面对这个问题,Agent 智能地切换到工具,获取了最新的天气信息,并给出了一个包含关键数据和链接的规则答案。因为这是我们在第 3.1 节中为工具设置“搜索维基百科”,Agent 通过语义判断出“天气”问题与该描述不符,选择了更通用的网络相应搜索工具。

6. 终极进化:为Agent添加记忆

6.1. 会话记忆的重要性

另外,我们的Agent交互交互都是独立的,它无法记住之前的对话内容。这种无状态的特性限制了它进行连贯、自然的对话。要创建真正的对话式Agent,记忆功能至关重要。

6.2. 实现会话记忆

LangChain 提供了包装器,可以轻松地为任何 Runnable(包括我们的)添加处理会话历史记录的能力。
我们需要定义一个函数,它根据确定的来获取或创建对应的聊天记录。这里我们使用一个简单的字典来存储不同会话的历史记录,确保不同用户之间的对话历史记录是相互隔离的。

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

store = {}

def get_session_history(session_id: str) -> BaseChatMessageHistory:
 if session_id not in store:
     store[session_id] = ChatMessageHistory()
 return store[session_id]

agent_with_chat_history = RunnableWithMessageHistory(
 runnable=agent_executor,
 get_session_history=get_session_history,
 input_messages_key="input",
 history_messages_key="chat_history",
)

6.3. 测试记忆功能

现在,我们通过一个简单的对话流程来验证代理的记忆功能。

  1. 会话 1 (session_id: “123”) -我们首先在一个新的会话中存储信息告诉代理我们的名字。
response = agent_with_chat_history.invoke(
 {"input": "Hi,我的名字是Cyber"},
 config={"configurable": {"session_id": "123"}},
)
print(response)

进入新的 AgentExecutor 链…你好,Cyber​​!很高兴见到你。有什么我可以帮助你的吗?完成的链。

{'input': '嗨,我的名字是Cyber​​', 'chat_history': [], 'output': '你好,Cyber​​!很高兴见到你。我有什么可以帮助你的吗?'}
  1. 会话 1 (session_id: “123”) - 回忆同一次会话中的信息,我们询问 Agent 我们的名字,看它是否能记住。
response = agent_with_chat_history.invoke(
 {"input": "我叫什么名字?"},
 config={"configurable": {"session_id": "123"}},
)

print(response)

进入新的 AgentExecutor 链…你叫 Cyber​​。有什么特别的事情想和我分享吗?完成的链。

{'input': '我叫什么名字?', 'chat_history': [HumanMessage(content='嗨,我的名字是Cyber​​',additional_kwargs={}, response_metadata={}), AIMessage(content='你好,Cyber​​!很高兴见到你。有什么我可以帮助你的吗?',additional_kwargs={}, response_metadata={})], 'output': '你叫网络。有什么特别的事情想和我分享吗?'}

特工成功地回忆起了我们的名字!
3. 会话 2 (session_id: “4566”) - 验证隔离性为了证明不同会话的记忆是隔离的,我们开启一个全新的会话并提出了同样的问题。

response = agent_with_chat_history.invoke(
 {"input": "我叫什么名字?"},
 config={"configurable": {"session_id": "4566"}},
)
print(response)

进入新的 AgentExecutor 链…抱歉,我无法得知您的名字。如果您愿意,可以告诉我您的名字!完成链。

{'input': '我叫什么名字?', 'chat_history': [], 'output': '抱歉,我无法知道你的名字。如果你愿意,可以告诉我你的名字!'}

在这个新会话中,特工表示不知道我们的名字,这个证明了会话记忆的隔离性得到了保证。

思维导图:
在这里插入图片描述

总结

在本文中,我们从零开始,一步步构建了一个功能强大的 LangChain Agent。我们首先配备了两种核心工具:用于实时查询的外部网络和用于内部知识检索的 RAG 检索器。接下来,我们根据不同问题构建了 Agent 的核心执行逻辑,并测试了它智能选择相应工具的能力。最后,我们搭建了会话记忆功能,建立从一个适配器机器人进化到一个能够进行连贯对话的智能助手。本教程为您提供了构建生产级 Agent掌握这些核心模式——工具使用、RAG集成和会话记忆——是开发复杂AI应用的关键。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐