返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

基于CrewAI的大模型Multi-Agent实践及分析

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 16:11 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);word-break: break-all;">本文使用CrewAI框架实现的大模型Multi-Agent进行旅行规划,并尝试思考Multi Agent的模式是否在实际场景中能落地。

Part 1 概念介绍


定义
属性
Agents

Agent作为自主单元用于:

  • 完成任务

  • 制定决策

  • 与其他Agent通信

可以类别为一家公司里面有着特定技能的工程师,比如产品、测试、开发,为最终公司的目标努力。


  • 角色定义

  • 目标

  • 上下文背景

Tasks提供了执行所需的细节如描述、对应agent、所需工具等
  • 任务描述

  • 负责的Agent

  • 预期输出

Tools‍agent完成任务所需技能,来自crewai toolKit和langchain tools如SerperDevTool搜索
Process‍团队协作的方式
  • 顺序执行

  • 层次执行:一个经理agent调度,其他agent并行或顺序完成

Crew代表一个团队,通过多agent按workflow使用多个工具完成特定任务
  • Tasks

  • Agents

  • Process

以接下来CrewAI提供的旅行规划demo为例:

Ref:https://docs.crewai.com/core-concepts/Processes/

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 4em auto 2em;padding-right: 0.2em;padding-left: 0.2em;background: rgb(0, 152, 116);color: rgb(255, 255, 255);">Part 2 落地实践

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">1 安装所需环境

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">pipinstallcrewaicrewai_toolslangchain_community

本篇文章测试版本为:
crewai==0.30.8
crewai-tools==0.2.6
langchain==0.1.20
langchain-community==0.0.38

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">2、创建crewAI Tools

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">以搜索工具为例

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">search_tool.py

importjson
importrequests
fromlangchain.toolsimporttool
importos

#你在https://serper.dev/网站上获取到的
#免费key,就可以具备搜索功能了
os.environ["SERPER_API_KEY"]='此处填写'

classSearchTools():

@tool("Searchtheinternet")
defsearch_internet(query):
"""Usefultosearchtheinternet
aboutaagiventopicandreturnrelevantresults"""
top_result_to_return=4
url="https://google.serper.dev/search"
payload=json.dumps({"q":query})
headers={
'X-API-KEY's.environ['SERPER_API_KEY'],
'content-type':'application/json'
}
response=requests.request("OST",url,headers=headers,data=payload)
#checkifthereisanorganickey
if'organic'notinresponse.json():
return"Sorry,Icouldn'tfindanythingaboutthat,therecouldbeanerrorwithyouserperapikey."
else:
results=response.json()['organic']
string=[]
forresultinresults[:top_result_to_return]:
try:
string.append('\n'.join([
f"Title:{result['title']}",f"Link:{result['link']}",
f"Snippet:{result['snippet']}","\n-----------------"
]))
exceptKeyError:
next

return'\n'.join(string)

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">3、创建Agents

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">agents.py

fromcrewaiimportAgent

fromsearch_toolsimportSearchTools
fromazure.identityimportClientSecretCredential
fromlangchain.chat_modelsimportAzureChatOpenAI
fromlangchain.schemaimportHumanMessage

#这里使用azureopenai
sp_credential=ClientSecretCredential(
client_id=“填写你的”,
client_secret=填写你的”,
tenant_id=填写你的”
)
token=sp_credential.get_token("https://cognitiveservices.azure.com/.default")
azurellm=AzureChatOpenAI(
model_name='gpt-3.5-turbo-16k',deployment_name='gpt-35-turbo-16k',
openai_api_type="azure_ad",
openai_api_version="2024-02-15-preview",
openai_api_base="填写你的”,
openai_api_key=token.token
)


classTripAgents():

