目录
一、功能简述
代码功能概括
🎯 核心能力
二、运作流程
三、核心代码
四、运行结果
五、代码功能拆解
✅ 1. 环境准备与依赖导入
✅ 2. 加载网页文档并处理为向量
✅ 3. 创建检索工具与搜索工具
✅ 4. 初始化语言模型与 Agent
✅ 5. 封装支持多轮记忆的 Agent
✅ 6. 启动主程序:进行多轮对话
✅ 总结:模块划分
一、功能简述
这段代码构建了一个基于 LangChain 的 网页文档+搜索结合的多轮对话智能体系统,可以理解用户问题,通过调用文档检索工具或在线搜索工具智能作答,并具备记住对话历史的能力。下面是简要概括:
代码功能概括
该程序通过以下步骤完成一个带记忆的多轮对话智能体:
环境设置:加载
.env
环境变量、设置 User-Agent 以防网页请求失败。网页加载与处理:
读取指定网页内容(例如一篇关于 iPhone 的新闻)。
使用文本切割器切分为小段落。
用 OpenAI 嵌入模型将其向量化,存入 FAISS 向量数据库。
工具创建:
创建一个用于搜索本地文档的检索工具(Retriever Tool)。
加载一个第三方网络搜索工具(Tavily Search Tool)。
大模型初始化:
加载一个 ChatOpenAI 对象(使用
qwen-plus
模型)。智能体构建:
从 LangChain Hub 加载一个标准函数式 agent 的 Prompt。
用上述工具和大模型创建一个函数式 Agent。
包装成 AgentExecutor,可处理工具调用。
多轮对话支持:
用
RunnableWithMessageHistory
将 AgentExecutor 包装为支持历史记忆的智能体。使用
FileChatMessageHistory
将历史记录持久保存为 JSON 文件,按用户 session 区分。运行交互主程序:
启动一个命令行循环,接收用户输入,调用智能体进行回复,支持连续上下文对话。
用户输入 "exit"/"quit" 即可退出。
🎯 核心能力
✅ 文档问答(从网页构建知识库)
✅ 实时搜索(Tavily 网络搜索)
✅ 多轮对话(有记忆能力)
✅ 支持多个工具联动(Tool Calling)
✅ 面向用户输入动态响应(CLI 循环交互)
二、运作流程
+------------------------------------------------------------+
| 1. 环境初始化 |
|--------------------------------------------------------------|
| - 载入 .env 文件 |
| - 设置 User-Agent 防止网页请求失败 |
+-------------------------------------------------------------+
|
v
+--------------------------------------------------------------------+
| 2. 加载网页内容 (WebBaseLoader) |
+--------------------------------------------------------------------+
|
v
+------------------------------------------------------------------------+
| 3. 文本切分 (RecursiveCharacterTextSplitter) |
| - chunk_size=512, chunk_overlap=200 |
+------------------------------------------------------------------------+
|
v
+----------------------------------------------------------------------------------+
| 4. 文档向量化 (OpenAIEmbeddings + FAISS VectorStore) |
+----------------------------------------------------------------------------------+
|
v
+--------------------------------------------------------------------------+
| 5. 创建检索工具 (Retriever + create_retriever_tool) |
+--------------------------------------------------------------------------+
|
v
+---------------------------------------------------------------------+
| 6. 加载搜索工具 (TavilySearchResults) |
+---------------------------------------------------------------------+
|
v
+-----------------------------------------------------------------------------+
| 7. 初始化 LLM (ChatOpenAI with qwen-plus 模型) |
+-----------------------------------------------------------------------------+
|
v
+--------------------------------------------------------------------------+
| 8. 加载 Agent Prompt (from LangChain Hub) |
+--------------------------------------------------------------------------+
|
v
+--------------------------------------------------------------------------+
| 9. 创建 Agent (create_openai_functions_agent) |
+--------------------------------------------------------------------------+
|
v
+--------------------------------------------------------------------------+
| 10. 创建执行器 AgentExecutor(支持多工具) |
+--------------------------------------------------------------------------+
|
v
+----------------------------------------------------------------------------------+
| 11. 创建历史记录函数 (FileChatMessageHistory per session) |
+----------------------------------------------------------------------------------+
|
v
+----------------------------------------------------------------------------------+
| 12. 包装为多轮对话代理 (RunnableWithMessageHistory) |
+----------------------------------------------------------------------------------+
|
v
+------------------------------------------------------------+
| 13. 启动交互主循环 |
|--------------------------------------------------------------|
| while True: |
| - 输入:input() |
| - 调用 agent_with_memory.invoke |
| - 输出:print(response) |
| - 退出条件:输入 exit / quit |
+------------------------------------------------------------+
三、核心代码
运行前准备
1、访问Tavily(用于在线搜索)注册账号并登录,获取API 密钥
TAVILY_API_KEY申请:Tavily
2、.env文件配置:
# DashScope 兼容 OpenAI API 的接口地址 OPENAI_API_BASE2=https://dashscope.aliyuncs.com/compatible-mode/v1# 你的 DashScope API 密钥(记得替换为你自己的) OPENAI_API_KEY2=sk-.....# 可选:设置用户代理,防止 WebBaseLoader 请求失败 USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
import os
from dotenv import load_dotenv# 设置环境变量,防止网页请求失败
os.environ["USER_AGENT"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"load_dotenv()# 导入 LangChain 相关模块
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain.tools.retriever import create_retriever_tool
from langchain_community.tools.tavily_search import TavilySearchResultsfrom langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor# 多轮对话相关
from langchain_community.chat_message_histories import FileChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory# 1. 初始化大模型
llm = ChatOpenAI(temperature=0.95,model="qwen-plus",openai_api_key=os.getenv("OPENAI_API_KEY2"),openai_api_base=os.getenv("OPENAI_API_BASE2")
)# 2. 加载网页文档
loader = WebBaseLoader("https://new.qq.com/rain/a/20240920A07Y5Y00")
docs = loader.load()# 3. 分割文档
documents = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=200).split_documents(docs)# 4. 向量化
vector_store = FAISS.from_documents(documents, OpenAIEmbeddings())# 5. 创建检索器和检索工具
retriever = vector_store.as_retriever()retriever_tool = create_retriever_tool(retriever,"iPhone_price_search","搜索有关 iPhone 16 的价格信息。对于iPhone 16的任何问题,您必须使用此工具!"
)# 6. 加载Tavily搜索工具
search_tool = TavilySearchResults()# 7. 组合工具
tools = [search_tool, retriever_tool]# 8. 拉取agent prompt
prompt = hub.pull("hwchase17/openai-functions-agent")# 9. 创建OpenAI函数式Agent
agent = create_openai_functions_agent(llm, tools, prompt)# 10. 创建单轮执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True,handle_parsing_errors=True)# 11. 构造历史存储函数,按 session_id 存储文件
def get_session_history(session_id: str):return FileChatMessageHistory(f"chat_history_{session_id}.json")# 12. 用 RunnableWithMessageHistory 包装 agent_executor 支持多轮对话
agent_with_memory = RunnableWithMessageHistory(agent_executor,get_session_history,input_messages_key="input", # 传入用户输入的 keyhistory_messages_key="chat_history" # 历史消息key,和agent executor内部兼容
)# 13. 启动多轮对话交互
if __name__ == "__main__":session_id = "user1" # 多用户时可动态设定print("欢迎使用多轮对话智能体,输入 exit 或 quit 退出。\n")while True:user_input = input("你:")if user_input.lower() in ["exit", "quit", "退出"]:print("已退出对话。")breakresult = agent_with_memory.invoke({"input": user_input},config={"configurable": {"session_id": session_id}})print("AI:", result["output"])
四、运行结果
说明:红色为用户问题,橙色为AI回复,蓝色为分析过程
欢迎使用多轮对话智能体,输入 exit 或 quit 退出。
你:你好
> Entering new AgentExecutor chain...
你好!有什么可以帮您的吗?> Finished chain.
AI: 你好!有什么可以帮您的吗?
你:我是ship,你是谁
> Entering new AgentExecutor chain...
你好,ship!我是通义千问,阿里巴巴集团旗下的超大规模语言模型。我能够帮助你回答问
题、创作文字,比如写故事、写公文、写邮件、写剧本,进行逻辑推理、编程等等。很高兴
见到你,有什么需要帮忙的吗?> Finished chain.
AI: 你好,ship!我是通义千问,阿里巴巴集团旗下的超大规模语言模型。我能够帮助你
回答问题、创作文字,比如写故事、写公文、写邮件、写剧本,进行逻辑推理、编程等等。
很高兴见到你,有什么需要帮忙的吗?
你:苹果16有哪些型号
> Entering new AgentExecutor chain...
苹果 iPhone 16 系列共有四款不同的型号,每款都提供了不同的屏幕尺寸、处理器性能以
及相机配置,以满足不同用户的需求。以下是具体的型号信息:### 1. **iPhone 16**
- **屏幕**:6.1 英寸 Super Retina XDR 显示屏
- **处理器**:A18 仿生芯片
- **存储选项**:128GB, 256GB, 512GB
- **相机**:双摄系统(4800万像素主摄 + 1200万像素超广角)
- **特色**:适合日常使用,轻便且性价比高。### 2. **iPhone 16 Plus**
- **屏幕**:6.7 英寸 Super Retina XDR 显示屏
- **处理器**:A18 仿生芯片
- **存储选项**:128GB, 256GB, 512GB
- **相机**:双摄系统(4800万像素主摄 + 1200万像素超广角)
- **特色**:大屏幕设计,适合喜欢观看视频或玩游戏的用户。### 3. **iPhone 16 Pro**
- **屏幕**:6.1 英寸 ProMotion Super Retina XDR 显示屏(支持 120Hz 刷新率)
- **处理器**:A18 Pro 仿生芯片
- **存储选项**:128GB, 256GB, 512GB, 1TB
- **相机**:三摄系统(4800万像素主摄 + 4800万像素超广角 + 1200万像素长焦)
- **特色**:钛金属边框,更高端的设计和更强的性能,适合专业人士。### 4. **iPhone 16 Pro Max**
- **屏幕**:6.7 英寸 ProMotion Super Retina XDR 显示屏(支持 120Hz 刷新率)
- **处理器**:A18 Pro 仿生芯片
- **存储选项**:256GB, 512GB, 1TB
- **相机**:三摄系统(4800万像素主摄 + 4800万像素超广角 + 1200万像素长焦)
- **特色**:最大尺寸的屏幕和最先进的相机系统,特别适合摄影爱好者和专业用户。---
### 总结:
- **标准版**:iPhone 16 和 iPhone 16 Plus 面向普通消费者,提供出色的日常体验。
- **高端版**:iPhone 16 Pro 和 iPhone 16 Pro Max 面向追求极致性能和影像能力的用
户。如果你有具体的预算或需求,可以告诉我,我可以帮你推荐最适合的型号!
> Finished chain.
AI: 苹果 iPhone 16 系列共有四款不同的型号,每款都提供了不同的屏幕尺寸、处理器性
能以及相机配置,以满足不同用户的需求。以下是具体的型号信息:### 1. **iPhone 16**
- **屏幕**:6.1 英寸 Super Retina XDR 显示屏
- **处理器**:A18 仿生芯片
- **存储选项**:128GB, 256GB, 512GB
- **相机**:双摄系统(4800万像素主摄 + 1200万像素超广角)
- **特色**:适合日常使用,轻便且性价比高。### 2. **iPhone 16 Plus**
- **屏幕**:6.7 英寸 Super Retina XDR 显示屏
- **处理器**:A18 仿生芯片
- **存储选项**:128GB, 256GB, 512GB
- **相机**:双摄系统(4800万像素主摄 + 1200万像素超广角)
- **特色**:大屏幕设计,适合喜欢观看视频或玩游戏的用户。### 3. **iPhone 16 Pro**
- **屏幕**:6.1 英寸 ProMotion Super Retina XDR 显示屏(支持 120Hz 刷新率)
- **处理器**:A18 Pro 仿生芯片
- **存储选项**:128GB, 256GB, 512GB, 1TB
- **相机**:三摄系统(4800万像素主摄 + 4800万像素超广角 + 1200万像素长焦)
- **特色**:钛金属边框,更高端的设计和更强的性能,适合专业人士。### 4. **iPhone 16 Pro Max**
- **屏幕**:6.7 英寸 ProMotion Super Retina XDR 显示屏(支持 120Hz 刷新率)
- **处理器**:A18 Pro 仿生芯片
- **存储选项**:256GB, 512GB, 1TB
- **相机**:三摄系统(4800万像素主摄 + 4800万像素超广角 + 1200万像素长焦)
- **特色**:最大尺寸的屏幕和最先进的相机系统,特别适合摄影爱好者和专业用户。---
### 总结:
- **标准版**:iPhone 16 和 iPhone 16 Plus 面向普通消费者,提供出色的日常体验。
- **高端版**:iPhone 16 Pro 和 iPhone 16 Pro Max 面向追求极致性能和影像能力的用
户。如果你有具体的预算或需求,可以告诉我,我可以帮你推荐最适合的型号!
你:主要是价格预算我不希望超过6500,像素要好一点,内存256或512
> Entering new AgentExecutor chain...
根据你的预算(不超过6500元)、对像素的要求以及存储需求(256GB或512GB),以下是适
合你的推荐:---
### **推荐机型:iPhone 16 Plus (256GB 或 512GB)**
#### **原因:**
1. **摄像头性能**:
- iPhone 16 Plus 配备了 **4800万像素主摄 + 1200万像素超广角** 的双摄系统,能
够满足高像素拍摄需求。
- 主摄支持更高质量的照片输出,并且在低光环境下也有较好的表现。2. **存储选择**:
- 256GB 版本的价格通常在 **6399元左右**,符合你的预算。
- 如果需要更大存储空间,512GB 版本价格稍高,但可以关注促销活动(如双十一、618等),可能会降到接近预算范围。3. **性价比**:
- iPhone 16 Plus 提供了大屏幕(6.7英寸)和更好的电池续航能力,同时价格比 Pro
系列更低,非常适合预算有限但追求高像素摄影的用户。---
### **为什么不推荐其他型号?**
1. **iPhone 16**:
- 虽然也具备4800万像素主摄,但屏幕较小(6.1英寸),存储版本为256GB时价格与 iPhone 16 Plus 差不多,因此性价比略低。2. **iPhone 16 Pro / Pro Max**:
- 这两款机型虽然拥有更强的三摄系统和性能,但起售价超过6500元,不符合你的预算
范围。---
### **总结建议:**
- **首选**:iPhone 16 Plus (256GB),价格约为 **6399元**,完全符合你的预算,并提
供出色的拍照性能。
- **备选**:如果未来有促销活动,可以考虑 iPhone 16 Plus (512GB) 或 iPhone 16 (256GB)。希望这个推荐对你有帮助!如果有其他问题,欢迎随时提问! 😊
> Finished chain.
AI: 根据你的预算(不超过6500元)、对像素的要求以及存储需求(256GB或512GB),以
下是适合你的推荐:---
### **推荐机型:iPhone 16 Plus (256GB 或 512GB)**
#### **原因:**
1. **摄像头性能**:
- iPhone 16 Plus 配备了 **4800万像素主摄 + 1200万像素超广角** 的双摄系统,能
够满足高像素拍摄需求。
- 主摄支持更高质量的照片输出,并且在低光环境下也有较好的表现。2. **存储选择**:
- 256GB 版本的价格通常在 **6399元左右**,符合你的预算。
- 如果需要更大存储空间,512GB 版本价格稍高,但可以关注促销活动(如双十一、618等),可能会降到接近预算范围。3. **性价比**:
- iPhone 16 Plus 提供了大屏幕(6.7英寸)和更好的电池续航能力,同时价格比 Pro
系列更低,非常适合预算有限但追求高像素摄影的用户。---
### **为什么不推荐其他型号?**
1. **iPhone 16**:
- 虽然也具备4800万像素主摄,但屏幕较小(6.1英寸),存储版本为256GB时价格与 iPhone 16 Plus 差不多,因此性价比略低。2. **iPhone 16 Pro / Pro Max**:
- 这两款机型虽然拥有更强的三摄系统和性能,但起售价超过6500元,不符合你的预算
范围。---
### **总结建议:**
- **首选**:iPhone 16 Plus (256GB),价格约为 **6399元**,完全符合你的预算,并提
供出色的拍照性能。
- **备选**:如果未来有促销活动,可以考虑 iPhone 16 Plus (512GB) 或 iPhone 16 (256GB)。希望这个推荐对你有帮助!如果有其他问题,欢迎随时提问! 😊
你:谢谢
> Entering new AgentExecutor chain...
不客气!如果你还有其他问题,无论是关于手机、科技产品,还是其他方面的问题,随时都
可以问我。希望你能找到满意的手机,使用愉快! 😊祝你有个美好的一天!如果有需要,我们下次再聊! 👋
> Finished chain.
AI: 不客气!如果你还有其他问题,无论是关于手机、科技产品,还是其他方面的问题,
随时都可以问我。希望你能找到满意的手机,使用愉快! 😊祝你有个美好的一天!如果有需要,我们下次再聊! 👋
你:恐龙统治地球多少年
> Entering new AgentExecutor chain...
恐龙统治地球的时间大约为**1.6亿年**。以下是更详细的解释:恐龙生活在地质年代中的中生代,这一时期也被称为“恐龙时代”。中生代分为三个主要阶段
:1. **三叠纪(Triassic Period)**:
- 时间范围:约2.3亿年前至2亿年前。
- 这是恐龙刚刚出现的时期,最早的恐龙种类在此时开始进化。2. **侏罗纪(Jurassic Period)**:
- 时间范围:约2亿年前至1.45亿年前。
- 恐龙在这一时期迅速繁盛,成为地球上的主要陆地生物。著名的恐龙如梁龙和剑龙出
现在这一时期。3. **白垩纪(Cretaceous Period)**:
- 时间范围:约1.45亿年前至6600万年前。
- 这一时期的恐龙种类更加多样化,包括暴龙和三角龙等著名物种。然而,在白垩纪末
期,恐龙因一次大规模的灭绝事件(可能是小行星撞击地球导致的)而消失。### 总结:
从恐龙首次出现到它们灭绝,整个时间段跨越了大约**1.6亿年**(从2.3亿年前到6600万年
前)。尽管恐龙已经灭绝,但它们的后代——鸟类——仍然存活至今,并继续演化。如果你对恐龙或其他古生物学问题感兴趣,可以随时问我! 🦖
> Finished chain.
AI: 恐龙统治地球的时间大约为**1.6亿年**。以下是更详细的解释:恐龙生活在地质年代中的中生代,这一时期也被称为“恐龙时代”。中生代分为三个主要阶段
:1. **三叠纪(Triassic Period)**:
- 时间范围:约2.3亿年前至2亿年前。
- 这是恐龙刚刚出现的时期,最早的恐龙种类在此时开始进化。2. **侏罗纪(Jurassic Period)**:
- 时间范围:约2亿年前至1.45亿年前。
- 恐龙在这一时期迅速繁盛,成为地球上的主要陆地生物。著名的恐龙如梁龙和剑龙出
现在这一时期。3. **白垩纪(Cretaceous Period)**:
- 时间范围:约1.45亿年前至6600万年前。
- 这一时期的恐龙种类更加多样化,包括暴龙和三角龙等著名物种。然而,在白垩纪末
期,恐龙因一次大规模的灭绝事件(可能是小行星撞击地球导致的)而消失。### 总结:
从恐龙首次出现到它们灭绝,整个时间段跨越了大约**1.6亿年**(从2.3亿年前到6600万年
前)。尽管恐龙已经灭绝,但它们的后代——鸟类——仍然存活至今,并继续演化。如果你对恐龙或其他古生物学问题感兴趣,可以随时问我! 🦖
你:那这之后地球经理了哪几大阶段才有了现代社会
> Entering new AgentExecutor chain...
恐龙灭绝后,地球进入了**新生代**(Cenozoic Era),这是地球历史上最近的一个地质时
代,也是哺乳动物和人类逐渐崛起的阶段。以下是新生代的主要阶段及其特征:---
### 1. **古近纪(Paleogene Period)**
- **时间范围**:约6600万年前至2300万年前。
- **主要事件**:
- 恐龙灭绝后,哺乳动物迅速演化并占据生态系统的主导地位。
- 原始灵长类动物开始出现,为后来的人类进化奠定了基础。
- 气候温暖湿润,森林覆盖广泛。**三个时期**:
- **古新世(Paleocene Epoch)**:哺乳动物多样化发展的初期。
- **始新世(Eocene Epoch)**:气候变暖,植物和动物繁荣。
- **渐新世(Oligocene Epoch)**:气候逐渐变冷,草原开始扩展。---
### 2. **新近纪(Neogene Period)**
- **时间范围**:约2300万年前至258万年前。
- **主要事件**:
- 哺乳动物进一步演化,许多现代动物家族开始形成。
- 灵长类动物逐渐发展出更高的智力和社会行为。
- 气候波动较大,但总体趋于干燥和寒冷。**两个时期**:
- **中新世(Miocene Epoch)**:许多现代哺乳动物种类出现。
- **上新世(Pliocene Epoch)**:气候变化加剧,早期人类祖先(如南方古猿)出
现。---
### 3. **第四纪(Quaternary Period)**
- **时间范围**:约258万年前至今。
- **主要事件**:
- 冰河时期多次发生,地球经历了剧烈的气候波动。
- 人类的祖先(如直立人、尼安德特人和智人)逐步演化。
- 现代社会的雏形在这一时期逐渐形成。**两个时期**:
- **更新世(Pleistocene Epoch)**:冰河时期频繁,人类祖先开始使用工具和语言
。
- **全新世(Holocene Epoch)**:始于约1.17万年前,气候相对稳定,农业、文明
和现代社会逐步发展。---
### 人类社会的演化进程:
1. **旧石器时代**:约250万年前至1万年前,人类以狩猎采集为生。
2. **新石器时代**:约1万年前开始,农业和定居生活兴起。
3. **青铜时代**:约5000年前,金属工具和技术开始普及。
4. **铁器时代**:约3000年前,铁器的使用推动了生产力的巨大提升。
5. **中世纪到现代社会**:随着科学技术的进步,人类逐步进入工业革命、信息时代和全
球化阶段。---
### 总结:
从恐龙灭绝后的**古近纪**,到**新近纪**和**第四纪**,地球经历了漫长的生物演化和气
候变化,最终孕育出了现代人类社会。这个过程跨越了约**6600万年**,而人类文明的历史
只是其中非常短暂的一部分(约数千年)。> Finished chain.
AI: 恐龙灭绝后,地球进入了**新生代**(Cenozoic Era),这是地球历史上最近的一个
地质时代,也是哺乳动物和人类逐渐崛起的阶段。以下是新生代的主要阶段及其特征:---
### 1. **古近纪(Paleogene Period)**
- **时间范围**:约6600万年前至2300万年前。
- **主要事件**:
- 恐龙灭绝后,哺乳动物迅速演化并占据生态系统的主导地位。
- 原始灵长类动物开始出现,为后来的人类进化奠定了基础。
- 气候温暖湿润,森林覆盖广泛。**三个时期**:
- **古新世(Paleocene Epoch)**:哺乳动物多样化发展的初期。
- **始新世(Eocene Epoch)**:气候变暖,植物和动物繁荣。
- **渐新世(Oligocene Epoch)**:气候逐渐变冷,草原开始扩展。---
### 2. **新近纪(Neogene Period)**
- **时间范围**:约2300万年前至258万年前。
- **主要事件**:
- 哺乳动物进一步演化,许多现代动物家族开始形成。
- 灵长类动物逐渐发展出更高的智力和社会行为。
- 气候波动较大,但总体趋于干燥和寒冷。**两个时期**:
- **中新世(Miocene Epoch)**:许多现代哺乳动物种类出现。
- **上新世(Pliocene Epoch)**:气候变化加剧,早期人类祖先(如南方古猿)出
现。---
### 3. **第四纪(Quaternary Period)**
- **时间范围**:约258万年前至今。
- **主要事件**:
- 冰河时期多次发生,地球经历了剧烈的气候波动。
- 人类的祖先(如直立人、尼安德特人和智人)逐步演化。
- 现代社会的雏形在这一时期逐渐形成。**两个时期**:
- **更新世(Pleistocene Epoch)**:冰河时期频繁,人类祖先开始使用工具和语言
。
- **全新世(Holocene Epoch)**:始于约1.17万年前,气候相对稳定,农业、文明
和现代社会逐步发展。---
### 人类社会的演化进程:
1. **旧石器时代**:约250万年前至1万年前,人类以狩猎采集为生。
2. **新石器时代**:约1万年前开始,农业和定居生活兴起。
3. **青铜时代**:约5000年前,金属工具和技术开始普及。
4. **铁器时代**:约3000年前,铁器的使用推动了生产力的巨大提升。
5. **中世纪到现代社会**:随着科学技术的进步,人类逐步进入工业革命、信息时代和全
球化阶段。---
### 总结:
从恐龙灭绝后的**古近纪**,到**新近纪**和**第四纪**,地球经历了漫长的生物演化和气
候变化,最终孕育出了现代人类社会。这个过程跨越了约**6600万年**,而人类文明的历史
只是其中非常短暂的一部分(约数千年)。
你:exit
已退出对话。
五、代码功能拆解
✅ 1. 环境准备与依赖导入
os.environ["USER_AGENT"] = "Mozilla/5.0 ..."
load_dotenv()
-
设置网页请求的 User-Agent,防止请求被拦截。
-
加载
.env
文件中的环境变量(如 API 密钥)。
✅ 2. 加载网页文档并处理为向量
docs = loader.load()
documents = RecursiveCharacterTextSplitter(...).split_documents(docs)
vector_store = FAISS.from_documents(documents, OpenAIEmbeddings())
-
使用
WebBaseLoader
加载指定 URL 的网页内容。 -
将网页文本切割成小块(chunk)。
-
将这些文本块转化为向量,并构建 FAISS 向量数据库。
✅ 3. 创建检索工具与搜索工具
retriever_tool = create_retriever_tool(...)
search_tool = TavilySearchResults()
-
基于 FAISS 检索器创建一个用于 iPhone 16 相关问答的工具。
-
加载外部搜索工具(如 Tavily)。
✅ 4. 初始化语言模型与 Agent
llm = ChatOpenAI(...)
prompt = hub.pull(...)
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(...)
-
初始化通义千问(
qwen-plus
)模型。 -
从 LangChain hub 拉取标准 prompt。
-
创建一个函数式 Agent,可以调用工具。
-
用
AgentExecutor
封装 Agent,实现一个单轮问答执行器。
✅ 5. 封装支持多轮记忆的 Agent
def get_session_history(session_id: str): ...
agent_with_memory = RunnableWithMessageHistory(...)
-
设置以
session_id
为单位的对话历史文件(JSON 存储)。 -
使用
RunnableWithMessageHistory
封装 agent executor,支持记忆上下文。
✅ 6. 启动主程序:进行多轮对话
while True:user_input = input("你:")...result = agent_with_memory.invoke(...)print("AI:", result["output"])
-
用户输入一轮提问。
-
Agent 执行(带有历史记忆),自动决定是否调用检索/搜索工具。
-
输出回答,记录历史到 JSON 文件。
-
循环直到用户退出。
✅ 总结:模块划分
步骤 | 模块 | 作用 |
---|---|---|
1 | os , dotenv | 环境变量设置 |
2 | WebBaseLoader | 加载网页 |
3 | TextSplitter + FAISS | 向量化处理 |
4 | create_retriever_tool , TavilySearchResults | 工具构建 |
5 | ChatOpenAI , hub , AgentExecutor | LLM 与 Agent 初始化 |
6 | FileChatMessageHistory , RunnableWithMessageHistory | 多轮记忆功能 |
7 | input() loop | 主体交互逻辑 |