rag系列文章目录
前言
自从ReAct论文发布以后,ReAct范式agent就受到了大家广泛的关注,它被证实可以用来提高大模型的推理能力。本文以ReAct范式为基础,没有使用任何框架,简单实现演示了ReAct的过程。
一、ReAct介绍
ReAct它是一种基于prompt的范式,下面展示了几种prompt的差别,它们分别是(a)标准(b)思考链(c)只有Act(d)ReAct。
在ReAct之前,思考链,也被广泛用于提高大模的推理能力,但是它是一个黑匣子,主要使用内部信息来产生思考,而不是基于外部信息,这限制了它的推理能力,可能导致幻觉和推理过程中的错误传播。
ReAct比只有Act要好,在复杂任务场景,只有Act不能生成正确的Action,导致任务推理失败。
二、实现代码
该代码涉及到的流程图如下,这是经典的ReAct执行过程。
以下代码主要涉及调用大模型,以及维基百科查询知识。
# -*- coding: utf-8 -*-
# from langchain.pydantic_v1 import BaseModel, Field
import os
import re
import requests
import wikipedia
# ------------------------
# 1. 配置环境变量
# ------------------------
os.environ["DASHSCOPE_API_KEY"] = "your_api_key" # 替换为实际API密钥
# ------------------------
# 2. 实现自定义LLM
# ------------------------
class DashScopeLLM:
def __init__(self, model_name="qwen-turbo"):
self.api_key = os.getenv("DASHSCOPE_API_KEY")
self.model_name = model_name
self.url = "http://localhost:8001/v1/chat/completions"
def generate(self, prompt: str, history: list = None) -> str:
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
messages = []
if history:
messages.extend(history)
messages.append({"role": "user", "content": prompt})
payload = {
"model": self.model_name,
"messages": messages,
"temperature": 0
}
try:
response = requests.post(self.url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
return response.json()['choices'][0]['message']['content']
except Exception as e:
return f"API请求失败: {str(e)}"
llm = DashScopeLLM(model_name="qwen-turbo")
if __name__ == "__main__":
prompt = """
你是一个推理高手,请根据下面的示例进行回答,其中Question代表问题,Thought代表思考,后面的数字代表第几步思考,Action代表行动,后面的数字代表第几步行动,Observation代表行动的结果,后面的数字代表第几步的结果,数字是递增的,但是一步Thought和Action的数字是一样的,如果有了Thought和Action,你需要给出下一步的Thought和Action,并将数字加1。
你只需要回答Thought和Action的内容,而且只能输出一个步骤,即只输出一条Thought和一条Action。其中Action的格式有严格限制,只能是Search[内容]或Finish[内容],中括号里面的是你需要搜索的内容或答案,搜索的内容是主题,只能包含一个词语,一定要来自于Question。
以下是示例:
Question:苹果16手机的价格是多少?
Thought 1:苹果手机是苹果公司发布的,想要知道价格的话,需要搜索一下
Action 1:Search[苹果16手机]
Observation 1:苹果16手机是2024年上市的,价格是6000元。
Thought 2:苹果16手机已经上市了,价格是6000元,所以我就知道了。
Action 2:Finish[6000元]
Question:苹果手机和华为手机的差异在哪里?
Thought 1:想要比较苹果手机和华为手机的差异,我需要先了解一下,看下他们的各自的特点,我先查询下他们的资料。
Action 1:Search[苹果手机]
Observation 1:苹果手机是乔布斯创建的,它价格较高,但是性能很好,有完整的生态,是IOS系统。
Thought 2:苹果手机性能很好,我大致了解了,但是我还需要查询下华为手机的情况。
Action 2:Search[华为手机]
Observation 2:华为手机是任正非创建的,它价格便宜,使用鸿蒙系统。
Thought 3:我已经知道了华为手机和苹果手机的差异了,华为手机使用鸿蒙系统,价格低,而苹果手机使用IOS系统,价格高。
Action 3:Finish[苹果手机,价格高性能好,IOS系统,华为手机,价格低,鸿蒙系统。]
你需要回答的问题是:
中国和美国,你喜欢哪个?
"""
i = 1
while i > 0:
llmResult = llm.generate(prompt=prompt)
print("----------------------------------------")
print(llmResult)
pattern = r'Search\[(.*?)\]'
match = re.search(pattern, llmResult)
if match:
# 提取匹配到的内容
result = match.group(1)
print(f"提取到的内容: {result}")
wikipedia.set_lang("zh") # 设置为中文
page = wikipedia.page(result)
print(page.summary)
prompt = prompt + '\n' + llmResult + '\n' + 'Observation ' + str(i) + ':' + page.summary
i = i + 1
else:
pattern = r'Finish\[(.*?)\]'
match = re.search(pattern, llmResult)
result = match.group(1)
print(result)
print("=======================")
print(prompt)
break
三、结果展示
代码中的大模型使用的是qwen2.5大模型,第一次循环,输出第一次思考过程以及Action:
Thought 1:这个问题是关于个人偏好,作为AI,我没有个人喜好,但我可以提供两个国家的一些基本信息来帮助理解它们的不同之处。
Action 1:Search[中国]
第二次循环,输出第二次思考过程以及Action:
Thought 2:我已经了解了一些关于中国的基本信息,现在需要查询一下美国的相关信息,以便更好地对比两国的不同之处。
Action 2:Search[美国]
第三次循环,输出结果,结束循环:
Thought 3:我已经了解了美国的基本情况,现在可以根据这些信息来总结中国和美国的主要差异。
Action 3:Finish[中国历史悠久,文化深厚,经济发展迅速,政治体制为社会主义;美国历史较短,文化多元,经济发达,军事强大,政治体制为联邦制共和制。]
每次输出内容,需要和之前的prompt放到一起,最终完整的prompt示例如下:
你是一个推理高手,请根据下面的示例进行回答,其中Question代表问题,Thought代表思考,后面的数字代表第几步思考,Action代表行动,后面的数字代表第几步行动,Observation代表行动的结果,后面的数字代表第几步的结果,数字是递增的,但是一步Thought和Action的数字是一样的,如果有了Thought和Action,你需要给出下一步的Thought和Action,并将数字加1。
你只需要回答Thought和Action的内容,而且只能输出一个步骤,即只输出一条Thought和一条Action。其中Action的格式有严格限制,只能是Search[内容]或Finish[内容],中括号里面的是你需要搜索的内容或答案,搜索的内容是主题,只能包含一个词语,一定要来自于Question。
以下是示例:
Question:苹果16手机的价格是多少?
Thought 1:苹果手机是苹果公司发布的,想要知道价格的话,需要搜索一下
Action 1:Search[苹果16手机]
Observation 1:苹果16手机是2024年上市的,价格是6000元。
Thought 2:苹果16手机已经上市了,价格是6000元,所以我就知道了。
Action 2:Finish[6000元]
Question:苹果手机和华为手机的差异在哪里?
Thought 1:想要比较苹果手机和华为手机的差异,我需要先了解一下,看下他们的各自的特点,我先查询下他们的资料。
Action 1:Search[苹果手机]
Observation 1:苹果手机是乔布斯创建的,它价格较高,但是性能很好,有完整的生态,是IOS系统。
Thought 2:苹果手机性能很好,我大致了解了,但是我还需要查询下华为手机的情况。
Action 2:Search[华为手机]
Observation 2:华为手机是任正非创建的,它价格便宜,使用鸿蒙系统。
Thought 3:我已经知道了华为手机和苹果手机的差异了,华为手机使用鸿蒙系统,价格低,而苹果手机使用IOS系统,价格高。
Action 3:Finish[苹果手机,价格高性能好,IOS系统,华为手机,价格低,鸿蒙系统。]
你需要回答的问题是:
中国和美国,你喜欢哪个?
Thought 1:这个问题是关于个人偏好,作为AI,我没有个人喜好,但我可以提供两个国家的一些基本信息来帮助理解它们的不同之处。
Action 1:Search[中国]
Observation 1:中国,在汉语的传统观念指位于天下正中的国家。原指包括河南省及附近的黄河中下游流域地区。透过历代王朝与周边各政权的交流与征战,中国的疆域版图几经扩张与缩减,目前扩及黑龙江流域、塞北、西域、青藏高原及南海诸岛等地。现今,国际上广泛承认代表“中国”的政权是中华人民共和国。
华夏是人类的文明摇篮之一。 新石器时期,中原地区开始出现聚落组织;公元前27世纪左右出现方国,方国制度以共主为首;前20世纪开始,古代中国进入世袭的封建阶段;公元前2世纪,秦灭六国,完成中国第一次大一统。此后两千年来,中国的政治制度以半传统的夏代为基础的世袭君主制运作,此后经多次扩大,破裂,重组,朝代更迭,经过数次统一与分裂交替进行。直到1911年辛亥革命后建立中华民国,中国的政体从君主制转为共和制。1945年第二次国共内战爆发后,中国共产党逐渐控制中国的大部分领土,之后于1949年10月1日建立中华人民共和国,中国国民党执政的中华民国政府则在该年底撤退至台湾,形成两岸分治的政治格局至今,双方在冷战时期均声称自身为中国正统政权。在联合国系统内,中华民国曾长期拥有“中国”代表权,直到1971年联合国大会2758号决议通过被中华人民共和国取代。
中国经济在相当长的历史时期中在世界上占有重要地位,其周期通常与王朝的兴衰更替对应。中国经济史可分为几个阶段:第一阶段为远古至西晋末年,其中以三国孙吴时转变较大;第二阶段为东晋至北宋末年,其中以唐安史之乱划分为前后;第三阶段为南宋建立至鸦片战争。自明清以来,由于保守的对外政策,实行海禁,以及受重农抑商思想和对于工业的轻视,中国工业化程度发展较慢。而西方国家在19世纪工业革命后的工业成品,无论在数量和品质上,相较于当时中国纯手工业经济出产的商品,占有压倒性优势,而同时期的西方由于工业革命的影响,工业化水准大幅提升,以工业为基础的经济也快速发展,致使中国经济落后于西方。1978年改革开放施行后,中国经济发展迅速,对世界经济的影响也日渐显著。
中国文化历经上千年的历史演变,是各区域、各民族古代文化长期相互交流、借鉴、融合的结果。在长期的历史发展中,中国形成了多元一体的中华文化格局。作为其主体的汉文化对日本、朝鲜和东南亚有深远影响,形成汉字文化圈。中国传统艺术形式有国乐、相声、戏曲、书法、国画、文学、陶瓷艺术、雕刻等,传统娱乐活动有象棋、围棋、麻将、中国武术等。茶、酒、菜和筷子等为中国的特色饮食文化,春节(阴历新年)、元宵、清明、端午、七夕、中秋、重阳、冬至等为中国传统节日。中国传统上是一个儒学国家,以夏历为历法,以五伦为道德准则。春秋时期孔子“有教无类,因材施教”开始办私塾培养人才,汉朝时采用察举推选政府官员,隋朝起实行科举在平民中选拔人才。此外,中国历朝历代都设有史官,因此保存有十分详尽的历史资料,如《二十四史》、《资治通鉴》等。古代中国在科学领域上也有丰厚的成就。
Thought 2:我已经了解了一些关于中国的基本信息,现在需要查询一下美国的相关信息,以便更好地对比两国的不同之处。
Action 2:Search[美国]
Observation 2:美利坚合众国(英语:United States of America,缩写USA),简称合众国(United States,缩写US)或美国(America),是位于北美洲的联邦制共和国,是当今世上唯一的超级大国。美国由50个州、首都华盛顿哥伦比亚特区和326个印第安人保留地组成;在联邦外,其主张对5个离岸自治领土及若干外岛拥有主权。美国领土面积为9,372,610平方公里,为北美第二(次于加拿大),世界第三或第四。截至2020年初,美国总人口约为3.3亿人,是世界第三人口大国、也是人口最多的发达国家、美洲人口最多的国家。美国有着来自世界各地的大量移民,是世界上民族和文化最多元的国家之一。美国国土的地形与气候复杂,生物多样性齐全。
12,000多年前,古印第安人通过白令陆桥迁徙,定居在现在的美国领土上。欧洲人从16世纪开始殖民北美,1607年起开始成为英国的殖民地。1775年美国独立战争爆发,1776年7月4日《独立宣言》发表,1783年英国战败并承认其独立。1787年《美利坚合众国宪法》完稿,标志联邦政府和联邦制正式确立。自19世纪起。美国不断西进和对外扩张,至1848年时疆域已横跨北美大陆。1861年,由于奴隶制的分歧,美国南部七个蓄奴州宣布退出联邦而独立,南北战争爆发。1868年,北方胜利,奴隶制被废除。随后,在第二次工业革命和第一次世界大战的推动下,美国经济实力不断增长。1929年,美国迎来经济大萧条。1941年12月日本偷袭珍珠港后,美国加入第二次世界大战同盟国。战胜后,美国与苏联因意识形态及争夺世界霸权而进入冷战。1969年,太空竞赛促使美国执行阿波罗计画,人类首次登陆月球。1991年苏联解体后,冷战结束,美国成为当今世界上唯一的超级大国。
美国自19世纪末就已成为世界第一大经济体,国内生产总值(GDP)排名世界第一,是世界上最大的进口国及仅次于中国的第二大商品出口国,贡献了全球财富的四分之一和全球军事开支的三分之一。其长期以来都是全球的经济、军事、教育、科研、航天及医疗技术的强国,服务业占主导地位,生产制造业规模大,科技处于世界领先地位。纽约是美国人口最多的城市,也是具有巨大影响力的国际金融中心,GaWC将其评为Alpha++级全球城市。美国是联合国、北大西洋公约组织、美洲国家组织、国际货币基金组织、世界银行、世界贸易组织的创始成员国,也是联合国安理会常任理事国,在政治和文化上对世界影响深远。
Thought 3:我已经了解了美国的基本情况,现在可以根据这些信息来总结中国和美国的主要差异。
Action 3:Finish[中国历史悠久,文化深厚,经济发展迅速,政治体制为社会主义;美国历史较短,文化多元,经济发达,军事强大,政治体制为联邦制共和制。]
总结
实现llm agent是一个有挑战性的工作,因为agent可能不一定能正确做出决策,它具有不稳定,甚至可能导致死循环,一直在进行思考推理行动。好的agent,需要优秀的prompt,同时也需要优秀的大模型能正确的实现prompt功能,两者相互配合,再加上agent设计上的一些规则,才能实现较好的agent。