defcity_selection_agent(self):
returnAgent(
role='CitySelectionExpert',
goal='Selectthebestcitybasedonweather,season,andprices',
backstory=
'An expert in analyzing travel data to pick ideal destinations。Reply In Chinese!',
tools=[
SearchTools.search_internet,
#BrowserTools.scrape_and_summarize_website,
],llm=azurellm,
verbose=True)

deflocal_expert(self):
returnAgent(
role='LocalExpertatthiscity',
goal='ProvidetheBESTinsightsabouttheselectedcity',
backstory="""Aknowledgeablelocalguidewithextensiveinformation
about the city, it's attractions and customs。Reply In Chinese!""",
tools=[
SearchTools.search_internet,
#BrowserTools.scrape_and_summarize_website,
],llm=azurellm,
verbose=True)

deftravel_concierge(self):
returnAgent(
role='AmazingTravelConcierge',
goal="""Createthemostamazingtravelitinerarieswithbudgetand
packingsuggestionsforthecity""",
backstory="""Specialistintravelplanningandlogisticswith
decades of experience。Reply In Chinese!""",
tools=[
SearchTools.search_internet,
#BrowserTools.scrape_and_summarize_website,
CalculatorTools.calculate,
],llm=azurellm,
verbose=True)

4、创建Tasks

task.py

fromcrewaiimportTask
fromtextwrapimportdedent

classTripTasks():

defidentify_task(self,agent,origin,cities,interests,range):
returnTask(description=dedent(f"""
Analyzeandselectthebestcityforthetripbased
onspecificcriteriasuchasweatherpatterns,seasonal
events,andtravelcosts.Thistaskinvolvescomparing
multiplecities,consideringfactorslikecurrentweather
conditions,upcomingculturalorseasonalevents,and
overalltravelexpenses.

{self.__tip_section()}

Travelingfrom:{origin}
CityOptions:{cities}
TripDate:{range}
TravelerInterests:{interests}
"""),
expected_output=dedent("""
Yourfinalanswermustbeadetailed
reportonthechosencity,andeverythingyoufoundout
aboutit,includingtheactualflightcosts,weather
forecast and attractions.Reply In Chinese!
"""),
agent=agent)

defgather_task(self,agent,origin,interests,range):
returnTask(description=dedent(f"""
Asalocalexpertonthiscityyoumustcompilean
in-depthguideforsomeonetravelingthereandwanting
tohaveTHEBESTtripever!
Gatherinformationaboutkeyattractions,localcustoms,
specialevents,anddailyactivityrecommendations.
Findthebestspotstogoto,thekindofplaceonlya
localwouldknow.
Thisguideshouldprovideathoroughoverviewofwhat
thecityhastooffer,includinghiddengems,cultural
hotspots,must-visitlandmarks,weatherforecasts,and
high level costs. Reply In Chinese!

{self.__tip_section()}

TripDate:{range}
Travelingfrom:{origin}
TravelerInterests:{interests}
"""),
expected_output=dedent("""
Thefinalanswermustbeacomprehensivecityguide,
richinculturalinsightsandpracticaltips,
tailoredtoenhancethetravelexperience.
"""),
agent=agent)

defplan_task(self,agent,origin,interests,range):
returnTask(description=dedent(f"""
Expandthisguideintoaafull7-daytravel
itinerarywithdetailedper-dayplans,including
weatherforecasts,placestoeat,packingsuggestions,
andabudgetbreakdown.

YouMUSTsuggestactualplacestovisit,actualhotels
tostayandactualrestaurantstogoto.

Thisitineraryshouldcoverallaspectsofthetrip,
fromarrivaltodeparture,integratingthecityguide
information with practical travel logistics. Reply In Chinese!

TripDate:{range}
Travelingfrom:{origin}
TravelerInterests:{interests}
"""),
expected_output=dedent(f"""
YourfinalanswerMUSTbeacompleteexpandedtravelplan,
formattedasmarkdown,encompassingadailyschedule,
anticipatedweatherconditions,recommendedclothingand
itemstopack,andadetailedbudget,ensuringTHEBEST
TRIPEVER,Bespecificandgiveitareasonwhyyoupicked
# up each place, what make them special! {self.__tip_section()}。Reply In Chinese!
"""),
agent=agent)


