最近在做RAG,调研后发现ReACT好像更具有说服力,对最终结果的解释也更加合理。
举个例子,我扔给大模型这样一个问题:15的平方是多少?另外,法国的首都是哪里?
采用ReACT的运行结果如下:
> Entering new AgentExecutor chain...
我需要先计算15的平方,然后搜索法国的首都。
Action: 平方计算器
Action Input: "15"
Observation: 15 的平方等于 225 。
Thought:我需要进行第二次行动以获取法国首都的信息。
Action: 搜索
Action Input: "法国的首都"
Observation: {'query': '法国的首都', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'title': '法国的首都是什么? - 百度知道', 'url': 'https://zhidao.baidu.com/question/1308972163540040099.html', 'content': '法国的首都是巴黎。 巴黎(Paris),是法兰西共和国的首都和最大城市,也是法国的政治、经济、文化和商业中心,世界五个国际大都市之一(其余四个分别为纽约、伦敦、东京、香港),并被GaWC评为Alpha+级世界一线城市。', 'score': 0.9168945, 'raw_content': None}, {'title': '巴黎(法兰西共和国首都)_百度百科', 'url': 'https://baike.baidu.com/item/巴黎/858', 'content': '巴黎(Paris),是法兰西共和国的首都和最大城市,也是法国的政治、经济、文化和商业中心,世界五个国际大都市之一(其余四个分别为纽约、伦敦、东京、香港),并被GaWC评为Alpha+级世界一线城市。巴黎位于法国北部巴黎盆地的中央,横跨塞纳河两岸,城市中心坐标为北纬48°52′、东经2°25′。', 'score': 0.8591094, 'raw_content': None}, {'title': '巴黎 - 维基百科,自由的百科全书', 'url': 'https://zh.wikipedia.org/wiki/巴黎', 'content': '巴黎是法國的首都,也是中央政府的所在地。法國總統的官邸愛麗舍宮位於巴黎第八區,法國總理的官邸馬提尼翁府則位於巴黎第七區。其他政府機構則散佈在市區各處,其中許多機關都位在巴黎第七區,靠近馬提尼翁府。', 'score': 0.85008353, 'raw_content': None}, {'title': '法国(法兰西共和国)_百度百科', 'url': 'https://baike.baidu.com/item/法国/1173384', 'content': '法兰西共和国(法语:La République française),简称法国,首都巴黎,位于欧洲西部,与比利时、卢森堡、德国、瑞士、意大利、摩纳哥、西班牙、安道尔接壤,西北隔英吉利海峡与英国相望,海洋性、大陆性、地中海型和山地气候并存。地势东南高西北低。总面积550000平方千米(不含海外领地', 'score': 0.82795376, 'raw_content': None}, {'title': '巴黎作为法国的首都和最大城市,地理环境和气候有什么特点?', 'url': 'https://www.qulishi.com/article/202102/486805.html', 'content': '巴黎作为法国的首都和最大城市,地理环境和气候有什么特点?-趣历史网 风云人物 历史解密 战史风云 野史秘闻 文史百科 国学文化 老照片 更多_>_ 诗词名句 成语故事 神话故事 传统文化 古文名著 再现历史 推荐 帝王 将相 后宫 文人 野秘 探索 影视 神话 世界之最 更多 首页 /世界史 /首页 /兰波 _/_正文 巴黎作为法国的首都和最大城市,地理环境和气候有什么特点? 2021-02-24 10:14:01 兰波 拉·封丹 诺查丹玛斯 玛戈王后 德日进 巴黎(Paris),是法兰西共和国的首都和最大城市,也是法国的政治、经济、文化和商业中心,世界五个国际大都市之一(其余四个分别为纽约、伦敦、东京、香港),并被GaWC评为Alpha+级世界一线城市。下面趣历史小编就为大家带来详细的介绍,一起来看看吧! 巴黎位于法国北部巴黎盆地的中央,横跨塞纳河两岸,城市中心坐标为北纬48°52′、东经2°25′。广义的巴黎有小巴黎和大巴黎之分。小巴黎指大环城公路以内的巴黎城市内,面积105.4平方公里,人口224万;大巴黎包括城区周围的上塞纳省、瓦勒德马恩省、塞纳-圣但尼省、伊夫林省、瓦勒德瓦兹省、塞纳-马恩省和埃松省七个省,共同组成巴黎大区,这片地区在古代就已经被称作“法兰西岛”(ile-de-france),都会区人口约为1100万,占据全国人口的六分之一。 巴黎建都已有1400多年的历史,它不仅是法国,也是西欧的政治、经济和文化中心。 2017年8月1日,国际奥委会宣布,巴黎成为2024年奥运会主办城市。2018年1月20日,法国总理爱德华·菲利普正式向法国负责世博会申办工作的部际代表帕斯卡尔·拉米提出,出于财政预算方面的考虑,巴黎将退出申办2025年世博会。 人口民族 人口 2016年的数据显示,大巴黎都会区的人口约为1100万,巴黎市区的人口约为225万。 民族 根据2016年法国国家统计与经济研究所的研究显示,居住在巴黎的居民中有20%是外来移民,20岁以下的居民中有41.3%至少有一位双亲是外来移民。在18岁以下的居民中,12.1%是马格里布人、9.9%来自撒哈拉以南非洲、4.0%则有南欧的血统。35%的法兰西岛居民,大约有400万人不是外来移民(17%)就是双亲中至少有一位是外来移民(18%)。 地理环境 位置境域 巴黎地处法国北部,塞纳河两岸,距河口(英吉利海峡)375千米,城市中心坐标为北纬48°52′,东经2°25′。塞纳河蜿蜒穿过城市,形成两座河心岛(Île de la Cité和圣路易)。大巴黎都会区,即法兰西岛,包括分布在巴黎城墙周围、由同巴黎连成一片的市区组成的上塞纳省、瓦勒德马恩省和塞纳-圣但尼省。小巴黎则是巴黎市区。小巴黎面积约为105.4平方千米,大巴黎都会区面积约为12000平方千米。 地形地貌 巴黎南靠中央高原,东至洛林高原,北邻阿登高地,西到阿莫里坎丘陵,巴黎处在巴黎盆地的中央,地势低平,平均海拔约为178米。 气候 城市本身踞巴黎盆地中央,属温和的海洋性气候,夏无酷暑,冬无严寒;1月平均气温3℃,7月平均气温18℃,年平均气温10℃。全年降雨分布均衡,夏秋季稍多,年平均降雨量619毫米。 水文 塞纳河是巴黎主要的河流,该河流全长776.6千米,包括支流在内的流域总面积为78700平方千米,其排水网络的运输量占巴黎境内河航运量的大部分。 地方特产 法国大蜗牛(Escargot):一种可食用蜗牛。该菜一般是用蒜和黄油为佐料。由于蜗牛是带壳的,所以上菜时有专门的叉子用来将肉取出。 法式杂碎(Sweet breads):该菜一般是先把牛肉用原汤用中文火微煮,然后将肉切成片,裹上面粉,然后再微煎。微煎时一般加入柠檬和腌制过的刺山果花蕾。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。 大家都在搜 _•_法国大革命时期,其颁布的纲领性文件《人权宣言》有什么内容? _•_法国国王路易十四在位期间有哪些成就?对法国又有什么影响? _•_法国为什么会修建埃菲尔铁塔?时值法国大革命一百周年 _•_法国大革命产生的原因到底是什么?启蒙时代带来了愤恨和渴望 _•_法国二月革命的过程与结果是怎样的?该如何评价法国二月革命 _•_法国大革命是怎么结束的?其彻底地摧毁了专制制度 _•_法国七月革命简介:法国人民为何要推翻复辟的波旁王朝? _•_法国杰出的小说家安德烈·纪德去世 _•_神圣罗马帝国是罗马帝国吗?法国思想家伏尔泰如何评论? _•_梅多克产区简介:法国波尔多地区最显赫最尊贵的葡萄酒产区 陈霸先传位之谜:为何选择侄子陈蒨而非儿子? 历史 2025-01-13 光武帝刘秀:历史上的卓越统治者与军事天才 帝王 2025-01-10 刘备的父爱与刘禅的成长:能力背后的复杂因素 历史 2025-01-09 刘谌:刘禅之子中的铮铮铁骨 帝王 2025-01-08 刘贺被废黜:真相远不止“做尽坏事” 帝王 2025-01-08 #### 王翦与李牧:巅峰对决的最终胜者 1.9万 阅读 #### 袁崇焕:捍卫明朝边疆的英雄,而非破坏者 5.5万 阅读 #### 曹操对高顺与张辽的不同处置:忠诚与能力的考量 7.7万 阅读 #### 关羽与张辽的深厚友情及张辽未投刘备之谜 8.9万 阅读 #### 嘉庆智搜和珅:从“墙里”挖出数亿白银 7.6万 阅读 #### 巴顿将军:为何被誉为“漂亮的汉子” 9.7万 阅读 袁崇焕:捍卫明朝边疆的英雄,而非破坏者 晚清时期的穷人到底是什么样的 和电视剧里的完全不同 晚清时期的穷人到底是什么样的 和电视剧上的完全不是一个级别', 'score': 0.82391036, 'raw_content': None}], 'response_time': 1.74}
Thought:I now know the final answer.
Final Answer: 15的平方是225,法国的首都是巴黎。
> Finished chain.
{'input': '15的平方是多少?另外,法国的首都是哪里?', 'output': '15的平方是225,法国的首都是巴黎。'}
模型接收到问题后会自动拆解问题,调用与之对应的工具函数获取结果,然后生成最终的答案。在这个例子中,我定义了2个工具函数,一个是求解一个整数的平方,一个是网络搜索。废话不多说,上代码。
1. 首先导入需要的包。
import os
import torch
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 解决huggingface下载慢
# 基于 langchain
from langchain.agents import initialize_agent, Tool, AgentType
from typing import Any, List, Optional
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM
from transformers import AutoModelForCausalLM, AutoTokenizer
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.llms.utils import enforce_stop_tokens
# 工具函数
from tavily import TavilyClient
2. 定义一个langchain中的llm类,继承他的基类,方便试用其基类的函数。
DEVICE = "cuda"
class LLMQwen(LLM):
max_token: int = 4096 # 输出的最大token数量 Long-context Support up to 128K tokens and can generate up to 8K tokens.
temperature: float = 0.8
top_p: float = 0.9 # 累计概率
tokenizer: object = None
model: object = None
history: List[str] = []
def __init__(self):
super().__init__()
@property
def _llm_type(self) -> str:
return "LLMQwen"
def load_model(self, model_path=None):
# 初始化
self.model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype="auto",
device_map="auto"
)
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
# 自定义的函数,用于调用LLM生成结果
response, _ = llm_chat(self.model,
self.tokenizer,
prompt,
history=self.history,
temperature=self.temperature)
if stop is not None:
response = enforce_stop_tokens(response, stop)
self.history = self.history + [[None, response]]
return response
3. 定义一个工具函数,用于生成文本。
def llm_chat(model, tokenizer, prompt, history=[], temperature=0.7):
history = [] # 在该场景中 history 需要置空
if history == []:
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
else:
messages = history
messages.append({"role": "user", "content": prompt})
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(DEVICE)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512,
temperature=temperature
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
#
messages.append({
"role": "assistant", "content": response
})
history = messages
return response, history
4. 定义2个需要的工具函数。
# 创建一个使用 Tavily API 的搜索函数
def tavily_search(query: str) -> str:
try:
results = tavily_client.search(query)
# 返回第一个结果的摘要,如果有的话
if results and len(results) > 0:
return results
else:
return "没有找到结果。"
except Exception as e:
return f"执行搜索时出错: {str(e)}"
# 定义一个简单的计算工具函数
def calculate_square(number_str: str) -> str:
"""
计算一个整数的平方。
"""
try:
number = int(number_str)
return f"{number} 的平方等于 {number ** 2} 。"
except ValueError:
return f"错误:'{number_str}' 是一个无效的数字。"
5. 将工具函数打包。
# 将 Tavily 搜索工具和计算工具包装成 LangChain 的 Tool
tools = [
Tool(
name="搜索",
func=tavily_search,
description="当您需要通过搜索网络来回答问题时很有用。"
),
Tool(
name="平方计算器",
func=calculate_square,
description="计算给定数字的平方,输入应该是表示整数的字符串。"
)
]
6. 初始化Qwen2.5,初始化ReACT
# 初始化 Qwen 模型
qwen_llm = LLMQwen()
MODEL_PATH = "Qwen/Qwen2.5-7B-Instruct"
qwen_llm.load_model(MODEL_PATH)
# 初始化 ReAct
agent = initialize_agent(
tools,
qwen_llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
7. 运行结果
# 使用代理处理请求
response = agent.invoke("15的平方是多少?另外,法国的首都是哪里?")
# 输出结果
print(response)
8. response 如下。
> Entering new AgentExecutor chain...
我需要先计算15的平方,然后搜索法国的首都。
Action: 平方计算器
Action Input: "15"
Observation: 15 的平方等于 225 。
Thought:我需要进行第二次行动以获取法国首都的信息。
Action: 搜索
Action Input: "法国的首都"
Observation: {'query': '法国的首都', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'title': '法国的首都是什么? - 百度知道', 'url': 'https://zhidao.baidu.com/question/1308972163540040099.html', 'content': '法国的首都是巴黎。 巴黎(Paris),是法兰西共和国的首都和最大城市,也是法国的政治、经济、文化和商业中心,世界五个国际大都市之一(其余四个分别为纽约、伦敦、东京、香港),并被GaWC评为Alpha+级世界一线城市。', 'score': 0.9168945, 'raw_content': None}, {'title': '巴黎(法兰西共和国首都)_百度百科', 'url': 'https://baike.baidu.com/item/巴黎/858', 'content': '巴黎(Paris),是法兰西共和国的首都和最大城市,也是法国的政治、经济、文化和商业中心,世界五个国际大都市之一(其余四个分别为纽约、伦敦、东京、香港),并被GaWC评为Alpha+级世界一线城市。巴黎位于法国北部巴黎盆地的中央,横跨塞纳河两岸,城市中心坐标为北纬48°52′、东经2°25′。', 'score': 0.8591094, 'raw_content': None}, {'title': '巴黎 - 维基百科,自由的百科全书', 'url': 'https://zh.wikipedia.org/wiki/巴黎', 'content': '巴黎是法國的首都,也是中央政府的所在地。法國總統的官邸愛麗舍宮位於巴黎第八區,法國總理的官邸馬提尼翁府則位於巴黎第七區。其他政府機構則散佈在市區各處,其中許多機關都位在巴黎第七區,靠近馬提尼翁府。', 'score': 0.85008353, 'raw_content': None}, {'title': '法国(法兰西共和国)_百度百科', 'url': 'https://baike.baidu.com/item/法国/1173384', 'content': '法兰西共和国(法语:La République française),简称法国,首都巴黎,位于欧洲西部,与比利时、卢森堡、德国、瑞士、意大利、摩纳哥、西班牙、安道尔接壤,西北隔英吉利海峡与英国相望,海洋性、大陆性、地中海型和山地气候并存。地势东南高西北低。总面积550000平方千米(不含海外领地', 'score': 0.82795376, 'raw_content': None}, {'title': '巴黎作为法国的首都和最大城市,地理环境和气候有什么特点?', 'url': 'https://www.qulishi.com/article/202102/486805.html', 'content': '巴黎作为法国的首都和最大城市,地理环境和气候有什么特点?-趣历史网 风云人物 历史解密 战史风云 野史秘闻 文史百科 国学文化 老照片 更多_>_ 诗词名句 成语故事 神话故事 传统文化 古文名著 再现历史 推荐 帝王 将相 后宫 文人 野秘 探索 影视 神话 世界之最 更多 首页 /世界史 /首页 /兰波 _/_正文 巴黎作为法国的首都和最大城市,地理环境和气候有什么特点? 2021-02-24 10:14:01 兰波 拉·封丹 诺查丹玛斯 玛戈王后 德日进 巴黎(Paris),是法兰西共和国的首都和最大城市,也是法国的政治、经济、文化和商业中心,世界五个国际大都市之一(其余四个分别为纽约、伦敦、东京、香港),并被GaWC评为Alpha+级世界一线城市。下面趣历史小编就为大家带来详细的介绍,一起来看看吧! 巴黎位于法国北部巴黎盆地的中央,横跨塞纳河两岸,城市中心坐标为北纬48°52′、东经2°25′。广义的巴黎有小巴黎和大巴黎之分。小巴黎指大环城公路以内的巴黎城市内,面积105.4平方公里,人口224万;大巴黎包括城区周围的上塞纳省、瓦勒德马恩省、塞纳-圣但尼省、伊夫林省、瓦勒德瓦兹省、塞纳-马恩省和埃松省七个省,共同组成巴黎大区,这片地区在古代就已经被称作“法兰西岛”(ile-de-france),都会区人口约为1100万,占据全国人口的六分之一。 巴黎建都已有1400多年的历史,它不仅是法国,也是西欧的政治、经济和文化中心。 2017年8月1日,国际奥委会宣布,巴黎成为2024年奥运会主办城市。2018年1月20日,法国总理爱德华·菲利普正式向法国负责世博会申办工作的部际代表帕斯卡尔·拉米提出,出于财政预算方面的考虑,巴黎将退出申办2025年世博会。 人口民族 人口 2016年的数据显示,大巴黎都会区的人口约为1100万,巴黎市区的人口约为225万。 民族 根据2016年法国国家统计与经济研究所的研究显示,居住在巴黎的居民中有20%是外来移民,20岁以下的居民中有41.3%至少有一位双亲是外来移民。在18岁以下的居民中,12.1%是马格里布人、9.9%来自撒哈拉以南非洲、4.0%则有南欧的血统。35%的法兰西岛居民,大约有400万人不是外来移民(17%)就是双亲中至少有一位是外来移民(18%)。 地理环境 位置境域 巴黎地处法国北部,塞纳河两岸,距河口(英吉利海峡)375千米,城市中心坐标为北纬48°52′,东经2°25′。塞纳河蜿蜒穿过城市,形成两座河心岛(Île de la Cité和圣路易)。大巴黎都会区,即法兰西岛,包括分布在巴黎城墙周围、由同巴黎连成一片的市区组成的上塞纳省、瓦勒德马恩省和塞纳-圣但尼省。小巴黎则是巴黎市区。小巴黎面积约为105.4平方千米,大巴黎都会区面积约为12000平方千米。 地形地貌 巴黎南靠中央高原,东至洛林高原,北邻阿登高地,西到阿莫里坎丘陵,巴黎处在巴黎盆地的中央,地势低平,平均海拔约为178米。 气候 城市本身踞巴黎盆地中央,属温和的海洋性气候,夏无酷暑,冬无严寒;1月平均气温3℃,7月平均气温18℃,年平均气温10℃。全年降雨分布均衡,夏秋季稍多,年平均降雨量619毫米。 水文 塞纳河是巴黎主要的河流,该河流全长776.6千米,包括支流在内的流域总面积为78700平方千米,其排水网络的运输量占巴黎境内河航运量的大部分。 地方特产 法国大蜗牛(Escargot):一种可食用蜗牛。该菜一般是用蒜和黄油为佐料。由于蜗牛是带壳的,所以上菜时有专门的叉子用来将肉取出。 法式杂碎(Sweet breads):该菜一般是先把牛肉用原汤用中文火微煮,然后将肉切成片,裹上面粉,然后再微煎。微煎时一般加入柠檬和腌制过的刺山果花蕾。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。 大家都在搜 _•_法国大革命时期,其颁布的纲领性文件《人权宣言》有什么内容? _•_法国国王路易十四在位期间有哪些成就?对法国又有什么影响? _•_法国为什么会修建埃菲尔铁塔?时值法国大革命一百周年 _•_法国大革命产生的原因到底是什么?启蒙时代带来了愤恨和渴望 _•_法国二月革命的过程与结果是怎样的?该如何评价法国二月革命 _•_法国大革命是怎么结束的?其彻底地摧毁了专制制度 _•_法国七月革命简介:法国人民为何要推翻复辟的波旁王朝? _•_法国杰出的小说家安德烈·纪德去世 _•_神圣罗马帝国是罗马帝国吗?法国思想家伏尔泰如何评论? _•_梅多克产区简介:法国波尔多地区最显赫最尊贵的葡萄酒产区 陈霸先传位之谜:为何选择侄子陈蒨而非儿子? 历史 2025-01-13 光武帝刘秀:历史上的卓越统治者与军事天才 帝王 2025-01-10 刘备的父爱与刘禅的成长:能力背后的复杂因素 历史 2025-01-09 刘谌:刘禅之子中的铮铮铁骨 帝王 2025-01-08 刘贺被废黜:真相远不止“做尽坏事” 帝王 2025-01-08 #### 王翦与李牧:巅峰对决的最终胜者 1.9万 阅读 #### 袁崇焕:捍卫明朝边疆的英雄,而非破坏者 5.5万 阅读 #### 曹操对高顺与张辽的不同处置:忠诚与能力的考量 7.7万 阅读 #### 关羽与张辽的深厚友情及张辽未投刘备之谜 8.9万 阅读 #### 嘉庆智搜和珅:从“墙里”挖出数亿白银 7.6万 阅读 #### 巴顿将军:为何被誉为“漂亮的汉子” 9.7万 阅读 袁崇焕:捍卫明朝边疆的英雄,而非破坏者 晚清时期的穷人到底是什么样的 和电视剧里的完全不同 晚清时期的穷人到底是什么样的 和电视剧上的完全不是一个级别', 'score': 0.82391036, 'raw_content': None}], 'response_time': 1.74}
Thought:I now know the final answer.
Final Answer: 15的平方是225,法国的首都是巴黎。
> Finished chain.
{'input': '15的平方是多少?另外,法国的首都是哪里?', 'output': '15的平方是225,法国的首都是巴黎。'}