def__tip_section(self):
return"IfyoudoyourBESTWORK,I'lltipyou$100!"

5、创建Crew、运行Crew

fromcrewaiimportCrew
fromtextwrapimportdedent
fromtrip_agentsimportTripAgents
fromtrip_tasksimportTripTasks

classTripCrew:

def__init__(self,origin,cities,date_range,interests):
self.cities=cities
self.origin=origin
self.interests=interests
self.date_range=date_range

defrun(self):
agents=TripAgents()
tasks=TripTasks()

city_selector_agent=agents.city_selection_agent()
local_expert_agent=agents.local_expert()
travel_concierge_agent=agents.travel_concierge()

identify_task=tasks.identify_task(
city_selector_agent,
self.origin,
self.cities,
self.interests,
self.date_range
)
gather_task=tasks.gather_task(
local_expert_agent,
self.origin,
self.interests,
self.date_range
)
plan_task=tasks.plan_task(
travel_concierge_agent,
self.origin,
self.interests,
self.date_range
)

crew=Crew(
agents=[
city_selector_agent,local_expert_agent,travel_concierge_agent
],
tasks=[identify_task,gather_task,plan_task],
verbose=True
)

result=crew.kickoff()
returnresult

if__name__=="__main__":
print("##WelcometoTripPlannerCrew")
print('-------------------------------')
location=input(
dedent("""
Fromwherewillyoubetravelingfrom?
"""))
cities=input(
dedent("""
Whatarethecitiesoptionsyouareinterestedinvisiting?
"""))
date_range=input(
dedent("""
Whatisthedaterangeyouareinterestedintraveling?
"""))
interests=input(
dedent("""
Whataresomeofyourhighlevelinterestsandhobbies?
"""))

trip_crew=TripCrew(location,cities,date_range,interests)
result=trip_crew.run()
print("\n\n########################")
print("##HereisyouTripPlan")
print("########################\n")
print(result)

Part 3 运行结果log

因为输出太长,这里只截取出部分log,能体现基本multi-agent流程的内容。

大致流程为:

1、收集用户旅行的信息如出行目的地候选,特殊偏好

2、根据费用、天气、季节活动、旅行费用等选择城市

3、根据选择城市查询景点、活动等

4、根据天气、景点、活动、费用、餐馆等规划行程

-----人工备注1:信息收集,包含出发地、候选城市列表,出行时间、特殊偏好
Fromwherewillyoubetravelingfrom?
上海
Whatarethecitiesoptionsyouareinterestedinvisiting?
安庆合肥杭州惠州湖州
Whatisthedaterangeyouareinterestedintraveling?
nextweek
Whataresomeofyourhighlevelinterestsandhobbies?
no

-----人工备注2:Agent1开始工作,进行城市选择

Travelingfrom:上海
CityOptions:安庆合肥杭州惠州湖州
TripDate:nextweek
TravelerInterests:no
>EnteringnewCrewAgentExecutorchain...
我需要使用搜索工具来获取每个城市的天气、季节活动和旅行费用信息。然后,我可以根据这些信息来选择最佳的城市。

Action:Searchtheinternet
ActionInput:{"query":"上海到安庆航班价格"}

Title:从上海出发前往安庆的特价机票-机票预订
Link:https://www.tianxun.com/routes/csha/aqg/shanghai-to-anqing.html
Snippet:从上海到安庆的航班价格. 正在寻找从上海到安庆的最后时刻航班或超值往返航班?在这里您可以找到单程机票和往返机票的最低价格。安庆.每位乘客¥2,346。6月3日周一 ...


Thought:
我已经找到了安庆的天气预报信息。现在我需要搜索安庆的季节活动和旅行费用。

Action:Searchtheinternet
ActionInput:{"query":"安庆季节活动"}
-----------------

Thought:
我已经收集到了上海到安庆的航班价格、安庆的天气预报和一些季节活动信息。现在我需要搜索其他城市的相关信息,以便选择最佳的城市。


Action:Searchtheinternet
ActionInput:{"query":"上海到杭州航班价格"}

Title:从上海出发前往杭州的特价机票-机票预订
Link:https://www.tianxun.com/routes/csha/hgh/shanghai-to-hangzhou.html
Snippet:春秋航空的非直飞去程航班,5月16日周四从上海浦东出发,到达杭州。吉祥航空的非直飞回程航班,5月18日周六从杭州出发,到达上海浦东。价格包括税款和费用。¥1,763起,选择。

Thought:
我已经找到了上海到杭州的航班价格信息。现在我需要搜索杭州的天气预报和季节活动。

Action:Searchtheinternet
ActionInput:{"query":"杭州天气预报"}

Title:预报-杭州-中国天气网
Link:http://www.weather.com.cn/weather/101210101.shtml
Snippet:13日(今天).晴.15℃.3-4级·14日(明天).晴.28℃/14℃.4-5级转3-4级·15日(后天).晴.28℃/13℃.4-5级转3-4级·16日(周四).晴转多云.28℃/13℃.3-4级转<3级...

Thought:
我已经找到了杭州的天气预报信息。现在我需要搜索杭州的季节活动和旅行费用。

Action:Searchtheinternet
ActionInput:{"query":"杭州季节活动"}

Title:杭州最佳旅行时间
Link:https://www.hangyouquan.com/guide/besttraveltime.html
Snippet: 3-4月、9-10月是杭州的最佳旅行时间。但品味杭州,无所谓季节,也无所谓天气。因为西湖如同一位魔术师,无论春夏秋冬、阴晴雨雪,都能幻化出绝美的姿容。

Thought:
我已经收集了杭州的天气预报和季节活动信息。现在我需要搜索杭州的旅行费用。

。。。

FinalAnswer:
根据收集到的信息,以下是每个城市的相关信息:

安庆:
-上海到安庆的航班价格为每位乘客¥2,346。
-安庆的天气预报显示,下周的天气晴朗,气温在26℃到27℃之间。
-安庆的季节活动包括“四季有戏”黄梅戏展演和安庆市的各个公园和景点如巨石山、菱湖公园等。

合肥:
-上海到合肥的航班价格为每位乘客¥1,367。
-合肥的天气预报显示,下周的天气晴朗,气温在28℃到29℃之间。
-合肥的季节活动包括“村晚”示范展示点活动和合肥市的各个公园和景点如逍遥津公园、天鹅湖等。

杭州:
-上海到杭州的航班价格为每位乘客¥1,763。
-杭州的天气预报显示,下周的天气晴朗,气温在28℃到29℃之间。
-杭州的季节活动包括湖州的各个公园和景点如小莲庄、湖州飞英公园等。

湖州:
-上海到湖州的航班价格为每位乘客¥300-500。
-湖州的天气预报显示,下周的天气晴朗,气温在28℃到29℃之间。
-湖州的季节活动包括湖州的各个公园和景点如小莲庄、湖州飞英公园等。

根据这些信息,我推荐选择杭州作为最佳的城市。杭州的航班价格较为合适,天气晴朗,而且有丰富的季节活动和景点供游客参观。

-----人工备注3:Agent2开始工作,进行本地景点、当地风俗、特色活动深入查询介绍

>EnteringnewCrewAgentExecutorchain...
我需要通过搜索互联网和向同事提问来获取关于杭州的深入了解,以便为旅行者提供最佳的旅行体验。我将首先搜索杭州的主要景点和当地的特色活动。接下来,我将向同事询问一些问题,以获得更多关于杭州的信息。

Action:Searchtheinternet
ActionInput:{"query":"杭州主要景点"}

Title:杭州市10大景点玩乐-Tripadvisor
Link:https://cn.tripadvisor.com/Attractions-g298559-Activities-Hangzhou_Zhejiang.html
Snippet:1.西湖·7,546.景观步行区.入场门票低至US$65·2.灵隐寺·1,467.历史景点·3.飞来峰·495.历史景点·4.平湖秋月·420.游客中心·5.孤山·451.历史遗迹徒步...


Thought:通过搜索互联网,我找到了一些杭州的主要景点。现在我需要向同事询问一些问题,以获取更多关于杭州的信息。

Action:Askquestiontoco-worker
Action Input:{"question":"杭州有哪些当地的特色活动?", "context":"根据收集到的信息,以下是每个城市的相关信息:\n\n安庆:\n-上海到安庆的航班价格为每位乘客¥2,346。\n-安庆的天气预报显示,下周的天气晴朗,气温在26℃到27℃之间。\n-安庆的季节活动包括“四季有戏”黄梅戏展演和安庆市的各个公园和景点如巨石山、菱湖公园等。\n\n合肥:\n-上海到合肥的航班价格为每位乘客¥1,367。\n-合肥的天气预报显示,下周的天气晴朗,气温在28℃到29℃之间。\n-合肥的季节活动包括“村晚”示范展示点活动和合肥市的各个公园和景点如逍遥津公园、天鹅湖等。\n\n杭州:\n-上海到杭州的航班价格为每位乘客¥1,763。\n-杭州的天气预报显示,下周的天气晴朗,气温在28℃到29℃之间。\n-杭州的季节活动包括湖州的各个公园和景点如小莲庄、湖州飞英公园等。\n\n湖州:\n-上海到湖州的航班价格为每位乘客¥300-500。\n-湖州的天气预报显示,下周的天气晴朗,气温在28℃到29℃之间。\n-湖州的季节活动包括湖州的各个公园和景点如小莲庄、湖州飞英公园等。\n\n根据这些信息,我推荐选择杭州作为最佳的城市。杭州的航班价格较为合适,天气晴朗,而且有丰富的季节活动和景点供游客参观。"}

-----人工备注3. 1:遇到程序错误汇自我反思纠正,确保不卡壳
Iencounteredanerrorwhiletryingtousethetool.Thiswastheerror:'NoneType'objecthasnoattribute'startswith'.
ToolAskquestiontoco-workeracceptstheseinputs:Askquestiontoco-worker(question:str,context:str,coworker:Optional[str]=None,**kwargs)-Askaspecificquestiontooneofthefollowingco-workers:[CitySelectionExpert,AmazingTravelConcierge]
Theinputtothistoolshouldbetheco-worker,thequestionyouhaveforthem,andALLnecessarycontexttoaskthequestionproperly,theyknownothingaboutthequestion,soshareabsoluteeverythingyouknow,don'treferencethingsbutinsteadexplainthem.


-----人工备注4:Agent3开始工作,进行行程的规划,需要考虑天气等

>EnteringnewCrewAgentExecutorchain...
根据旅行者的兴趣,我需要为他们提供一个7天的杭州旅行计划。在这个计划中,我需要提供每天的行程安排、天气预报、推荐的服装和物品携带、详细的预算。我将使用以下工具来完成这个任务:搜索互联网、进行计算、委派任务给同事、向同事提问。

Action:Searchtheinternet
ActionInput:{"query":"杭州当地的餐厅推荐"}

Title:杭州市10大餐厅-Tripadvisor
Link:https://cn.tripadvisor.com/Restaurants-g298559-Hangzhou_Zhejiang.html
Snippet:杭州市餐厅;1.澜亭中餐厅.(153).中餐,亚洲料理¥¥¥¥;2.静岸标帜自助餐厅&酒吧(杭州绿城尊蓝钱江豪华精选酒店).(157).牛排馆,烧烤¥¥-¥¥¥;3.四季酒店金沙厅.
。。。

-----人工备注5:所有agent完成任务,汇总结果
#杭州7天旅行计划

##行程安排
###第一天:到达杭州
-上午:抵达杭州,入住酒店,休息
-下午:漫步西湖,欣赏美丽的自然景色
-晚上:逛西湖商圈,品尝当地美食
###第二天:探索名胜古迹
-上午:参观灵隐寺,感受宁静的氛围,了解佛教文化
-下午:爬上飞来峰,俯瞰整个城市的美景
-晚上:参观平湖秋月,欣赏秋天的美景
###第三天:体验当地风俗
-上午:参加拜年活动,体验中国农历新年的传统习俗
-下午:参加元宵节活动,品尝元宵、赏花灯、猜灯谜
-晚上:参加中秋节活动,品尝月饼、赏月、放天灯
###第四天:探索自然风光
-上午:徒步游览孤山,欣赏壮丽的自然风景
-下午:参观湿地公园,欣赏丰富的生态系统和各种鸟类
-晚上:享受自由时光,休息放松
###第五天:品味茶文化
-上午:参观龙井茶园,品尝杭州龙井茶,了解茶文化的历史和传统
-下午:参观杭州的博物馆,了解当地的历史和文化
-晚上:享受自由时光,休息放松
###第六天:漫游西湖
-上午:乘船游览西湖,欣赏美丽的湖景和周围的山水
-下午:逛西湖商圈,购物品尝当地美食
-晚上:参加西湖漫游活动,感受西湖的独特魅力
###第七天:离开杭州
-上午:自由活动,购买纪念品
-下午:离开杭州,结束愉快的旅行
##天气预报
根据中国天气网的预报,下周杭州的天气如下:
-周一:阴,29℃/20℃,东南风3-4级转<3级
-周二:雨转阴
-周三:晴转多云
-周四:晴
-周五:晴转小雨
##服装和物品携带
根据知乎专栏和其他网站的推荐,建议携带以下物品:
-个人常用药
-笔记本电脑
-换洗衣服
-卫生用品
-化妆品
-面膜
-洗漱用品
-吸汗的、透气的棉质衣物
-轻薄的外套
-保温的衣服
-棉鞋
##预算
根据收集到的信息,杭州的航班价格为每位乘客¥1,763。其他花费如酒店、餐饮和门票价格因个人需求而异,预计每天的花费在300-500元左右。
希望这个旅行计划能够帮助旅行者在杭州度过一段难忘的时光!

效果:能不能完成任务,从这个任务来看,虽然按顺序流程有模有样的执行,也成功搜索到了杭州的旅行特色景点等,但最终的结果有挺大问题,上海去杭州还得买这么贵机票,不知道怎么来的;还有元宵节等活动也是比较离谱。可能是因为是直接复用crewai的demo代码和工具本身获取的信息有误,换成国外的case可能会好一些。

虽然结果上来说挺差的,但不妨碍帮助我们理解多agent的运行流程,在这个基础上我们可以在其他场景进一步优化。

性能:耗时需要分钟以上级别。所以如果不是个价值高无需实时的场景是没法用的

成本:所需token会比单agent更多,因为不同agent通信也会增加token量,加上调用工具及反思的迭代过程所需token依赖比较高。

Part 4 思考

让专业的人做专业的事,这是多智能体的哲学,在人类社会和agent社会是一样的道理,找到比较符合的场景,使用多智能体的方式去做,可能会达到不错的效果。在GPT5来临之前,使用更小的模型经过精心的编排可能可以提前感受到智能体的智慧。其中的一个关键,还是我们足够理解业务,理解自身的需求,到底杀鸡要不要用牛刀?取决于我们对鸡的了解和重视程度。使用最少的开发成本多去设计、尝试,在实践中获得反馈,或许是我们可以做的事情。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