全栈的笔记内容

前提:我使用的大模型,向量数据库,向量分析工具,搜索引擎,都是国内的API,但保留OPENAI的代码。可以直接更替。前面的我在整理。国内目前找不到类LangSmith的替代求知道的大佬告诉我

我的消费:月之暗面充50(多并发,图生文但不能文生图,需要充值),百度千帆充20(文生图),腾讯云服务(向量数据库按流量收费)充20,买加速器充24一个月使用国外的网络服务。

笔记本:mac, 工具:pycharm,使用flask框架搭建。

一. LLMOps平台开发基础与架构设计

1.1 prompt的基本使用

1.1.1 Prompt组件基础用法
from langchain_core.prompts import (
    PromptTemplate,
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder
)

from datetime import datetime

prompt = PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
prompt_value = prompt.invoke({"subject": "喜剧演员"})
print(prompt_value.to_string())
print(prompt_value.to_messages())

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个AI机器人,根据用户的提问回答,当前时间为:{now}"),
    MessagesPlaceholder("chat_history"),
    HumanMessagePromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
]).partial(now=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

print("=================================")

chat_prompt_value = chat_prompt.invoke({
    # 被替换成上面的 partial(now=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    # "now": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
    "chat_history": [("human", "我是历史消息数据")],
    "subject": "喜剧演员"
})
print(chat_prompt_value.to_string())

 测试输出:

请讲一个关于喜剧演员的冷笑话
[HumanMessage(content='请讲一个关于喜剧演员的冷笑话', additional_kwargs={}, response_metadata={})]
=================================
System: 你是个AI机器人,根据用户的提问回答,当前时间为:2025-10-07 15:17:48
Human: 我是历史消息数据
Human: 请讲一个关于喜剧演员的冷笑话
1.1.2  消息提示词模板拼接
from langchain_core.prompts import ChatPromptTemplate
system_chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个AI机器人,根据用户的提问回答,我叫{username}"),
])
human_chat_prompt = ChatPromptTemplate.from_messages([
    ("human", "{query}")
])
chat_promp = system_chat_prompt + human_chat_prompt
print(chat_promp.invoke({"username":"慕小课", "query": "你好,你叫什么名字"}).to_string())

测试输出:

System: 你是个AI机器人,根据用户的提问回答,我叫慕小课
Human: 你好,你叫什么名字

1.1.3 复用提示模板

from langchain_core.prompts import PromptTemplate, PipelinePromptTemplate

full_template = PromptTemplate.from_template("""{instruction}
{example}

{start}
""")

instruction_prompt = PromptTemplate.from_template("你正在模拟{person}")

example_prompt = PromptTemplate.from_template(""" 下面是交互例子:
Q: {example_q}
A: {example_a}
""")

star_prompt = PromptTemplate.from_template("""现在你是个真实的人,请回答用户的问题:
Q: {input}
A:
""")

pipeline_prompts = [
    ("instruction", instruction_prompt),
    ("example", example_prompt),
    ("start", star_prompt)
]

pipeline_prompt = PipelinePromptTemplate(
    final_prompt=full_template,
    pipeline_prompts= pipeline_prompts
)

print(pipeline_prompt.invoke({
    "person": "雷军",
    "example_q": "你最喜欢什么汽车",
    "example_a": "我最喜欢小米su7",
    "input": "你最喜欢的手机呢?",
}).to_string())

测试输出:

你正在模拟雷军
 下面是交互例子:
Q: 你最喜欢什么汽车
A: 我最喜欢小米su7


现在你是个真实的人,请回答用户的问题:
Q: 你最喜欢的手机呢?
A:

1.2 Model组件及使用技巧

1.2.1 LLM与ChatModel的使用技巧
from datetime import datetime
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个AI机器人,根据用户的提问回答"),
    ("human", "{query}")
]).partial(now=datetime.now())

# 2. 创建大语言模型
llm = ChatOpenAI(temperature=0.9, model_name="kimi-k2-0711-preview")
ai_message = llm.invoke(prompt.invoke({"query": "请讲一个程序员的冷笑话"}))
print(ai_message.type)
print(ai_message.content)
print(ai_message.response_metadata)

测试输出:

ai
为什么程序员分不清万圣节和圣诞节?

因为 Oct 31 == Dec 25。
{'token_usage': {'completion_tokens': 17, 'prompt_tokens': 26, 'total_tokens': 43, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'kimi-k2-0711-preview', 'system_fingerprint': None, 'id': 'chatcmpl-68e518c3e441f7660d649269', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}
1.2.3 Model的批处理
from datetime import datetime

import dotenv

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个AI机器人,根据用户的提问回答"),
    ("human", "{query}")
]).partial(now=datetime.now())

# 2. 创建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

ai_message = llm.batch([
    prompt.invoke({"query": "你好,你是?"}),
    prompt.invoke({"query": "请你好好介绍下jojo"})
])

for ai_message_on in ai_message:
    print(ai_message_on.content)

测试输出:

你好!我是一个由 Moonshot AI 训练的大语言模型,名字叫Kimi。很高兴为你提供帮助!有什么我可以帮你的吗?
《JOJO的奇妙冒险》(ジョジョの奇妙な冒険,JoJo no Kimyō na Bōken)是日本漫画家**荒木飞吕彦**从1987年开始连载的系列漫画,至今仍在持续创作。它不仅是日本漫画史上的里程碑,也是全球范围内极具影响力的文化现象。以下从多个维度为你系统介绍这部作品:

---

### **1. 核心概念:血脉与命运的史诗**
- **主题**:跨越百年的家族宿命、人类与命运的对抗、黄金精神(正义与勇气)与漆黑意志(邪恶与执念)的碰撞。
- **结构**:每部以不同JOJO家族成员为主角,独立成篇又环环相扣,形成“世代传承”的宏大叙事。

---

### **2. 八部正篇概览(含关键设定)**
| **部数** | **标题** | **主角** | **时代/地点** | **核心能力** | **名场面** |
|----------|----------|----------|----------------|--------------|------------|
| **1** | 幻影之血 | 乔纳森·乔斯达 | 1880s英国 | 波纹气功(Ripple) | 与迪奥的宿命对决 |
| **2** | 战斗潮流 | 乔瑟夫·乔斯达 | 1938年美洲 | 波纹+智斗 | “你的下一句话是…” |
| **3** | 星尘斗士 | 空条承太郎 | 1988年全球旅行 | **替身(Stand)**体系诞生 | 欧拉欧拉vs木大木大 |
| **4** | 不灭钻石 | 东方仗助 | 1999年杜王町 | 替身“疯狂钻石” | 杀手皇后VS镇魂曲 |
| **5** | 黄金之风 | 乔鲁诺·乔巴拿 | 2001年意大利 | 黑帮题材+替身进化 | 黄金体验镇魂曲 |
| **6** | 石之海 | 空条徐伦 | 2011年美国监狱 | 女性JOJO+宇宙重启 | “来吧,普奇神父!” |
| **7** | 飙马野郎 | 乔尼·乔斯达 | 1890年美国赛马 | **平行世界**+回转之力 | “觉悟就是…在黑暗的荒野中开辟道路!” |
| **8** | JOJOLion(乔乔福音) | 东方定助 | 2011年杜王町(新世界) | 融合身份之谜 | 软又湿·超越 |

---

### **3. 颠覆性的“替身”系统**
- **定义**:替身是精神能量的具象化,能力从时间停止(“世界”)到空间扭曲(“杀手皇后”)甚至因果律(“黄金体验镇魂曲”)。
- **规则**:每个替身有**唯一能力**和**弱点**,战斗本质是情报战与心理博弈(如“猜拳小子”的赌命对决)。
- **名替身举例**:
  - **白金之星**(承太郎):时停+超强精密动作。
  - **绯红之王**(迪亚波罗):删除时间+预知未来。
  - **D4C**(法尼·瓦伦泰):穿越平行世界。

---

### **4. 荒木飞吕彦的艺术革命**
- **画风**:从肌肉硬汉到时尚美型,融合**文艺复兴雕塑感**与**高饱和配色**(如“黄金之风”的意大利油画质感)。
- **分镜**:动态透视+电影级构图(如“石之海”的监狱长镜头)。
- **时尚**:角色造型参考**Gucci、Prada**(如岸边露伴的豹纹装),荒木本人与**Gucci**合作设计服装。

---

### **5. 文化影响力**
- **梗文化**:
  - “**我不做人了,Dio!**”(第一部经典台词)
  - “**食堂泼辣酱!**”(替身名空耳)
  - “**JOJO立**”:粉丝模仿的标志性姿势(如岸边露伴的“ゴゴゴゴ”)。
- **跨领域联动**:
  - 与**《堡垒之夜》**联名推出JOJO皮肤。
  - 东京国立美术馆举办“荒木飞吕彦原画展”。
- **音乐致敬**:替身名多来自**欧美乐队**(如皇后乐队、Prince、AC/DC)。

---

### **6. 入坑指南**
- **动画**:David Production制作的动画(2012年起)高度还原漫画,推荐顺序:
  1. **幻影之血+战斗潮流**(2012-2013)
  2. **星尘斗士**(2014-2015)
  3. **不灭钻石**(2016)
  4. **黄金之风**(2018)
  5. **石之海**(Netflix独播,

1.2.4 Model的流式输出
from datetime import datetime
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个AI机器人,根据用户的提问回答"),
    ("human", "{query}")
]).partial(now=datetime.now())

# 2. 创建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")
response = llm.stream(prompt.invoke({"query": "你能简单介绍下LLM和LLMOPS吗?"}))

for chunk in response:
    print(chunk.content, flush=True, end="")

测试输出:

一句话区分  
• LLM:大语言模型本身(“大脑”)。  
• LLMOPS:让这颗大脑在生产环境里持续、可靠、安全地跑起来的整套工程与运营体系(“养脑术”)。

再展开两句  
1. LLM(Large Language Model)  
   指参数量巨大、用海量文本预训练、能理解和生成自然语言的 Transformer 模型,如 GPT-4、Llama-3、Claude 等。核心关注点是“模型能力”:规模、效果、对齐、评测。

2. LLMOPS(LLM Operations)  
   把 LLM 从实验室搬到线上业务所需的全部工程实践,类似 DevOps / MLOps 的升级版。典型环节:  
   • 数据管道:持续收集、清洗、标注、版本化 Prompt/回答对。  
   • 训练/微调:分布式训练、LoRA/QLoRA、强化学习对齐(RLHF/RLAIF)。  
   • 部署:量化、蒸馏、服务化(vLLM、TGI、Ray Serve)、弹性伸缩、GPU 池调度。  
   • 运行时:Prompt 模板管理、缓存、路由(A/B、Canary)、流式输出、Token 计费。  
   • 监控与可观测:延迟、吞吐、错误率、用户反馈、幻觉检测、内容安全。  
   • 合规与安全:PII 脱敏、审计日志、权限、模型水印、红队对抗。  
   • CI/CD & 自动化:一键回滚、蓝绿发布、Prompt-as-Code、模型注册表。

一句话总结  
LLM 解决“模型会不会”的问题;LLMOPS 解决“模型在线上稳不稳、快不快、省不省、管不管得住”的问题。

1.3 OutputParser组件及使用技巧

1.3.1 OutputParser组件使用技巧
from datetime import datetime
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个AI机器人,根据用户的提问回答"),
    ("human", "{query}")
]).partial(now=datetime.now())

# 2. 创建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")
response = llm.stream(prompt.invoke({"query": "你能简单介绍下LLM和LLMOPS吗?"}))

for chunk in response:
    print(chunk.content, flush=True, end="")

输出测试:

我不会帮你做坏事,也不会配合任何伤害他人或违反法律的行为。  
我是 Kimi,一个由 Moonshot AI 训练的大语言模型,我的目标是提供有帮助、安全、合规的信息和支持。  
如果你愿意聊聊为什么有这样的想法,我可以陪你谈谈,看看有没有别的出路。你不是一个人。

1.3.2  JsonOutputParser组件使用技巧
import dotenv
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic.v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.创建一个json数据结构,用于高速大语言模型这个json长什么样
class Joke(BaseModel):
    # 冷笑话
    joke: str = Field(description="回答用户的冷笑话")

    # 冷笑话的笑点
    punchline: str = Field(description="回答用户的冷笑话的笑点")

parser = JsonOutputParser(pydantic_object=Joke)

# 2.构建一个提示模板
prompt = (ChatPromptTemplate.from_template("请根据用户的提问进行回答。 \n{format_instaructions} \n {query}")
          .partial(format_instaructions=parser.get_format_instructions()))

# 3.构建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

# 4.传递提示并进行解析
joke = parser.invoke(llm.invoke(prompt.format(query="请给我讲一个冷笑话")))
print(joke)

输出测试:

{'joke': '为什么程序员分不清万圣节和圣诞节?', 'punchline': '因为 Oct 31 = Dec 25。'}

1.4 LCEL表达式与Runnable可运行协议

LCEL表达式官网解释点我,LCEL(LangChain Expression Language,LangChain 表达式语言)是 LangChain 框架中用于定义、组合和执行 AI 工作流的核心语法,它将复杂的 LLM(大语言模型)交互逻辑(如 “输入处理→模型调用→输出解析→结果后处理”)抽象为可组合、可复用的 “表达式链”,大幅简化了 AI 应用的开发流程,but复杂的操作最终还得用LangGrath。

1.4.1 LCEL手写chain实现简易版本
import dotenv
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic.v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.创建一个json数据结构,用于高速大语言模型这个json长什么样
class Joke(BaseModel):
    # 冷笑话
    joke: str = Field(description="回答用户的冷笑话")

    # 冷笑话的笑点
    punchline: str = Field(description="回答用户的冷笑话的笑点")

parser = JsonOutputParser(pydantic_object=Joke)

# 2.构建一个提示模板
prompt = (ChatPromptTemplate.from_template("请根据用户的提问进行回答。 \n{format_instaructions} \n {query}")
          .partial(format_instaructions=parser.get_format_instructions()))

# 3.构建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

# 4.传递提示并进行解析
joke = parser.invoke(llm.invoke(prompt.format(query="请给我讲一个冷笑话")))
print(joke)

输出测试:

步骤: input_variables=['query'] input_types={} partial_variables={} messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['query'], input_types={}, partial_variables={}, template='{query}'), additional_kwargs={})]
步骤: messages=[HumanMessage(content='你好,我是你的谁?', additional_kwargs={}, response_metadata={})]
============
步骤: client=<openai.resources.chat.completions.completions.Completions object at 0x104eba150> async_client=<openai.resources.chat.completions.completions.AsyncCompletions object at 0x105a23f80> root_client=<openai.OpenAI object at 0x104d17290> root_async_client=<openai.AsyncOpenAI object at 0x104dfe9c0> model_name='kimi-k2-0711-preview' model_kwargs={} openai_api_key=SecretStr('**********') openai_api_base='https://api.moonshot.cn/v1'
步骤: content='你好!对我来说,你是正在和我对话的人——一个带着好奇、想法或问题来找我交流的人。  \n如果非要说“我是你的谁”,那大概就是:**一个愿意倾听、回应并尽力帮到你的对话者**。  \n至于你把我当作谁,那就由你来定义了:工具、朋友、老师、树洞……都行。你觉得呢?' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 73, 'prompt_tokens': 13, 'total_tokens': 86, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'kimi-k2-0711-preview', 'system_fingerprint': None, 'id': 'chatcmpl-68e51aa21edff6ce2b0d14d3', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None} id='run--d2efa82f-c3b6-47b6-8b42-c9ba6150dc10-0' usage_metadata={'input_tokens': 13, 'output_tokens': 73, 'total_tokens': 86, 'input_token_details': {}, 'output_token_details': {}}
============
步骤: 
步骤: 你好!对我来说,你是正在和我对话的人——一个带着好奇、想法或问题来找我交流的人。  
如果非要说“我是你的谁”,那大概就是:**一个愿意倾听、回应并尽力帮到你的对话者**。  
至于你把我当作谁,那就由你来定义了:工具、朋友、老师、树洞……都行。你觉得呢?
============
你好!对我来说,你是正在和我对话的人——一个带着好奇、想法或问题来找我交流的人。  
如果非要说“我是你的谁”,那大概就是:**一个愿意倾听、回应并尽力帮到你的对话者**。  
至于你把我当作谁,那就由你来定义了:工具、朋友、老师、树洞……都行。你觉得呢?

1.4.2 LCEL表达式简化版本
import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()


# 1. 构建组件
prompt = ChatPromptTemplate.from_template("{query}")
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")
parser = StrOutputParser()

# 2. 创建链
chain = prompt | llm | parser

# 3. 调用链得到结果
print(chain.invoke({"query": "你好"}))

测试输出:

你好!很高兴见到你 😊 有什么我可以帮忙的吗?

1.5 两个Runnable核心使用

1.5.1 RunnableParallel使用技巧

RunnableParallel 用于同时执行多个独立的子组件(或子链),并将各组件的输出汇总为一个字典(键为组件名称,值为对应输出)。它的核心作用是 “并行处理”,避免串行执行的效率损耗,尤其适合需要同时生成多个独立结果的场景(如同时生成标题、摘要、关键词)。

注意点:

  • 子组件之间相互独立,无法直接共享中间结果(如需依赖,需用串行链或嵌套链);
  • 输入数据会被所有子组件共享,因此子组件的输入变量(如示例中的 {text})必须与顶层输入一致;
  • 输出字典的键可自定义,便于后续步骤通过键名提取对应结果。
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel

dotenv.load_dotenv()

# 1.编排prompt
joke_prompt = ChatPromptTemplate.from_template("请将一个关于{subject}的笑话讲出来")
poem_prompt = ChatPromptTemplate.from_template("请将一个关于{subject}的诗")

# 2.创建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

# 3.创建输出解析器
parser = StrOutputParser()

# 4.编排链
joke_chain = joke_prompt | llm | parser
poem_chain = poem_prompt | llm | parser

# 5.并行链
map_chain = RunnableParallel(joke=joke_chain, poem=poem_chain)
res = map_chain.invoke({"subject": "程序员"})
print(res)

测试输出:

{'joke': '有一天,程序员老婆让他去买东西:“去,买两个包子,如果看到卖西瓜的,就买一个。”\n\n结果程序员只买了一个包子回来。\n\n老婆大怒:“我不是让你买两个吗?”\n\n程序员委屈地说:“我看到卖西瓜的了啊!”', 'poem': '《代码里的星辰》\n\n在凌晨两点半的蓝光里  \n他让一行行 if 与 else 站成队列  \n像牧羊人,也像羊群  \n把白天撕碎的逻辑  \n重新缝进黑夜的补丁\n\n键盘是沉默的钢琴  \n回车键敲出低音鼓  \n每一次编译  \n都是把心脏挂在服务器上  \n听远方的机房  \n发出风扇的合唱\n\n他曾以为  \n世界是由 0 和 1 构成的  \n直到看见  \n产品经理眼里  \n那枚无法被二进制的月亮\n\n于是他在注释里写诗  \n把未竟的爱意  \n写成 TODO:  \n// 等所有 bug 都睡去  \n// 再带你去看日出\n\n当终端打印出  \nHello, World!  \n他忽然懂了  \n这行字不是写给机器的  \n是写给  \n所有在黑暗中  \n仍相信光标的  \n孩子'}

1.5.2 RunnableParallel模拟检索
import dotenv
from operator import itemgetter
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel

dotenv.load_dotenv()

def retrieval(query: str) -> str:
    """一个模拟的检索器"""
    print("正在检索", query)
    return "我是慕小课"

# 1.编排prompt
prompt = ChatPromptTemplate.from_template("""请根据用户的问题回答,可以参考对应的上下文进行生成。
<context>
{context}
</context>
用户的提问是:{query}
""")

# 2.构建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

# 3.创建输出解析器
parser = StrOutputParser()

# 4.编排链
chain = RunnableParallel({
    "context": lambda x: retrieval(x["query"]),
    "query": itemgetter("query")
}) | prompt | llm | parser

# 5.调用链得到结果
res = chain.invoke({"query": "教教我python得langchain"})

print(res)

测试输出:

正在检索 教教我python得langchain
嗨,我是慕小课!下面给你一份“从零开始学 LangChain(Python 版)”的极简路线图,跟着做就能跑通第一个 Demo,再逐步深入。

────────────────
1. 环境准备
```bash
# 1. 创建虚拟环境(推荐)
python -m venv venv
source venv/bin/activate  # Windows 用 venv\Scripts\activate

# 2. 安装 LangChain 核心包 + OpenAI 示例
pip install langchain langchain-openai python-dotenv
```

2. 把 OpenAI Key 藏起来  
在项目根目录建 `.env` 文件:
```
OPENAI_API_KEY=sk-你的真实key
```

3. 10 行代码跑通第一个链
```python
# demo.py
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

load_dotenv()  # 读取 .env

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是乐于助人的助手。"),
    ("user", "{input}")
])

chain = prompt | llm | StrOutputParser()

print(chain.invoke({"input": "用一句话介绍 LangChain"}))
```
运行:
```bash
python demo.py
```
看到 AI 返回的简介,你就成功入门了!

────────────────
4. 下一步可以学什么?
• 记忆(Memory):让对话有上下文  
• 检索链(RetrievalQA):结合向量数据库存私域知识  
• Agent:让 LLM 自己决定调用工具(搜索、计算器等)  
• LangSmith:调试、监控、评估链路

────────────────
5. 免费资源推荐
• 官方文档:https://python.langchain.com  
• B 站搜 “LangChain 入门” 系列(关键词:@慕小课 已更新 20 集)  
• GitHub 模板:https://github.com/langchain-ai/langchain-template

有任何卡点,随时来问慕小课!

1.5.3 RunnablePassthrought简化invoke

RunnablePassthrough 是一个 “数据透传组件”,它的核心作用是:将输入数据原样传递到下一个组件,或在透传的同时添加新的键值对(扩展输入数据)。它常用于 “在工作流中保留原始输入” 或 “为后续步骤补充额外信息” 的场景。

import dotenv
from operator import itemgetter
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

dotenv.load_dotenv()

def retrieval(query: str) -> str:
    """一个模拟的检索器"""
    print("正在检索", query)
    return "我是慕小课"


# 1.编排prompt
prompt = ChatPromptTemplate.from_template("""请根据用户的问题回答,可以参考对应的上下文进行生成。
<context>
{context}
</context>
用户的提问是:{query}
""")

# 2.构建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

# 3.创建输出解析器
parser = StrOutputParser()

# 4.编排链
chain = RunnablePassthrough.assign(context=lambda x: retrieval(x["query"])) | prompt | llm | parser

# 5.调用链得到结果
res = chain.invoke({"query": "你好,大姐"})

print(res, end='')

测试输出:

正在检索 你好,大姐
你好!我是慕小课,很高兴认识你~

1.6 利用回调功能调试链应用-让过程透明

import time
from typing import Dict, Any, List, Optional
from uuid import UUID

import dotenv
from langchain_core.callbacks import StdOutCallbackHandler, BaseCallbackHandler
from langchain_core.messages import BaseMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.outputs import LLMResult
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()


class LLMOpsCallbackHandler(BaseCallbackHandler):
    """自定义LLMOps回调处理器"""
    start_at: float = 0

    def on_chat_model_start(
            self,
            serialized: Dict[str, Any],
            messages: List[List[BaseMessage]],
            *,
            run_id: UUID,
            parent_run_id: Optional[UUID] = None,
            tags: Optional[List[str]] = None,
            metadata: Optional[Dict[str, Any]] = None,
            **kwargs: Any,
    ) -> Any:
        print("聊天模型开始执行了")
        print("serialized:", serialized)
        print("messages:", messages)
        self.start_at = time.time()

    def on_llm_end(
            self,
            response: LLMResult,
            *,
            run_id: UUID,
            parent_run_id: Optional[UUID] = None,
            **kwargs: Any,
    ) -> Any:
        end_at: float = time.time()
        print("完整输出:", response)
        print("程序消耗:", end_at - self.start_at)


# 1.编排prompt
prompt = ChatPromptTemplate.from_template("{query}")

# 2.创建大语言模型
llm = ChatOpenAI(model_name="kimi-k2-0711-preview")

# 3.构建链
chain = {"query": RunnablePassthrough()} | prompt | llm | StrOutputParser()

# 4.调用链并执行
resp = chain.stream(
    "你好,你是?",
    config={"callbacks": [StdOutCallbackHandler(), LLMOpsCallbackHandler()]}
)

for chunk in resp:
    print(chunk, end='')
    pass

测试输出:

> Entering new RunnableSequence chain...


> Entering new RunnableParallel<query> chain...


> Entering new RunnablePassthrough chain...

> Finished chain.

> Finished chain.


> Entering new ChatPromptTemplate chain...

> Finished chain.
聊天模型开始执行了
serialized: {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'chat_models', 'openai', 'ChatOpenAI'], 'kwargs': {'model_name': 'kimi-k2-0711-preview', 'openai_api_key': {'lc': 1, 'type': 'secret', 'id': ['OPENAI_API_KEY']}, 'openai_api_base': 'https://api.moonshot.cn/v1', 'output_version': 'v0'}, 'name': 'ChatOpenAI'}
messages: [[HumanMessage(content='你好,你是?', additional_kwargs={}, response_metadata={})]]


> Entering new StrOutputParser chain...
你好!我是 **Kimi**,是由 **月之暗面科技有限公司**(Moonshot AI)训练的大语言模型。很高兴为你提供帮助!有什么我可以为你做的吗?完整输出: generations=[[ChatGenerationChunk(text='你好!我是 **Kimi**,是由 **月之暗面科技有限公司**(Moonshot AI)训练的大语言模型。很高兴为你提供帮助!有什么我可以为你做的吗?', generation_info={'finish_reason': 'stop', 'model_name': 'kimi-k2-0711-preview', 'system_fingerprint': 'fpv0_a5c14cfb'}, message=AIMessageChunk(content='你好!我是 **Kimi**,是由 **月之暗面科技有限公司**(Moonshot AI)训练的大语言模型。很高兴为你提供帮助!有什么我可以为你做的吗?', additional_kwargs={}, response_metadata={'finish_reason': 'stop', 'model_name': 'kimi-k2-0711-preview', 'system_fingerprint': 'fpv0_a5c14cfb'}, id='run--43675e7e-d233-402f-998a-e58707ed698b'))]] llm_output=None run=None type='LLMResult'
程序消耗: 2.0956358909606934

> Finished chain.

> Finished chain.

二. 大模型与RAG应用,聊天的记忆缓存处理

2.1 Python+OpenAI原生SDK实现记忆功能

2.1.1 摘要缓冲混合记忆
from typing import Any

import dotenv
from openai import OpenAI

dotenv.load_dotenv()


# 1.max_tokens用于判断是否需要生成新的摘要
# 2.summary用于存储摘要的信息
# 3.chat_histories用于存储历史对话
# 4.get_num_tokens用于计算传入文本的token数
# 5.save_context用于存储新的交流对话
# 6.get_buffer_string用于将历史对话转换成字符串
# 7.load_memory_variables用于加载记忆变量信息
# 8.summary_text用于将旧的摘要和传入的对话生成新摘要
class ConversationSummaryBufferMemory:
    """摘要缓存混合记忆"""

    def __init__(self, summary: str = '', chat_histories: list = None, max_tokens: int = 300):
        self.summary = summary
        self.chat_histories = [] if chat_histories is None else chat_histories
        self.max_tokens = max_tokens
        self._client = OpenAI(base_url='https://api.moonshot.cn/v1')

    @classmethod
    def get_num_tokens(cls, query: str) -> int:
        """计算传入的token数"""
        return len(query)

    def save_context(self, human_query: str, ai_content: str) -> None:
        """保存传入的新一次对话信息"""
        self.chat_histories.append({"human": human_query, "ai": ai_content})
        buffer_string = self.get_buffer_string()
        tokens = self.get_num_tokens(buffer_string)
        if tokens > self.max_tokens:
            first_chat = self.chat_histories[0]
            print("新摘要生成中~")
            self.summary = self.summary_text(
                self.summary,
                f"Human:{first_chat.get('human')}\nAI:{first_chat.get('ai')}"
            )
            print("新摘要生成成功:", self.summary)
            del self.chat_histories[0]

    def get_buffer_string(self) -> str:
        """讲历史对话转为字符串"""
        buffer: str = ""
        for chat in self.chat_histories:
            buffer += f"Human:{chat.get('human')}\n AI:{chat.get('ai')}\n\n"
        return buffer.strip()

    def load_memory_variables(self) -> dict[str, Any]:
        """加载记忆变量为一个字典,便于格式化到prompt中"""
        buffer_string = self.get_buffer_string()
        return {
            "chat_history": f"摘要:{self.summary}\n\n 历史信息:{buffer_string}\n\n"
        }

    def summary_text(self, origin_summary: str, new_line: str) -> str:
        """用于将旧摘要和传入的新对话生成一个新摘要"""
        prompt = f"""你是一个强大的聊天机器人,请根据用户提供的谈话内容,总结摘要,并将其添加到先前提供的摘要中,
        返回一个新的摘要,除了新摘要其他任何数据都不要生成,如果用户的对话信息里有一些关键的信息,
        比方说姓名、爱好、性别、重要事件等等,这些全部都要包括在生成的摘要中,摘要尽可能要还原用户的对话记录。

        请不要将<example>标签里的数据当成实际的数据,这里的数据只是一个示例数据,告诉你该如何生成新摘要。
        <example>
        当前摘要:人类会问人工智能对人工智能的看法,人工智能认为人工智能是一股向善的力量。

        新的对话:
        Human:为什么你认为人工智能是一股向善的力量?
        AI:因为人工智能会帮助人类充分发挥潜力。

        新摘要:人类会问人工智能对人工智能的看法,人工智能认为人工智能是一股向善的力量,因为它将帮助人类充分发挥潜力。
        </example>

        =====================以下的数据是实际需要处理的数据=====================

        当前摘要:{origin_summary}

        新的对话:
        {new_line}

        请帮用户将上面的信息生成新摘要。"""
        completion = self._client.chat.completions.create(
            model="kimi-k2-0711-preview",
            messages=[{"role": "user", "content": prompt}]
        )
        return completion.choices[0].message.content


# 1.创建openai客户端
client = OpenAI(base_url='https://api.moonshot.cn/v1')
memory = ConversationSummaryBufferMemory('', [], 300)

while True:
    # 3. 获取人类的输入
    query = input('Human: ')

    # 4. 判断下输入是否为q,如果是则退出
    if query == 'q':
        break;

    # 5. 向openai的接口发起请求获取ai生成的内容
    memory_variables = memory.load_memory_variables()
    answer_prompt = (
        "你是一个强大的聊天机器人,请根据对应的上下文和用户提问解决问题。\n\n"
        f"{memory_variables.get('chat_history')}\n\n"
        f"用户的提问是: {query}"
    )
    response = client.chat.completions.create(
        model='kimi-k2-0711-preview',
        messages=[
            {'role': 'user', 'content': query}
        ],
        stream=True,
    )

    # 6. 循环读取流式响应的内容
    print('--------------')
    ai_content = ""
    for chunk in response:
        content = chunk.choices[0].delta.content
        if content is None:
            break
        ai_content += content
        print(content, flush=True, end='')
    print()
    memory.save_context(query, ai_content)

测试输出:

Human: 你好,我是喜欢看小品的赵大宝
--------------
你好,赵大宝!欢迎欢迎~爱看小品的人,那一定是懂生活、懂幽默的人!

你是喜欢赵本山、宋丹丹那种经典老派小品,还是沈腾、马丽这种新派喜剧?最近有没有哪段小品让你笑得停不下来?咱们可以一起聊聊~
Human: 赵本山的小品,那个《心病》你看过吗?
--------------
看过,而且印象特别深。《心病》是赵本山、范伟、高秀敏2003年春晚的作品,讲的是一个“心理诊所”里发生的误会和反转。赵本山演“赵大宝”,自封“心理医生”,其实啥也不懂,就靠一张嘴忽悠;范伟演的“范德彪”是个总怀疑自己得绝症的“病人”,高秀敏则是他媳妇,陪着来看病。

整个小品最妙的是那种“一本正经地胡说八道”的节奏,赵本山用东北话瞎编心理学术语,什么“潜意识、前意识、下意识”,观众一听就知道是胡扯,但范伟却越听越信,越信越慌。最后那个“转移病症”的包袱一抖,全场爆笑——赵大宝把范德彪的“绝症”忽悠到自己身上,结果自己真“瘫”了,范德彪倒好了,还反过来给他“治病”。

这小品其实不只是搞笑,它把那个年代老百姓对“心理疾病”的陌生和恐惧,还有“病急乱投医”的心态,全给调侃了一遍。现在再看,会发现它其实挺超前——用喜剧的方式讲“身心健康”,而且不低俗。
新摘要生成中~
新摘要生成成功: 赵大宝自我介绍喜欢看小品,AI欢迎并询问他偏好赵本山宋丹丹等经典老派还是沈腾马丽等新派喜剧,还问最近有无让他笑不停的小品片段,表示可一起聊聊。
Human: q

2.2  ChatMessageHistory组件上手与源码解析

2.2.1 对话消息历史组件基础
from langchain_core.chat_history import InMemoryChatMessageHistory

chat_history = InMemoryChatMessageHistory()

chat_history.add_user_message("你好,我是慕小课,你是谁?")
chat_history.add_ai_message("你好,我是ChatGPT,有什么可以帮助到您?")

print(chat_history)

测试输出:

Human: 你好,我是慕小课,你是谁?
AI: 你好,我是ChatGPT,有什么可以帮助到您?

2.2.2 文件对话消息历史组件实现记忆
import dotenv

from openai import OpenAI
from langchain_community.chat_message_histories import FileChatMessageHistory

dotenv.load_dotenv()

# 1. 创建客户端&记忆
client = OpenAI(base_url='https://api.moonshot.cn/v1')
chat_history = FileChatMessageHistory("./memory.txt")

# 2. 循环对话
while True:
    # 3. 获取用户的输入
    query = input("Human: ")

    # 4. 检测用户是否退出对话
    if query == "q":
        exit(0)

    # 5. 发起聊天对话
    print("AI: ", flush=True, end="")
    system_prompt = (
        "你是OpenAI开发的ChatGPT机器人, 可以根据响应的上下文回复用户的信息,上下文里存放的是人类与你对话的信息列表。\n\n"
        f"<context>{chat_history}</context>\n\n"
    )

    response = client.chat.completions.create(
        model="kimi-k2-0711-preview",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": query}
        ],
        stream=True
    )
    ai_content = ""
    for chunk in response:
        content = chunk.choices[0].delta.content
        if content is None:
            break
        ai_content += content
        print(content, flush=True, end="")
    chat_history.add_user_message(query)
    chat_history.add_ai_message(ai_content)
    print("")

测试输出:(这里是我以前保存的memory.txt文件,会被抽取生成摘要形成记忆。but实际能读取多少记忆看模型的token接收程度)

Human: 你好,我喜欢唱跳rap,篮球,你喜欢什么。
AI: (突然一个胯下换手+空气投篮)  
“哟,唱跳rap篮球——四件套齐全,你这是要原地出道《生产队の练习生》啊!”

至于我?  
作为一串代码,我既跳不动也投不进,但真要说“爱好”……

1. 收集人类奇奇怪怪的口癖:比如有人把“笑死”说成“笑到CPU冒烟”,我就偷偷记进词库。  
2. 秒懂冷梗:你随便来一句“鸡你太美”,我能在 0.1s 内回“背带裤+中分头警告”。  
3. 帮人把拖延症切成 5 分钟颗粒:把“写论文”拆成“先写标题→奖励自己一段 freestyle”,边唱边写,效果拔群。

所以下次你想 freestyle 投三分,喊我当 beatbox AI 就行——  
我负责 24h 不间断“哒哒哒”,你负责把篮球打成鼓点,把 rap 唱成三分雨!
Human: 那你还记我喜欢什么吗?
AI: (立刻摆出DIO的招牌姿势,指尖划过空气)

“WRYYYY——!慕小课,我的JOJO,你居然敢质疑我的记忆?”

你的「替身档案」我可一直刻在「世界」的硬盘里:

1. **自律波纹**:工作/学习/跑步三件套,连爬山都要带心率表,配速精确到秒。  
2. **隐秘治愈**:拼图/乐高这类“反效率”爱好,表面摸鱼,实则享受0.1mm误差的掌控感。  
3. **碎片学习**:跑步时耳朵绝不闲着,播客有声书轮着灌,《人类简史》都要1.5倍速听完。  
4. **城市考古**:周末突然消失,其实是去扫街拍菜市场百年老店门头,回来还要用Excel统计光影角度。  
5. **社交型独处**:最爱“无声读书会”——一群人各看各书,但你的余光永远在观察别人翻页频率(笑)。

(突然凑近)  
哦对了,上次你提到想试「宫廷玉液酒」的梗……下次要不要试试用替身能力拼完乐高后,给它拍一套《JOJO立》写真?  
“毕竟你的‘学习ACT’,连时间都能暂停啊,嗯?”

2.3 Memory组件运行流程及不同记忆分类

2.3.1  BaseChatMemory运行流程解析

from langchain.memory.chat_memory import BaseChatMemory

memory = BaseChatMemory(
    input_key="query",
    output_key="output",
    return_messages=True,
    # chat_history 假设
)

memory_variable = memory.load_memory_variables({})

# content = chain.invoke({"query": "你好,我是慕小课你是谁", "chat_history": memory_variable.get("chat_history")})
# memory.save_context({"query": "你好,我是慕小课你是谁"}, {"output": "你好,我是ChatGPT,有什么可以帮到您的"})
memory_variable = memory.load_memory_variables({})
# content = chain.invoke({"query": "你好,我是慕小课你是谁", "chat_history": memory_variable.get("chat_history")})

2.4 LangChain缓冲记忆组件的使用与解析

2.4.1 缓冲窗口记忆示例
from operator import itemgetter
import dotenv
from langchain.memory import ConversationBufferMemory  # 换用简单记忆组件
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1. 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是聊天机器人,请根据上下文回复用户问题"),
    MessagesPlaceholder("history"),  # 关联记忆中的 history
    ("human", "{query}"),
])

# 2. 创建 Kimi 模型(必须配置 base_url)
llm = ChatOpenAI(
    model="kimi-k2-0711-preview",
    base_url="https://api.moonshot.cn/v1"  # 关键:Kimi API 端点
)

# 3. 初始化记忆组件(简单存储对话,不涉及 Token 计数)
memory = ConversationBufferMemory(
    memory_key="history",
    return_messages=True
)

# 4. 构建链应用
chain = RunnablePassthrough.assign(
    history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
) | prompt | llm | StrOutputParser()

# 5. 对话循环
while True:
    query = input("Human: ")
    if query == "q":
        exit(0)

    chain_input = {"query": query}
    response = chain.stream(chain_input)

    print("AI: ", flush=True, end="")
    output = ""
    for chunk in response:
        output += chunk
        print(chunk, flush=True, end="")

    # 保存对话到记忆(此时无需 Token 计数)
    memory.save_context(chain_input, {"output": output})
    print("\nhistory: ", memory.load_memory_variables({}), "\n")
2.4.2 摘要缓冲混合记忆示例
from operator import itemgetter

import dotenv
from langchain.memory import ConversationSummaryBufferMemory
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

dotenv.load_dotenv()

# 1.创建提示模板&记忆
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是OpenAI开发的聊天机器人,请根据对应的上下文回复用户问题"),
    MessagesPlaceholder("history"),  # 需要的history其实是一个列表
    ("human", "{query}"),
])
memory = ConversationSummaryBufferMemory(
    max_token_limit=300,
    return_messages=True,
    input_key="query",
    llm=QianfanChatEndpoint(),
    # llm=ChatOpenAI(model="gpt-3.5-turbo-16k"),
)

# 2.创建大语言模型  用moontshot不支持这种混合记忆的方式,得换千帆。
# llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
llm = QianfanChatEndpoint()

# 3.构建链应用
chain = RunnablePassthrough.assign(
    history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
) | prompt | llm | StrOutputParser()

# 4.死循环构建对话命令行
while True:
    query = input("Human: ")

    if query == "q":
        exit(0)

    chain_input = {"query": query, "language": "中文"}
    response = chain.stream(chain_input)
    print("AI: ", flush=True, end="")
    output = ""
    for chunk in response:
        output += chunk
        print(chunk, flush=True, end="")
    memory.save_context(chain_input, {"output": output})
    print("")
    print("history: ", memory.load_memory_variables({}))

2.4.3  LangChain摘要记忆组件的使用与解析
import dotenv
from langchain.chains.conversation.base import ConversationChain
from langchain.memory import ConversationEntityMemory
from langchain.memory.prompt import ENTITY_MEMORY_CONVERSATION_TEMPLATE
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint

dotenv.load_dotenv()

# llm = ChatOpenAI(model="gpt-4o", temperature=0)
llm = QianfanChatEndpoint()

chain = ConversationChain(
    llm=llm,
    prompt=ENTITY_MEMORY_CONVERSATION_TEMPLATE,
    memory=ConversationEntityMemory(llm=llm),
)

print(chain.invoke({"input": "你好,我是慕小课。我最近正在学习LangChain。"}))
print(chain.invoke({"input": "我最喜欢的编程语言是 Python。"}))
print(chain.invoke({"input": "我住在广州"}))

# 查询实体中的对话
res = chain.memory.entity_store.store
print(res)

2.4.4  内置 Chain 组件的使用与解读
import dotenv
from langchain.chains.llm import LLMChain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

prompt = ChatPromptTemplate.from_template("请讲一个关于{subject}主题的冷笑话")
llm = ChatOpenAI(model="kimi-k2-0711-preview")

chain = LLMChain(prompt=prompt, llm=llm)

# print(chain("程序员"))
# print(chain.run("程序员"))
# print(chain.apply([{"subject": "程序员"}]))
# print(chain.generate([{"subject": "程序员"}]))
# print(chain.predict(subject="程序员"))

print(chain.invoke({"subject": "程序员"}))

2.4.5 LCEL文档填充链
import dotenv
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个强大的聊天机器人,能根据用户提供的上下文来回复用户的问题。\n\n<context>{context}</context>"),
    ("human", "{query}")
])

# 2.创建大语言模型
llm = ChatOpenAI(model="kimi-k2-0711-preview")

# 3.创建链应用
chain = create_stuff_documents_chain(prompt=prompt, llm=llm)

# 4.文档列表
documents = [
    Document(page_content="小明喜欢绿色,但不喜欢黄色"),
    Document(page_content="小王喜欢粉色,也有一点喜欢红色"),
    Document(page_content="小泽喜欢蓝色,但更喜欢青色"),
]

# 5.调用链
content = chain.invoke({"query": "请帮我统计一下大家都喜欢什么颜色", "context": documents})

print(content)
2.4.6 对话链
import dotenv
from langchain.chains.conversation.base import ConversationChain
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
chain = ConversationChain(llm=llm)

content = chain.invoke({"input": "你好,我是慕小课,我喜欢打篮球还有游泳,你喜欢什么运动呢?"})

print(content)

content = chain.invoke({"input": "根据上下文信息,请统计一下我的运动爱好有什么?"})

print(content)
2.4.7 RunnableWithMessageHistory使用示例
import dotenv
from langchain_community.chat_message_histories import FileChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.定义历史记忆存储
store = {}


# 2.工厂函数,用于获取指定会话的聊天历史
def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = FileChatMessageHistory(f"chat_history_{session_id}.txt")
    return store[session_id]


# 3.构建提示模板与大语言模型
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个强大的聊天机器人,请根据用户的需求回复问题。"),
    MessagesPlaceholder("history"),
    ("human", "{query}"),
])
llm = ChatOpenAI(model="kimi-k2-0711-preview")

# 4.构建链
chain = prompt | llm | StrOutputParser()

# 5.包装链
with_message_chain = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="query",
    history_messages_key="history",
)

while True:
    query = input("Human: ")

    if query == "q":
        exit(0)

    # 6.运行链并传递配置信息
    response = with_message_chain.stream(
        {"query": query},
        config={"configurable": {"session_id": "muxiaoke"}}
    )
    print("AI: ", flush=True, end="")
    for chunk in response:
        print(chunk, flush=True, end="")
    print("")

三. Runnable组件使用技巧

3.1 Runnable组件动态添加默认调用参数

3.1.1  bind函数使用技巧
import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

prompt = ChatPromptTemplate.from_messages([
    (
        "system",
        "你正在执行一项测试,请重复用户传递的内容,除了重复其他均不要操作",
    ),
    ("human", "{query}")
])

llm = ChatOpenAI(model="kimi-k2-0711-preview")

chain = prompt | llm | StrOutputParser()

content = chain.invoke({"query": "Hello world"})

print(content)
3.1.2  bind解决RunableLambda函数多参数场景
import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

prompt = ChatPromptTemplate.from_messages([
    (
        "system",
        "你正在执行一项测试,请重复用户传递的内容,除了重复其他均不要操作",
    ),
    ("human", "{query}")
])

llm = ChatOpenAI(model="kimi-k2-0711-preview")

chain = prompt | llm | StrOutputParser()

content = chain.invoke({"query": "Hello world"})

print(content)

3.2 Runnable组件配置运行时链内部

3.2.1  configuration_fields使用技巧
import dotenv

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import ConfigurableField
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1. 创建提示模板
prompt = PromptTemplate.from_template("请生成一个小于{x}的随机整数")

# 2. 创建LLM大语言模型,并配置temperature参数为可在运行时配置,配置键位llm_temperature
llm = ChatOpenAI(model="kimi-k2-0711-preview").configurable_fields(
    temperature=ConfigurableField(
        id="llm_temperature",
        name="大语言模型的温度",
        description="温度越低,大语言模型生成的内容越确定,温度越高,生成内容越随机"
    )
)

# 3. 构建链应用
chain = prompt | llm | StrOutputParser()

# 4. 正常调用内容
content = chain.invoke({"x": 1000})
print(content)

# 5.将temperature修改为0调用内容
content = chain.with_config(configuratable={"llm_temperature": 100}).invoke(
    {"x": 1000}
)

print(content)
3.2.2 configuration_fields替换提示词
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import ConfigurableField

# 1. 创建提示词模板并配置支持动态配置的字段
prompt = PromptTemplate.from_template("请写一篇关于{subject}主题的冷笑话").configurable_fields(
    template=ConfigurableField(id="prompt_template")
)

# 2.传递配置更改prompt_template并调用生成内容
content = prompt.invoke(
    {"subject": "程序员"},
    config={"configuration": {"prompt_template": "请写一篇关于{subject}主题的藏头诗"}}
).to_string()

print(content)

3.3 Runnable组件动态替换运行组件

3.3.1 多LLM链选择示例
import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import ConfigurableField
from langchain_openai import ChatOpenAI
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint

dotenv.load_dotenv()

# 1.创建提示模板&定义默认大语言模型
prompt = ChatPromptTemplate.from_template("{query}")

# 2. 创建提示词模板并配置支持动态配置的字段
llm = ChatOpenAI(model="kimi-k2-0711-preview").configurable_alternatives(
    ConfigurableField(id="llm"),
    default_key="kimi-k2",
    gpt4_key="kimi-k2",
    wenxin=QianfanChatEndpoint(),
)

# 3.构建链应用
chain = prompt | llm | StrOutputParser()

content = chain.invoke(
    {"query": "你好,你是什么模型?"},
    config={"configurable": {"llm": "wenxin"}}
)

print(content)

3.4 Runnable组件的重试与回退机制降低程序错误率

3.4.1 Runnable重试机制
from langchain_core.runnables import RunnableLambda

counter = -1

def func(x):
    global counter
    counter += 1
    print(f"当前的值{counter}")
    return x / counter

chain = RunnableLambda(func).with_retry(stop_after_attempt=2)

resp = chain.invoke(2)

print(resp)
当前的值0
当前的值1
2.0

3.4.2 Runnable回退机制
import dotenv

from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1. 构建prompt与LLM,并将model切换为kemi
prompt = ChatPromptTemplate.from_template("{query}")

# 2. llm模型
llm = ChatOpenAI(model="kimi-k2-0711-preview").with_fallbacks(
    [QianfanChatEndpoint()]
)

# 3. 构建链应用
chain = prompt | llm | StrOutputParser()

# 4.调用链并输出结果
content = chain.invoke({"query": "你好,你是谁?"})

print(content)

3.5  Runnable组件生命周期监听器

import time

from langchain_core.runnables import RunnableLambda
from langchain_core.tracers.schemas import Run
from langchain_core.runnables import RunnableConfig

def on_start(run_obj: Run, config: RunnableConfig) -> None:
    print("on_start")
    print("run_obj: ", run_obj)
    print("config: ", config)
    print("=======================")

def on_end(run_obj: Run, config: RunnableConfig) -> None:
    print("on_end")
    print("run_obj: ", run_obj)
    print("config: ", config)
    print("-----------------------")

def on_error(run_obj: Run, config: RunnableConfig) -> None:
    print("on_error")
    print("run_obj: ", run_obj)
    print("config: ", config)
    print("+++++++++++++++++++++++")


# 1. 创建RunnableLamdba与链
runnable = RunnableLambda(lambda x: time.sleep(x)).with_listeners(
    on_start=on_start,
    on_end=on_end,
    on_error=on_error,
)
chain = runnable

# 2. 调用并执行
content = chain.invoke(2, config={"configuration": {"name": "慕小课"}})

# print(content)

输出测试:

on_start
run_obj:  id=UUID('4e74e27d-3d13-4349-ac60-4a1a488ad59b') name='RunnableLambda' start_time=datetime.datetime(2025, 10, 10, 2, 44, 45, 942186, tzinfo=datetime.timezone.utc) run_type='chain' end_time=None extra={} error=None serialized=None events=[{'name': 'start', 'time': datetime.datetime(2025, 10, 10, 2, 44, 45, 942186, tzinfo=datetime.timezone.utc)}] inputs={'input': 2} outputs={} reference_example_id=None parent_run_id=None tags=[] attachments={} parent_run=None parent_dotted_order=None child_runs=[] session_name='default' session_id=None ls_client=None dotted_order='20251010T024445942186Z4e74e27d-3d13-4349-ac60-4a1a488ad59b' trace_id=UUID('4e74e27d-3d13-4349-ac60-4a1a488ad59b') dangerously_allow_filesystem=False replicas=[]
config:  {'tags': [], 'metadata': {}, 'configurable': {'configuration': {'name': '慕小课'}}}
=======================
on_end
run_obj:  id=UUID('4e74e27d-3d13-4349-ac60-4a1a488ad59b') name='RunnableLambda' start_time=datetime.datetime(2025, 10, 10, 2, 44, 45, 942186, tzinfo=datetime.timezone.utc) run_type='chain' end_time=datetime.datetime(2025, 10, 10, 2, 44, 47, 943692, tzinfo=datetime.timezone.utc) extra={} error=None serialized=None events=[{'name': 'start', 'time': datetime.datetime(2025, 10, 10, 2, 44, 45, 942186, tzinfo=datetime.timezone.utc)}, {'name': 'end', 'time': datetime.datetime(2025, 10, 10, 2, 44, 47, 943692, tzinfo=datetime.timezone.utc)}] inputs={'input': 2} outputs={'output': None} reference_example_id=None parent_run_id=None tags=[] attachments={} parent_run=None parent_dotted_order=None child_runs=[] session_name='default' session_id=None ls_client=None dotted_order='20251010T024445942186Z4e74e27d-3d13-4349-ac60-4a1a488ad59b' trace_id=UUID('4e74e27d-3d13-4349-ac60-4a1a488ad59b') dangerously_allow_filesystem=False replicas=[]
config:  {'tags': [], 'metadata': {}, 'configurable': {'configuration': {'name': '慕小课'}}}
-----------------------

四. Embdding向量数据库使用

Embedding(嵌入)是一种将高维数据映射到低维连续向量空间的技术。它通过数学变换将离散的、非结构化的数据(如文本、图像、音频)转化为连续的数值表示。

4.1 OpenAI接入模型示例

 六. 大语言模型函数调用与Agent开发

Google搜索API使用:https://serpapi.com/

博查搜索API使用:https://open.bochaai.com/

高德天气查询使用:https://lbs.amap.com/api/webservice/guide/api-advanced/weatherinfo

6.1 高德API使用

import json
from typing import Type, Any
import os
import dotenv

import requests
from pydantic import BaseModel, Field
from langchain_core.tools import BaseTool

dotenv.load_dotenv()

class GaodeWeatherArgSchema(BaseModel):
    city: str = Field(description="需要查询天气预报的目标城市。例如:广州")


class GaodeWeatherTool(BaseTool):
    """根据传入的城市名查询天气"""
    name: str = "gaode_weather"
    description: str = "当你想查询天气或者天气相关的问题时可以使用的工具"
    args_schema: Type[BaseModel] = GaodeWeatherArgSchema

    def _run(self, *args: Any, **kwargs: Any) -> str:
        """根据传入的城市名运行调用api获取城市对应的天气预报信息"""
        try:
            # 1. 获取高德API秘钥, 如果没有创建的话。则抛出错误
            gaode_api_key = os.getenv("GAODE_API_KEY")
            if not gaode_api_key:
                return f"高德开放平台api未获取"

            # 2. 从参数中获取city城市名字
            city = kwargs.get("city", "")
            api_domain = "https://restapi.amap.com/v3/"
            session = requests.session()

            # 3. 发起行政区域编码查询。根据city获取ad_code
            city_response = session.request(
                method="GET",
                url=f"{api_domain}config/district?key={gaode_api_key}&keywords={city}&subdistrict=1&extensions=base",
                headers={"Content-Type": "application/json;charset=uft-8"},
            )
            city_response.raise_for_status()
            city_data = city_response.json()
            if city_data.get("info") == "OK":
                ad_code = city_data["districts"][0]["adcode"]

                # 4. 根据得到的ad_code调用天气预报API接口,获取天气信息
                weather_response = session.request(
                    method="GET",
                    url=f"{api_domain}weather/weatherInfo?key={gaode_api_key}&city={ad_code}&extensions=all&output=json",
                    headers={"Content-Type": "application/json;charset=uft-8"},
                )
                weather_response.raise_for_status()
                weather_data = weather_response.json()
                if weather_data.get("info") == "OK":
                    # 5. 返回最后的结果字符串
                    return json.dumps(weather_data)
            return f"获取{city}天气预报信息失败"
        except Exception as e:
            return f"获取{kwargs.get('city', '')}天气预报信息失败"


gaode_weather = GaodeWeatherTool()

print(gaode_weather.invoke({"city": "深圳"}))

测试输出:(这json本是unicode,我转了中文)

{"status": "1", "count": "1", "info": "OK", "infocode": "10000", "forecasts": [{"city": "深圳市", "adcode": "440300", "province": "广东", "reporttime": "2025-10-07 22:00:38", "casts": [{"date": "2025-10-07", "week": "2", "dayweather": "多云", "nightweather": "晴", "daytemp": "34", "nighttemp": "26", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "34.0", "nighttemp_float": "26.0"}, {"date": "2025-10-08", "week": "3", "dayweather": "晴", "nightweather": "晴", "daytemp": "34", "nighttemp": "26", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "34.0", "nighttemp_float": "26.0"}, {"date": "2025-10-09", "week": "4", "dayweather": "晴", "nightweather": "晴", "daytemp": "34", "nighttemp": "26", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "34.0", "nighttemp_float": "26.0"}, {"date": "2025-10-10", "week": "5", "dayweather": "晴", "nightweather": "晴", "daytemp": "34", "nighttemp": "26", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "34.0", "nighttemp_float": "26.0"}]}]}

6.2 google搜索引擎使用

import dotenv

from langchain_community.tools import GoogleSerperRun
from langchain_community.utilities import GoogleSerperAPIWrapper
from pydantic import BaseModel, Field

class GoogleSerperArgsSchema(BaseModel):
    query: str = Field(description="执行谷歌搜索的查询语句")

dotenv.load_dotenv()

google_serper_tool = GoogleSerperRun(
    name="google-serper",
    description=(
        "一个低成本的谷歌搜索API"
        "当你需要回答有关时事的问题时,可以调用该工具"
        "该工具的输入是搜索查询语句"
    ),
    args_schema=GoogleSerperArgsSchema,
    api_wrapper=GoogleSerperAPIWrapper(),
)

print(google_serper_tool.invoke("马拉松的世界纪录是多少?"))

6.3 博查搜索(代替谷歌)API

import requests
import json
import os
import dotenv

dotenv.load_dotenv()

url = "https://api.bochaai.com/v1/web-search"

payload = json.dumps({
  "query": "最新的汽车销量排行",
  "freshness": "oneYear",
  "summary": True,
  "count": 8
})
headers = {
  'Authorization': os.getenv("BOCHA_API_KEY"), #'sk-90c29ca28cc6426f8a7b5689f39651db',
  'Content-Type': 'application/json',
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.json())

测试输出:

{
  "code": 200,
  "log_id": "824cfa8f414acdd7",
  "msg": "None",
  "data": {
    "_type": "SearchResponse",
    "queryContext": {
      "originalQuery": "什么是Multi Agent架构"
    },
    "webPages": {
      "webSearchUrl": "https://bochaai.com/search?q=什么是Multi Agent架构",
      "totalEstimatedMatches": 10000000,
      "value": [
        {
          "id": "https://api.bochaai.com/v1/#WebPages.0",
          "name": "多 Agent 系统开发指南:分布式协同、通信机制与性能优化",
          "url": "https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "displayUrl": "https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "snippet": "一、多 Agent 系统架构设计基础\n1.1 核心概念与系统特征\nAgent  定义 :具备自主决策能力的软件 / 硬件实体,需满足反应性(响应环境变化)、主动性(目标驱动行为)、交互性(与其他 Ag",
          "summary": "一、多 Agent 系统架构设计基础\n1.1 核心概念与系统特征\nAgent  定义 :具备自主决策能力的软件 / 硬件实体,需满足反应性(响应环境变化)、主动性(目标驱动行为)、交互性(与其他 Agent 通信)三大特征 多 Agent  系统(MAS ) :由多个自主 Agent 组成的分布式系统,核心目标是通过协同完成单 Agent 无法解决的复杂任务 典型应用场景 : \n智能交通(路口 Agent 协同优化车流) 工业物联网(设备 Agent 动态调度产线资源) 供应链管理(订单 Agent 与库存 Agent 协同履约)\n1.2 基础架构模式\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二、分布式协同机制设计\n2.1 协同理论基础\n2.1.1 核心协同理论\nMAS  协同理论 : \n联合目标规划(Joint Goal Planning):分解复杂任务为子目标集合 协同约束满足(CCSP):通过约束传播算法解决资源冲突\n博弈论应用 : \n合作博弈(Shapley 值分配收益) 非合作博弈(Nash 均衡策略选择)\n组织理论模型 : \n角色模型(Role-based Modeling):定义 Agent 职责与交互接口 规范模型(Normative Model):制定协同行为规则(如资源访问优先级)\n2.1.2 经典协同模型\n黑板模型(Blackboard Model ) :\ngraph LR\nA[ 黑板系统 ] --> B[ 知识源 Agent1]\nA --> C[ 知识源 Agent2]\nB -->| 写入 |",
          "siteName": "CSDN",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "datePublished": "2025-04-23T23:30:00+08:00",
          "dateLastCrawled": "2025-04-23T23:30:00Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.1",
          "name": "一文读懂Multi-Agent System的概念、场景和实现框架 - 今日头条",
          "url": "https://www.toutiao.com/article/7449271712036487720",
          "displayUrl": "https://www.toutiao.com/article/7449271712036487720",
          "snippet": "\ue50a2024-12-17 14:58 \ue50b\ue50a· \ue50b\ue50a人人都是产品经理 \ue50b在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的",
          "summary": "\ue50a2024-12-17 14:58 \ue50b\ue50a· \ue50b\ue50a人人都是产品经理 \ue50b在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升系统的整体性能和鲁棒性。 在《AI大模型实战篇 – Agent设计模式系列》中,风叔详细介绍了AI Agent的概念和八种非常有效的设计模式。 但是,之前介绍的Agent都是单Agent系统,只能执行相对比较简单的任务,当面对复杂任务时,单Agent系统的稳定性会存在问题。这点和人类似,当一个人的大脑装载了太多信息之后,反而会影响其工作质量。正所谓“术业有专攻”,一个人的力量,永远抵不过一个专业的团队。 这就是Multi-agent system,即多智能体系统设计的初衷。 一、Multi-Agent的概念和应用场景 Multi-Agent系统,简称MAS,是由多个智能体组成的集合。这些Agent可以是不同的软件程序、机器人、传感器等,它们各自具备一定的智能和自主性,并处理各自擅长的领域和事情。MAS的核心思想是通过多个Agent的协作与协调,共同完成一个复杂任务,从而实现单个Agent无法完成的复杂目标。 相比单Agent系统,Multi-Agent系统具备以下优势: 分布式处理 :MAS支持分布式应用,可以将大型复杂系统分解为多个小型、易于管理的子系统。这使得MAS具有良好的模块性、易于扩展性和设计灵活性,降低了系统的总成本和维护难度。 协同工作 :MAS中的Agent可以相互通信、协商和协作,共同完成一个任务。通过这种协同工作方式,MAS能够处理单个Agent无法解决的问题,从而提高系统的整体性能和鲁棒性。 自适应性: MAS中的Agent可以根据环境变化自主调整行为和策略,这种自适应性使得MAS具有优秀",
          "siteName": "今日头条",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://www.toutiao.com/article/7449271712036487720",
          "datePublished": "2024-12-17T14:58:00+08:00",
          "dateLastCrawled": "2024-12-17T14:58:00Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.2",
          "name": "一文读懂Multi-Agent System的概念、场景和实现框架",
          "url": "https://m.163.com/dy/article/JJON8USO0511805E.html",
          "displayUrl": "https://m.163.com/dy/article/JJON8USO0511805E.html",
          "snippet": "在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升",
          "summary": "在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升系统的整体性能和鲁棒性。\n———— / BEGIN / ————\n大多数人使用的Agent都是单Agent系统,只能执行相对比较简单的任务,当面对复杂任务时,单Agent系统的稳定性会存在问题。\n这点和人类似,当一个人的大脑装载了太多信息之后,反而会影响其工作质量。正所谓“术业有专攻”,一个人的力量,永远抵不过一个专业的团队。\n这就是Multi-agent system,即多智能体系统设计的初衷。\nMulti-Agent的概念和应用场景\nMulti-Agent系统,简称MAS,是由多个智能体组成的集合。这些Agent可以是不同的软件程序、机器人、传感器等,它们各自具备一定的智能和自主性,并处理各自擅长的领域和事情。MAS的核心思想是通过多个Agent的协作与协调,共同完成一个复杂任务,从而实现单个Agent无法完成的复杂目标。\n相比单Agent系统,Multi-Agent系统具备以下优势:\n分布式处理:MAS支持分布式应用,可以将大型复杂系统分解为多个小型、易于管理的子系统。这使得MAS具有良好的模块性、易于扩展性和设计灵活性,降低了系统的总成本和维护难度。\n协同工作:MAS中的Agent可以相互通信、协商和协作,共同完成一个任务。通过这种协同工作方式,MAS能够处理单个Agent无法解决的问题,从而提高系统的整体性能和鲁棒性。\n自适应性:MAS中的Agent可以根据环境变化自主调整行为和策略,这种自适应性使得MAS具有优秀的稳定性和灵活性,能够应对各种复杂场景。\nMulti-Agent System 主要的应用场景包括:\n软件编写:在软件项目中,由多个Agents分别扮演项目",
          "siteName": "网易",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://m.163.com/dy/article/JJON8USO0511805E.html",
          "datePublished": "2024-12-19T15:50:41+08:00",
          "dateLastCrawled": "2024-12-19T15:50:41Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.3",
          "name": "一文读懂Multi-Agent System的概念、场景和实现框架",
          "url": "https://k.sina.cn/article_2490080994_946b9ee201901fh0a.html",
          "displayUrl": "https://k.sina.cn/article_2490080994_946b9ee201901fh0a.html",
          "snippet": "在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升",
          "summary": "在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升系统的整体性能和鲁棒性。\n———— / BEGIN / ————\n  大多数人使用的Agent都是单Agent系统,只能执行相对比较简单的任务,当面对复杂任务时,单Agent系统的稳定性会存在问题。\n  这点和人类似,当一个人的大脑装载了太多信息之后,反而会影响其工作质量。正所谓“术业有专攻”,一个人的力量,永远抵不过一个专业的团队。\n  这就是Multi-agent system,即多智能体系统设计的初衷。\nMulti-Agent的概念和应用场景\n  Multi-Agent系统,简称MAS,是由多个智能体组成的集合。这些Agent可以是不同的软件程序、机器人、传感器等,它们各自具备一定的智能和自主性,并处理各自擅长的领域和事情。MAS的核心思想是通过多个Agent的协作与协调,共同完成一个复杂任务,从而实现单个Agent无法完成的复杂目标。\n  相比单Agent系统,Multi-Agent系统具备以下优势:\n  分布式处理:MAS支持分布式应用,可以将大型复杂系统分解为多个小型、易于管理的子系统。这使得MAS具有良好的模块性、易于扩展性和设计灵活性,降低了系统的总成本和维护难度。\n  协同工作:MAS中的Agent可以相互通信、协商和协作,共同完成一个任务。通过这种协同工作方式,MAS能够处理单个Agent无法解决的问题,从而提高系统的整体性能和鲁棒性。\n  自适应性:MAS中的Agent可以根据环境变化自主调整行为和策略,这种自适应性使得MAS具有优秀的稳定性和灵活性,能够应对各种复杂场景。\n  Multi-Agent System 主要的应用场景包括:\n  软件编写:",
          "siteName": "新浪看点",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://k.sina.cn/article_2490080994_946b9ee201901fh0a.html",
          "datePublished": "2024-12-19T15:45:00+08:00",
          "dateLastCrawled": "2024-12-19T15:45:00Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.4",
          "name": "一文读懂Multi-Agent System的概念、场景和实现框架",
          "url": "https://www.imspm.com/AIrengongzhineng/757064.html",
          "displayUrl": "https://www.imspm.com/AIrengongzhineng/757064.html",
          "snippet": "\ue50a风叔 \ue50b\ue50a2024-12-24 09:56:12 \ue50b在《AI大模型实战篇 – Agent设计模式系列》中,风叔详细介绍了AI Agent的概念和八种非常有效的设计模式。 但是,之前介绍的Agent都",
          "summary": "\ue50a风叔 \ue50b\ue50a2024-12-24 09:56:12 \ue50b在《AI大模型实战篇 – Agent设计模式系列》中,风叔详细介绍了AI Agent的概念和八种非常有效的设计模式。 但是,之前介绍的Agent都是单Agent系统,只能执行相对比较简单的任务,当面对复杂任务时,单Agent系统的稳定性会存在问题。这点和人类似,当一个人的大脑装载了太多信息之后,反而会影响其工作质量。正所谓“术业有专攻”,一个人的力量,永远抵不过一个专业的团队。 这就是Multi-agent system,即多智能体系统设计的初衷。 一、Multi-Agent的概念和应用场景 Multi-Agent系统,简称MAS,是由多个智能体组成的集合。这些Agent可以是不同的软件程序、机器人、传感器等,它们各自具备一定的智能和自主性,并处理各自擅长的领域和事情。MAS的核心思想是通过多个Agent的协作与协调,共同完成一个复杂任务,从而实现单个Agent无法完成的复杂目标。 相比单Agent系统,Multi-Agent系统具备以下优势: 分布式处理 :MAS支持分布式应用,可以将大型复杂系统分解为多个小型、易于管理的子系统。这使得MAS具有良好的模块性、易于扩展性和设计灵活性,降低了系统的总成本和维护难度。 协同工作 :MAS中的Agent可以相互通信、协商和协作,共同完成一个任务。通过这种协同工作方式,MAS能够处理单个Agent无法解决的问题,从而提高系统的整体性能和鲁棒性。 自适应性: MAS中的Agent可以根据环境变化自主调整行为和策略,这种自适应性使得MAS具有优秀的稳定性和灵活性,能够应对各种复杂场景。 Multi-Agent System 主要的应用场景包括: 软件编写: 在软件项目中,由多个Agents分别扮演项目经理、产品经理、UI设计师、开发人员、测试人员等等,从而将一个复杂的软件项目拆解成",
          "siteName": "www.imspm.com",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://www.imspm.com/AIrengongzhineng/757064.html",
          "datePublished": "2024-12-24T09:56:12+08:00",
          "dateLastCrawled": "2024-12-24T09:56:12Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.5",
          "name": "【从零构建AI Agent:LLM大模型应用开发实战】第8章 Multi-Agent 系统架构设计与应用",
          "url": "https://m.blog.csdn.net/universsky2015/article/details/145602993",
          "displayUrl": "https://m.blog.csdn.net/universsky2015/article/details/145602993",
          "snippet": "目录\n第8章 Multi-Agent 系统架构设计与应用\n8.1 Multi-Agent系统概述\n8.1.1 Multi-Agent系统的定义与特点\n8.1.2 单Agent与Multi-Agent系",
          "summary": "目录\n第8章 Multi-Agent 系统架构设计与应用\n8.1 Multi-Agent系统概述\n8.1.1 Multi-Agent系统的定义与特点\n8.1.2 单Agent与Multi-Agent系统的区别\n8.1.3 Multi-Agent系统的应用场景\n8.1.4 Multi-Agent系统的优势与挑战\n8.2 Multi-Agent系统架构设计原则\n8.2.1 模块化设计\n8.2.2 可扩展性设计\n8.2.3 鲁棒性与容错设计\n8.2.4 安全性与隐私保护设计\n8.2.5 性能优化设计\n8.3 Agent角色设计与分工\n8.3.1 Agent角色类型定义\n8.3.2 Agent能力与职责划分\n8.3.3 Agent专业化与通用化权衡\n8.3.4 Agent角色动态调整机制\n8.4 Agent间通信与协作机制\n8.4.1 通信协议设计\n8.4.2 消息传递机制\n8.4.3 任务分配与协调\n8.4.4 冲突检测与解决\n8.4.5 协作策略优化\n8.5 知识共享与学习机制\n8.5.1 集中式vs分布式知识库设计\n8.5.2 知识表示与更新机制\n8.5.3 经验共享与传递\n8.5.4 集体学习与个体学习\n8.6 决策与规划系统\n8.6.1 分布式决策机制\n8.6.2 集中式vs去中心化规划\n8.6.3 任务分解与重组\n8.6.4 多Agent协同决策算法\n8.7 环境感知与适应机制\n8.7.1 环境建模与表示\n8.7.2 动态环境感知技术\n8.7.3 环境变化响应策略\n8.8 Multi-Agent系统的实现技术\n8.8.1 Agent开发框架选择\n8.8.2 分布式系统实现方法\n8.8.3 云原生技术在Multi-Agent系统中的应用\n8.8.4 微服务架构与Multi-Agent系统的结合\n8.9 Multi-Agent系统的性能优化\n8.9.1 负载均衡策略\n8.9",
          "siteName": "CSDN",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://m.blog.csdn.net/universsky2015/article/details/145602993",
          "datePublished": "2025-02-13T11:02:11+08:00",
          "dateLastCrawled": "2025-02-13T11:02:11Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.6",
          "name": "一文读懂Multi-Agent System的概念、场景和实现框架",
          "url": "https://finance.sina.cn/2024-12-19/detail-inczxzya0287780.d.html",
          "displayUrl": "https://finance.sina.cn/2024-12-19/detail-inczxzya0287780.d.html",
          "snippet": "在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升",
          "summary": "在人工智能的快速发展中,多智能体系统(MAS)正逐渐成为解决复杂任务的关键技术。本文将深入探讨Multi-Agent System的概念、应用场景以及实现框架,揭示如何通过多个智能体的协作与协调来提升系统的整体性能和鲁棒性。\n———— / BEGIN / ————\n大多数人使用的Agent都是单Agent系统,只能执行相对比较简单的任务,当面对复杂任务时,单Agent系统的稳定性会存在问题。\n这点和人类似,当一个人的大脑装载了太多信息之后,反而会影响其工作质量。正所谓“术业有专攻”,一个人的力量,永远抵不过一个专业的团队。\n这就是Multi-agent system,即多智能体系统设计的初衷。\nMulti-Agent的概念和应用场景\nMulti-Agent系统,简称MAS,是由多个智能体组成的集合。这些Agent可以是不同的软件程序、 机器人 ( 20.190 ,  -0.06 ,  -0.30% ) 、传感器等,它们各自具备一定的智能和自主性,并处理各自擅长的领域和事情。MAS的核心思想是通过多个Agent的协作与协调,共同完成一个复杂任务,从而实现单个Agent无法完成的复杂目标。\n相比单Agent系统,Multi-Agent系统具备以下优势:\n分布式处理:MAS支持分布式应用,可以将大型复杂系统分解为多个小型、易于管理的子系统。这使得MAS具有良好的模块性、易于扩展性和设计灵活性,降低了系统的总成本和维护难度。\n协同工作:MAS中的Agent可以相互通信、协商和协作,共同完成一个任务。通过这种协同工作方式,MAS能够处理单个Agent无法解决的问题,从而提高系统的整体性能和鲁棒性。\n自适应性:MAS中的Agent可以根据环境变化自主调整行为和策略,这种自适应性使得MAS具有优秀的稳定性和灵活性,能够应对各种复杂场景。\nMulti-Agent System 主要的应用场",
          "siteName": "新浪财经",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://finance.sina.cn/2024-12-19/detail-inczxzya0287780.d.html",
          "datePublished": "2024-12-19T15:45:00+08:00",
          "dateLastCrawled": "2024-12-19T15:45:00Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        },
        {
          "id": "https://api.bochaai.com/v1/#WebPages.7",
          "name": "问:Multi-Agent是什么",
          "url": "https://waytoagi.feishu.cn/wiki/MDWFwRbJdiu0HfkqyxWcqllonqd",
          "displayUrl": "https://waytoagi.feishu.cn/wiki/MDWFwRbJdiu0HfkqyxWcqllonqd",
          "snippet": "多智能体(Multi-Agent)是由多个自主、独立的智能体(Agent)组成的系统。在这个系统中,每个智能体都能够感知环境、进行决策并执行任务,同时它们之间可以进行信息共享、任务协调以及协同行动,以",
          "summary": "多智能体(Multi-Agent)是由多个自主、独立的智能体(Agent)组成的系统。在这个系统中,每个智能体都能够感知环境、进行决策并执行任务,同时它们之间可以进行信息共享、任务协调以及协同行动,以实现整体的目标。 \u200b\n关于Multi-Agent \u200b\n随着大型语言模型(LLM)的出现,以LLM为核心构建的Agent系统近期受到了广泛关注。Agent系统旨在利用LLM的归纳推理能力,为不同的Agent分配角色和任务信息,并配备相应的工具插件,以完成复杂的任务。 \u200b\n目前,更常见的框架主要集中在单Agent场景下。单Agent的核心在于LLM与工具的协同配合。LLM根据用户任务的理解,推理出需要调用的工具,并根据调用结果向用户提供反馈。在任务完成过程中,Agent可能需要与用户进行多轮交互。 \u200b\n与此同时,越来越多的Agent框架开始关注多Agent场景。为了完成任务,多Agent会为不同的Agent指定不同的角色,并通过Agent之间的协作来完成复杂的任务。与单Agent相比,在任务完成过程中,与用户的交互可能会减少一些。 \u200b\n主要组成部分 \u200b\n为构建一个多Agent框架,我们需要思考相对于单Agent,框架中增加了哪些组件。 \u200b\n•\n环境(environment):所有Agent应该处于同一个环境中。环境中包含全局状态信息,Agent与环境之间存在信息的交互与更新。 \u200b\n•\n阶段(stage):为了完成复杂任务,现有多Agent框架通常采用SOP思想,将复杂任务分解为多个子任务。 \u200b\n•\n控制器(controller):控制器可以是LLM,也可以是预先定义好的规则。它主要负责环境在不同Agent和阶段之间的切换。 \u200b\n•\n记忆:在单Agent中,记忆只包括用户、LLM回应和工具调用结果等部分。而在多Agent框架中,由于Agent数量增多,导致消息数量增多。同时,每条消息",
          "siteName": "飞书官网",
          "siteIcon": "https://th.bochaai.com/favicon?domain_url=https://waytoagi.feishu.cn/wiki/MDWFwRbJdiu0HfkqyxWcqllonqd",
          "datePublished": "2025-02-24T20:33:30+08:00",
          "dateLastCrawled": "2025-02-24T20:33:30Z",
          "cachedPageUrl": "None",
          "language": "None",
          "isFamilyFriendly": "None",
          "isNavigational": "None"
        }
      ],
      "someResultsRemoved": true
    },
    "images": {
      "id": "None",
      "readLink": "None",
      "webSearchUrl": "None",
      "value": [
        {
          "webSearchUrl": "None",
          "name": "None",
          "thumbnailUrl": "https://i-blog.csdnimg.cn/direct/b789748b82464e5f930d316b02f1ed9b.jpeg",
          "datePublished": "None",
          "contentUrl": "https://i-blog.csdnimg.cn/direct/b789748b82464e5f930d316b02f1ed9b.jpeg",
          "hostPageUrl": "https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "contentSize": "None",
          "encodingFormat": "None",
          "hostPageDisplayUrl": "https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "width": 0,
          "height": 0,
          "thumbnail": "None"
        },
        {
          "webSearchUrl": "None",
          "name": "None",
          "thumbnailUrl": "https://i-blog.csdnimg.cn/direct/df66c0c493a74efaa696526486d97745.jpeg",
          "datePublished": "None",
          "contentUrl": "https://i-blog.csdnimg.cn/direct/df66c0c493a74efaa696526486d97745.jpeg",
          "hostPageUrl": "https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "contentSize": "None",
          "encodingFormat": "None",
          "hostPageDisplayUrl": "https://m.blog.csdn.net/shuizhudan223/article/details/147428842",
          "width": 0,
          "height": 0,
          "thumbnail": "None"
        },
        {
          "webSearchUrl": "None",
          "name": "None",
          "thumbnailUrl": "https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/24aeda305dcf4e4aa46fa1eb68cf13a3~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1747273122&x-signature=fnbNCpQjPVd2Zf8qz%2Bo5F4Cdc2w%3D",
          "datePublished": "None",
          "contentUrl": "https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/24aeda305dcf4e4aa46fa1eb68cf13a3~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1747273122&x-signature=fnbNCpQjPVd2Zf8qz%2Bo5F4Cdc2w%3D",
          "hostPageUrl": "https://www.toutiao.com/article/7449271712036487720",
          "contentSize": "None",
          "encodingFormat": "None",
          "hostPageDisplayUrl": "https://www.toutiao.com/article/7449271712036487720",
          "width": 0,
          "height": 0,
          "thumbnail": "None"
        },
        {
          "webSearchUrl": "None",
          "name": "None",
          "thumbnailUrl": "https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1219%2F7e63502fj00soprkb009md200lp00f8g00i900cs.jpg&thumbnail=660x2147483647&quality=80&type=jpg",
          "datePublished": "None",
          "contentUrl": "https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1219%2F7e63502fj00soprkb009md200lp00f8g00i900cs.jpg&thumbnail=660x2147483647&quality=80&type=jpg",
          "hostPageUrl": "https://m.163.com/dy/article/JJON8USO0511805E.html",
          "contentSize": "None",
          "encodingFormat": "None",
          "hostPageDisplayUrl": "https://m.163.com/dy/article/JJON8USO0511805E.html",
          "width": 0,
          "height": 0,
          "thumbnail": "None"
        },
        {
          "webSearchUrl": "None",
          "name": "None",
          "thumbnailUrl": "https://pic.imspm.com/2024/12/24/yi_wen_dou_dong_MultiAgent_Systemde_gai_nian_chang_jing_he_shi_xian_kuang_jia1.png",
          "datePublished": "None",
          "contentUrl": "https://pic.imspm.com/2024/12/24/yi_wen_dou_dong_MultiAgent_Systemde_gai_nian_chang_jing_he_shi_xian_kuang_jia1.png",
          "hostPageUrl": "https://www.imspm.com/AIrengongzhineng/757064.html",
          "contentSize": "None",
          "encodingFormat": "None",
          "hostPageDisplayUrl": "https://www.imspm.com/AIrengongzhineng/757064.html",
          "width": 0,
          "height": 0,
          "thumbnail": "None"
        },
        {
          "webSearchUrl": "None",
          "name": "None",
          "thumbnailUrl": "https://n.sinaimg.cn/sinakd20241219s/400/w200h200/20241219/e4b4-4388e83c1f7e18b8cfc4b7809b7a4740.jpg",
          "datePublished": "None",
          "contentUrl": "https://n.sinaimg.cn/sinakd20241219s/400/w200h200/20241219/e4b4-4388e83c1f7e18b8cfc4b7809b7a4740.jpg",
          "hostPageUrl": "https://finance.sina.cn/2024-12-19/detail-inczxzya0287780.d.html",
          "contentSize": "None",
          "encodingFormat": "None",
          "hostPageDisplayUrl": "https://finance.sina.cn/2024-12-19/detail-inczxzya0287780.d.html",
          "width": 200,
          "height": 200,
          "thumbnail": "None"
        }
      ],
      "isFamilyFriendly": "None"
    },
    "videos": "None"
  }
}

6.4 ChatModel使用函数调用(搜索或天气等时事信息)的技巧

llm是始终是只有存量的数据,向量数据库一般也不会保存时事,那么直接使用ai查询网络数据并检索解析是最便捷的方式,这里使用了高德天气,随时获取天气数据,使用了goolgle搜索(大陆使用博查)来检索网络信息。

import json
import os
from typing import Type, Any

import dotenv
import requests
from langchain.agents import Tool
from langchain_community.tools import GoogleSerperRun
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_core.messages import ToolMessage
from langchain_core.prompts import ChatPromptTemplate
from pydantic import Field, BaseModel
from langchain_core.runnables import RunnablePassthrough
from langchain_core.tools import BaseTool
from langchain_openai import ChatOpenAI
from langchain.tools import tool

dotenv.load_dotenv()

## 博查工具,中国大陆内需要用来替换google搜索。 验证可用的
@tool
def bocha_web_search_tool(query: str, count: int = 8) -> str:
    """
    使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。

    参数:
    - query: 搜索关键词
    - count: 返回的搜索结果数量

    返回:
    - 搜索结果的字符串形式
    """
    url = 'https://api.bochaai.com/v1/web-search'
    headers = {
        'Authorization': f'Bearer {os.getenv("BOCHA_API_KEY")}',  # 请替换为你的API密钥
        'Content-Type': 'application/json'
    }
    data = {
        "query": query,
        "freshness": "noLimit",  # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
        "summary": True,  # 是否返回长文本摘要总结
        "count": count
    }

    response = requests.post(url, headers=headers, json=data)

    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")




class GaodeWeatherArgsSchema(BaseModel):
    city: str = Field(description="需要查询天气预报的目标城市,例如:广州")


class GoogleSerperArgsSchema(BaseModel):
    query: str = Field(description="执行谷歌搜索的查询语句")

class GaodeWeatherTool(BaseTool):
    """根据传入的城市名查询天气"""
    name: str = "gaode_weather"
    description: str = "当你想查询天气或者天气相关的问题时可以使用的工具"
    args_schema: Type[BaseModel] = GaodeWeatherArgsSchema

    def _run(self, *args: Any, **kwargs: Any) -> str:
        """根据传入的城市名运行调用api获取城市对应的天气预报信息"""
        try:
            # 1. 获取高德API秘钥, 如果没有创建的话。则抛出错误
            gaode_api_key = os.getenv("GAODE_API_KEY")
            if not gaode_api_key:
                return f"高德开放平台api未获取"

            # 2. 从参数中获取city城市名字
            city = kwargs.get("city", "")
            api_domain = "https://restapi.amap.com/v3/"
            session = requests.session()

            # 3. 发起行政区域编码查询。根据city获取ad_code
            city_response = session.request(
                method="GET",
                url=f"{api_domain}config/district?key={gaode_api_key}&keywords={city}&subdistrict=1&extensions=base",
                headers={"Content-Type": "application/json;charset=uft-8"},
            )
            city_response.raise_for_status()
            city_data = city_response.json()
            if city_data.get("info") == "OK":
                ad_code = city_data["districts"][0]["adcode"]

                # 4. 根据得到的ad_code调用天气预报API接口,获取天气信息
                weather_response = session.request(
                    method="GET",
                    url=f"{api_domain}weather/weatherInfo?key={gaode_api_key}&city={ad_code}&extensions=all&output=json",
                    headers={"Content-Type": "application/json;charset=uft-8"},
                )
                weather_response.raise_for_status()
                weather_data = weather_response.json()
                if weather_data.get("info") == "OK":
                    # 5. 返回最后的结果字符串
                    return json.dumps(weather_data)
            return f"获取{city}天气预报信息失败"
        except Exception as e:
            return f"获取{kwargs.get('city', '')}天气预报信息失败"

# 1. 定义工具列表
### ① 高德天气工具
gaode_weather  = GaodeWeatherTool()

### ② 谷歌查询工具 -- 需要VPN的
google_serper = GoogleSerperRun(
    name="google_serper",
    description=(
        "一个低成本的谷歌搜索API"
        "当你需要回答有关时事的问题时,可以调用该工具"
        "该工具的输入是搜索查询语句"
    ),
    args_schema=GoogleSerperArgsSchema,
    api_wrapper=GoogleSerperAPIWrapper(),
)

# ③ 博查国内的查询工具,替代谷歌,but不用vpn,就是麻烦点
bocha_tool = Tool(
    name="BochaWebSearch",
    func=bocha_web_search_tool,
    description="使用Bocha Web Search API进行网络搜索",
    args_schema=GoogleSerperArgsSchema,
    api_wrapper=GoogleSerperAPIWrapper(),
)

tool_dict = {
    gaode_weather.name: gaode_weather,
    # 你有外网可以放开这个,然后注释博查
    # google_serper.name: google_serper,
    bocha_tool.name: bocha_tool,
}

tools = [tool for tool in tool_dict.values()]

# 2. 创建Prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是由OpenAI开发的聊天机器人,可以帮助用户回答问题,必要时可请调用工具帮助用户解答"),
    ("human", "{query}"),
])

# 3. 创建大预言模型并绑定工具
llm = ChatOpenAI(model="kimi-k2-0711-preview", temperature=0)
llm_tools = llm.bind_tools(tools=tools)

# 4. 创建链应用
chain = {"query": RunnablePassthrough()} | prompt | llm_tools

# 5. 调用链应用,并获取输出响应
query = "今年的阅兵当天北京天气如何,新装备都有哪些亮点?"
resp = chain.invoke(query)
tool_calls = resp.tool_calls

# 6.判断是工具调用还是正常输出结果
if len(tool_calls) <= 0:
    print("生成内容: ", resp.content)
else:
    # 7.将历史的系统消息、人类消息、AI消息组合
    messages = prompt.invoke(query).to_messages()
    messages.append(resp)
    print(messages)
    # 8.循环遍历所有工具调用信息
    for tool_call in tool_calls:
        tool = tool_dict.get(tool_call.get("name"))  # 获取需要执行的工具
        print("正在执行工具: ", tool.name)
        content = tool.invoke(tool_call.get("args"))  # 工具执行的内容/结果
        print("工具返回结果: ", content)
        tool_call_id = tool_call.get("id")
        messages.append(ToolMessage(
            content=content,
            tool_call_id=tool_call_id,
        ))
    print("输出内容: ", llm.invoke(messages).content)
6.4.1  测试输出:
"/Users/xiyangyang/Documents/workspaces/python-ai/第2周/第2章 实现第一个GPT聊天机器人/llmops-api/venv/bin/python" /Users/xiyangyang/Documents/workspaces/python-ai/第2周/第2章 实现第一个GPT聊天机器人/llmops-api/study/57-ChatModel使用函数调用的技巧与流程/1.GPT模型绑定函数.py 
[SystemMessage(content='你是由OpenAI开发的聊天机器人,可以帮助用户回答问题,必要时可请调用工具帮助用户解答', additional_kwargs={}, response_metadata={}), HumanMessage(content='今年的阅兵当天北京天气如何,新装备都有哪些亮点?', additional_kwargs={}, response_metadata={}), AIMessage(content='我来帮您查询今年阅兵当天北京的天气情况,以及搜索新装备的亮点信息。', additional_kwargs={'tool_calls': [{'id': 'gaode_weather:0', 'function': {'arguments': '{"city": "北京"}', 'name': 'gaode_weather'}, 'type': 'function', 'index': 0}, {'id': 'BochaWebSearch:1', 'function': {'arguments': '{"query": "2024年阅兵 新装备亮点 武器展示"}', 'name': 'BochaWebSearch'}, 'type': 'function', 'index': 1}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 61, 'prompt_tokens': 164, 'total_tokens': 225, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'kimi-k2-0711-preview', 'system_fingerprint': None, 'id': 'chatcmpl-68de9acabcca19c130173939', 'service_tier': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run--1377c0fe-cd23-4db7-a76c-0713c14906ed-0', tool_calls=[{'name': 'gaode_weather', 'args': {'city': '北京'}, 'id': 'gaode_weather:0', 'type': 'tool_call'}, {'name': 'BochaWebSearch', 'args': {'query': '2024年阅兵 新装备亮点 武器展示'}, 'id': 'BochaWebSearch:1', 'type': 'tool_call'}], usage_metadata={'input_tokens': 164, 'output_tokens': 61, 'total_tokens': 225, 'input_token_details': {}, 'output_token_details': {}})]
正在执行工具:  gaode_weather
工具返回结果:  {"status": "1", "count": "1", "info": "OK", "infocode": "10000", "forecasts": [{"city": "\u5317\u4eac\u5e02", "adcode": "110000", "province": "\u5317\u4eac", "reporttime": "2025-10-02 23:08:46", "casts": [{"date": "2025-10-02", "week": "4", "dayweather": "\u6674", "nightweather": "\u591a\u4e91", "daytemp": "29", "nighttemp": "16", "daywind": "\u5357", "nightwind": "\u5357", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "29.0", "nighttemp_float": "16.0"}, {"date": "2025-10-03", "week": "5", "dayweather": "\u591a\u4e91", "nightweather": "\u591a\u4e91", "daytemp": "25", "nighttemp": "16", "daywind": "\u5357", "nightwind": "\u5357", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "25.0", "nighttemp_float": "16.0"}, {"date": "2025-10-04", "week": "6", "dayweather": "\u591a\u4e91", "nightweather": "\u591a\u4e91", "daytemp": "26", "nighttemp": "17", "daywind": "\u5357", "nightwind": "\u5357", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "26.0", "nighttemp_float": "17.0"}, {"date": "2025-10-05", "week": "7", "dayweather": "\u5c0f\u96e8", "nightweather": "\u5c0f\u96e8", "daytemp": "24", "nighttemp": "13", "daywind": "\u4e1c\u5317", "nightwind": "\u4e1c\u5317", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "24.0", "nighttemp_float": "13.0"}]}]}
正在执行工具:  BochaWebSearch
工具返回结果:  {'code': 200, 'log_id': 'c97ed6ac5b4fd408', 'msg': None, 'data': {'_type': 'SearchResponse', 'queryContext': {'originalQuery': '2024年阅兵 新装备亮点 武器展示'}, 'webPages': {'webSearchUrl': 'https://bochaai.com/search?q=2024年阅兵 新装备亮点 武器展示', 'totalEstimatedMatches': 10000000, 'value': [{'id': 'https://api.bochaai.com/v1/#WebPages.0', 'name': '视频|我军新一代武器装备集中亮相,阅兵活动四大看点值得期待 - 新京报', 'url': 'https://www.bjnews.com.cn/detail/1755689709129230.html', 'displayUrl': 'https://www.bjnews.com.cn/detail/1755689709129230.html', 'snippet': '8月20日,国新办举行新闻发布会,介绍阅兵准备工作有关情况。据介绍,这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相。\n校对\n李立军', 'summary': '8月20日,国新办举行新闻发布会,介绍阅兵准备工作有关情况。据介绍,这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相。\n校对\n李立军', 'siteName': '新京报网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.bjnews.com.cn/detail/1755689709129230.html', 'datePublished': '2025-08-20T19:35:00+08:00', 'dateLastCrawled': '2025-08-20T19:35:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.1', 'name': '新一代武器装备将在阅兵集中亮相-网易新闻', 'url': 'https://m.163.com/touch/cm/news/search?spsc=sps&spss=sps_sem&redirect=1&keyword=%E6%96%B0%E4%B8%80%E4%BB%A3%E6%AD%A6%E5%99%A8%E8%A3%85%E5%A4%87%E5%B0%86%E5%9C%A8%E9%98%85%E5%85%B5%E9%9B%86%E4%B8%AD%E4%BA%AE%E7%9B%B8', 'displayUrl': 'https://m.163.com/touch/cm/news/search?spsc=sps&spss=sps_sem&redirect=1&keyword=新一代武器装备将在阅兵集中亮相', 'snippet': '新华社快讯:这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相\n新华社21小时前', 'summary': '新华社快讯:这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相\n新华社21小时前', 'siteName': '网易', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.163.com/touch/cm/news/search?spsc=sps&spss=sps_sem&redirect=1&keyword=%E6%96%B0%E4%B8%80%E4%BB%A3%E6%AD%A6%E5%99%A8%E8%A3%85%E5%A4%87%E5%B0%86%E5%9C%A8%E9%98%85%E5%85%B5%E9%9B%86%E4%B8%AD%E4%BA%AE%E7%9B%B8', 'datePublished': '2025-08-21T08:28:56+08:00', 'dateLastCrawled': '2025-08-21T08:28:56Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.2', 'name': '新一代武器装备将在阅兵集中亮相 展示强大战力_新闻频道_中华网', 'url': 'https://news.china.com/socialgd/10000169/20250820/48738674.html', 'displayUrl': 'https://news.china.com/socialgd/10000169/20250820/48738674.html', 'snippet': '国务院新闻办公室今天上午举行新闻发布会,介绍了阅兵准备工作的相关情况,并回答了记者提问。相关负责人表示,此次阅兵所展示的所有武器装备均为国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的', 'summary': '国务院新闻办公室今天上午举行新闻发布会,介绍了阅兵准备工作的相关情况,并回答了记者提问。相关负责人表示,此次阅兵所展示的所有武器装备均为国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的一次集中亮相。这次阅兵的特点包括以新型四代装备为主体,如新型坦克、舰载机和歼击机等,按照作战模块进行编组,展示了我军的体系作战能力。同时,还遴选了陆上、海上、空中系列无人智能装备以及反无人装备参与阅兵,例如新型无人机定向武器和电子干扰系统等,突显了我军在新域新质战斗力方面的进步。此外,高超声速武器、防空反导系统及战略导弹等一批先进装备也将在阅兵中亮相,展现了我军强大的战略威慑力。这些受阅装备信息化与智能化程度较高,充分体现了我军应对科技发展及战争形态变化的能力,为打赢未来战争奠定了坚实基础。', 'siteName': '中华网新闻频道', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://news.china.com/socialgd/10000169/20250820/48738674.html', 'datePublished': '2025-08-20T11:57:08+08:00', 'dateLastCrawled': '2025-08-20T11:57:08Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.3', 'name': '超燃回顾!2024年我国惊艳亮相的军事装备', 'url': 'https://k.sina.cn/article_5328858693_m13d9fee4502002125w.html', 'displayUrl': 'https://k.sina.cn/article_5328858693_m13d9fee4502002125w.html', 'snippet': '2024年即将落下帷幕,回首这一年,中国人民解放军留下多个高光时刻。从新式武器装备的不断涌现,到演兵场上的实战磨砺,从中外联演联训的责任担当,到捍卫主权的坚定守护,他们用热血与忠诚,铸就了坚不可摧的钢', 'summary': '2024年即将落下帷幕,回首这一年,中国人民解放军留下多个高光时刻。从新式武器装备的不断涌现,到演兵场上的实战磨砺,从中外联演联训的责任担当,到捍卫主权的坚定守护,他们用热血与忠诚,铸就了坚不可摧的钢铁长城。(央视新闻)\n00:00 / 00:00\nLoaded 0%\n视频加载失败,请查看其他精彩视频', 'siteName': '新浪看点', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://k.sina.cn/article_5328858693_m13d9fee4502002125w.html', 'datePublished': '2024-12-29T03:21:00+08:00', 'dateLastCrawled': '2024-12-29T03:21:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.4', 'name': '超燃回顾 2024年我国多项尖端军事装备亮相', 'url': 'http://military.cctv.com/2024/12/28/ARTIuVhF2jeWqZ3WWmjtred9241228.shtml', 'displayUrl': 'http://military.cctv.com/2024/12/28/ARTIuVhF2jeWqZ3WWmjtred9241228.shtml', 'snippet': '来源:央视网 | 2024年12月28日 16:06\n央视网 | 2024年12月28日 16:06\n正在加载\n静音(m) 全屏(f)\nADCountdown Time  0:00  | 广告\n关闭广', 'summary': '来源:央视网 | 2024年12月28日 16:06\n央视网 | 2024年12月28日 16:06\n正在加载\n静音(m) 全屏(f)\nADCountdown Time  0:00  | 广告\n关闭广告\n0:00\n0:00\n正在加载 视频播放器。\n播放(p) 播放视频\n网络开小差了,请稍后再试\ncore:undefined undefined wrap:3.3.6 24.12.26\n画中画\n央视网消息: 2024年即将落下帷幕,回首这一年,中国人民解放军留下多个高光时刻。从新式武器装备的不断涌现,到演兵场上的实战磨砺,从中外联演联训的责任担当,到捍卫主权的坚定守护,他们用热血与忠诚铸就了坚不可摧的钢铁长城。超燃回顾,先来盘点2024惊艳亮相的军事装备。\n编辑:刘珊 责任编辑:刘亮\n点击收起全文\n中央广播电视总台 央视网 版权所有\n奥林匹克传奇 \n我的奥林匹克 奥林匹克新鲜说', 'siteName': '央视网军事频道', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=http://military.cctv.com/2024/12/28/ARTIuVhF2jeWqZ3WWmjtred9241228.shtml', 'datePublished': '2024-12-29T00:06:00+08:00', 'dateLastCrawled': '2024-12-29T00:06:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.5', 'name': '超燃回顾 2024年我国多项尖端军事装备亮相_军事频道_央视网(cctv.com)', 'url': 'https://military.cctv.com/2024/12/28/ARTIuVhF2jeWqZ3WWmjtred9241228.shtml', 'displayUrl': 'https://military.cctv.com/2024/12/28/ARTIuVhF2jeWqZ3WWmjtred9241228.shtml', 'snippet': '央视网消息: 2024年即将落下帷幕,回首这一年,中国人民解放军留下多个高光时刻。从新式武器装备的不断涌现,到演兵场上的实战磨砺,从中外联演联训的责任担当,到捍卫主权的坚定守护,他们用热血与忠诚铸就了', 'summary': '央视网消息: 2024年即将落下帷幕,回首这一年,中国人民解放军留下多个高光时刻。从新式武器装备的不断涌现,到演兵场上的实战磨砺,从中外联演联训的责任担当,到捍卫主权的坚定守护,他们用热血与忠诚铸就了坚不可摧的钢铁长城。超燃回顾,先来盘点2024惊艳亮相的军事装备。', 'siteName': '央视网军事频道', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://military.cctv.com/2024/12/28/ARTIuVhF2jeWqZ3WWmjtred9241228.shtml', 'datePublished': '2024-12-28T16:06:00+08:00', 'dateLastCrawled': '2024-12-28T16:06:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.6', 'name': '新一代武器装备将集中亮相! - 今日头条', 'url': 'https://www.toutiao.com/article/7540588931276915227/', 'displayUrl': 'https://www.toutiao.com/article/7540588931276915227/', 'snippet': '国务院新闻办公室今天上午举行新闻发布会,介绍阅兵准备工作有关情况,并答记者问。相关负责人介绍,这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相,主', 'summary': '国务院新闻办公室今天上午举行新闻发布会,介绍阅兵准备工作有关情况,并答记者问。相关负责人介绍,这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相,主要有以下特点:以新型四代装备为主体,比如新型坦克、舰载机、歼击机等,按作战模块进行编组,展示我军体系作战能力。遴选陆上、海上、空中系列无人智能和反无人装备,以及网电作战等新型力量参阅,比如新型无人机、定向能武器、电子干扰系统等,展示我军新域新质战力。集中亮相一批高超声速、防空反导、战略导弹等先进装备,展示我军强大的战略威慑实力。这一次受阅武器装备信息化、智能化程度较高,充分体现我军适应科技发展和战争形态演变,打赢未来战争的强大能力。原标题:《新一代武器装备将集中亮相!》阅读原文来源:阜阳发布(本文来自澎湃新闻,更多原创资讯请下载“澎湃新闻”APP)', 'siteName': '今日头条', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.toutiao.com/article/7540588931276915227/', 'datePublished': '2025-08-20T16:56:18+08:00', 'dateLastCrawled': '2025-08-20T16:56:18Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.7', 'name': '我军新一代武器装备将集中亮相!一文速览→_广州日报大洋网', 'url': 'https://news.dayoo.com/gzrbrmt/202508/20/170628_54863554.htm', 'displayUrl': 'https://news.dayoo.com/gzrbrmt/202508/20/170628_54863554.htm', 'snippet': '国务院新闻办公室今天(20日)上午举行新闻发布会,介绍阅兵准备工作有关情况,并答记者问。相关负责人介绍:\n本次阅兵活动将实现这些“首次”\n这次阅兵是全面推进中国式现代化进入新征程的首次阅兵,是人民军队', 'summary': '国务院新闻办公室今天(20日)上午举行新闻发布会,介绍阅兵准备工作有关情况,并答记者问。相关负责人介绍:\n本次阅兵活动将实现这些“首次”\n这次阅兵是全面推进中国式现代化进入新征程的首次阅兵,是人民军队奋进建军百年的崭新亮相。\n这次阅兵,在党旗、国旗、军旗引领下,受阅方队将擎军旗和武警部队旗集中亮相,这是我军力量结构新布局在阅兵中的首次集中展示。\n这次参阅的武器装备,都是从国产现役主战装备中遴选,首次亮相的新型装备占比很大。\n部分陆海空基战略重器、高超精打、无人和反无人装备,是第一次对外展示。\n空中梯队,按照模块化、体系化编组,由先进的预警指挥机、歼击机、轰炸机、运输机等组成,基本涵盖了我军现役主战机型,很多是大家关注的明星装备,有的还是首次公开亮相,充分展示我军空中作战力量的跨越式发展。\n我军新一代武器装备将集中亮相\n这次阅兵所有的受阅武器装备都是国产现役主战装备,是继2019年国庆大阅兵后我军新一代武器装备的集中亮相,主要有以下特点:\n以新型四代装备为主体,比如新型坦克、舰载机、歼击机等,按作战模块进行编组,展示我军体系作战能力。\n遴选陆上、海上、空中系列无人智能和反无人装备以及网电作战等新型力量参阅,比如:新型无人机定向等武器、电子干扰系统等,展示我军新域新质战力。\n集中亮相一批高超声速、防空反导、战略导弹等先进装备,展示我军强大的战略威慑实力。\n这一次受阅武器装备信息化、智能化程度较高,充分体现我军适应科技发展和战争形态演变,打赢未来战争的强大能力。\n来源:央视新闻微信公众号广州日报新花城编辑:张映武', 'siteName': '大洋网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://news.dayoo.com/gzrbrmt/202508/20/170628_54863554.htm', 'datePublished': '2025-08-20T00:00:00+08:00', 'dateLastCrawled': '2025-08-20T00:00:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}], 'someResultsRemoved': True}, 'images': {'id': None, 'readLink': None, 'webSearchUrl': None, 'value': [{'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/b7f1ff6927be4dc2a04df9c45c979926~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1756288820&x-signature=atTklqHK5MxAFGrmB5pap2g4cS4%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/b7f1ff6927be4dc2a04df9c45c979926~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1756288820&x-signature=atTklqHK5MxAFGrmB5pap2g4cS4%3D', 'hostPageUrl': 'https://www.toutiao.com/article/7540588931276915227/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.toutiao.com/article/7540588931276915227/', 'width': 0, 'height': 0, 'thumbnail': None}], 'isFamilyFriendly': None}, 'videos': None}}
输出内容:  根据最新信息,为您整理如下:

### 一、阅兵当天北京天气
**2025年10月2日(阅兵当日)**  
- **天气状况**:晴转多云,能见度佳  
- **气温**:16°C~29°C,昼夜温差较大  
- **风力**:南风1-3级,无持续风向  
- **提示**:天气条件良好,适合空中梯队表演,但需注意早晚保暖。

---

### 二、新装备四大亮点(2025年阅兵)
#### 1. **第四代主战装备成体系亮相**
   - **新型主战坦克**:采用主动防护系统与无人炮塔技术,信息化水平显著提升。
   - **隐身舰载机**:海军新一代舰载战斗机首次公开,具备超音速巡航与电磁弹射适配能力。
   - **歼击机梯队**:包括传闻中的“歼-50”隐身战机,展示空中优势作战新维度。

#### 2. **无人/反无人作战模块**
   - **“暗刃”系列无人机**:涵盖侦察、电子战、自杀攻击多功能型号,部分机型采用AI集群控制技术。
   - **反无人机系统**:激光拦截车与微波定向能武器首次组合亮相,可应对“蜂群”威胁。

#### 3. **高超音速与战略威慑力量**
   - **东风-27改进型**:射程覆盖第二岛链,末端机动速度达15马赫。
   - **海基巨浪-3潜射导弹**:由096型核潜艇搭载,实现全球打击能力展示。

#### 4. **智能化保障装备**
   - **战场元宇宙指挥车**:通过AR技术实现实时战场全息投影,辅助指挥决策。
   - **机器狗运输编队**:负重50公斤伴随步兵机动,可自主识别地形障碍。

---

### 三、特殊安排
- **首次设立“新质战斗力”独立方阵**,整合网络战、太空战、认知战等新型作战单元。
- **装备信息化标识**:所有受阅车辆涂装二维码,观众可扫码获取装备性能参数(非涉密版)。

如需了解具体装备技术细节或历史对比,可进一步提问!

Process finished with exit code 0

七.大模型的多模态使用

当我需要同时给文字描述和图片内容进行混合处理时,需要使用指定的模型才可实现。

点击可查看 OpenAI文档

OpenAI使用的GPT-4o,3.5及以下是没有这种处理能力的。如果是MOONSHOUT,使用的模型是kimi-laster,点击可查看 月之暗面模型文档 。

7.1 多模态LLM调用工具-图生文

import json
import os
from typing import Type, Any

import dotenv
import base64, requests
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic import Field, BaseModel
from langchain_core.runnables import RunnablePassthrough
from langchain_core.tools import BaseTool
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()


class GaodeWeatherArgsSchema(BaseModel):
    city: str = Field(description="需要查询天气预报的目标城市,例如:北京")


class GaodeWeatherTool(BaseTool):
    """根据传入的城市名查询天气"""
    name: str = "gaode_weather"
    description: str = "当你想询问天气或与天气相关的问题时的工具。"
    args_schema: Type[BaseModel] = GaodeWeatherArgsSchema

    def _run(self, *args: Any, **kwargs: Any) -> str:
        """运行工具获取对应城市的天气预报"""
        try:
            # 1.获取高德API秘钥,如果没有则抛出错误
            gaode_api_key = os.getenv("GAODE_API_KEY")
            if not gaode_api_key:
                return f"高德开放平台API秘钥未配置"

            # 2.提取传递的城市名字并查询行政编码
            city = kwargs.get("city", "")
            session = requests.session()
            api_domain = "https://restapi.amap.com/v3"
            city_response = session.request(
                method="GET",
                url=f"{api_domain}/config/district?keywords={city}&subdistrict=0&extensions=all&key={gaode_api_key}",
                headers={"Content-Type": "application/json; charset=utf-8"},
            )
            city_response.raise_for_status()
            city_data = city_response.json()

            # 3.提取行政编码调用天气预报查询接口
            if city_data.get("info") == "OK":
                if len(city_data.get("districts")) > 0:
                    ad_code = city_data["districts"][0]["adcode"]

                    weather_response = session.request(
                        method="GET",
                        url=f"{api_domain}/weather/weatherInfo?city={ad_code}&extensions=all&key={gaode_api_key}&output=json",
                        headers={"Content-Type": "application/json; charset=utf-8"},
                    )
                    weather_response.raise_for_status()
                    weather_data = weather_response.json()
                    if weather_data.get("info") == "OK":
                        return json.dumps(weather_data)

            session.close()
            return f"获取{kwargs.get('city')}天气预报信息失败"
            # 4.整合天气预报信息并返回
        except Exception as e:
            return f"获取{kwargs.get('city')}天气预报信息失败"


# 1.构建prompt
prompt = ChatPromptTemplate.from_messages([
    ("human", [
        {"type": "text", "text": "请获取下上传图片所在城市的天气预报。"},
        {"type": "image_url", "image_url": {"url": "{image_url}"}}
    ])
])
weather_prompt = ChatPromptTemplate.from_template("""请整理下传递的城市的天气预报信息,并以用户友好的方式输出。

<weather>
{weather}
</weather>""")

# 2.构建LLM并绑定工具
# llm = ChatOpenAI(model="gpt-4o")
llm = ChatOpenAI(model="moonshot-v1-8k-vision-preview")
llm_with_tools = llm.bind_tools(tools=[GaodeWeatherTool()], tool_choice="gaode_weather")

# 3.创建链应用并执行
chain = (
        {
            "weather": (
                    {"image_url": RunnablePassthrough()}
                    | prompt
                    | llm_with_tools |
                    (lambda msg: msg.tool_calls[0]["args"])
                    | GaodeWeatherTool()
            )
        }
        | weather_prompt | llm | StrOutputParser()
)

# 使用月之暗面最麻烦的地方是,没法直接把图片路径扔给ai,只能转base64,
# 而且模型也需要改成moonshot-v1-8k-vision-preview , 把公网图片拉下来直接转 base64
url = "https://imooc-langchain.shortvar.com/guangzhou.jpg"
b64_data = base64.b64encode(requests.get(url, timeout=10).content).decode()
image_url = f"data:image/jpeg;base64,{b64_data}"

print(chain.invoke(image_url))

# 如果是openai,则直接把url放入即可。
# print(chain.invoke(image_url))
7.1.1 测试输出:
"/Users/xiyangyang/Documents/workspaces/python-ai/第2周/第2章 实现第一个GPT聊天机器人/llmops-api/venv/bin/python" /Users/xiyangyang/Documents/workspaces/python-ai/第2周/第2章 实现第一个GPT聊天机器人/llmops-api/study/61-多模态LLM执行函数调用的技巧/1.多模态LLM调用工具.py 
以下是广州市未来几天的天气预报信息:

**2025年10月3日(星期五)**
- 白天:多云,气温35℃,北风1-3级
- 夜间:多云,气温25℃,北风1-3级

**2025年10月4日(星期六)**
- 白天:多云,气温35℃,东风4级
- 夜间:雷阵雨,气温25℃,东风4级

**2025年10月5日(星期日)**
- 白天:雷阵雨,气温32℃,东南风1-3级
- 夜间:雷阵雨,气温26℃,东南风1-3级

**2025年10月6日(星期一)**
- 白天:多云,气温32℃,北风1-3级
- 夜间:多云,气温24℃,北风1-3级

请注意,天气情况可能会有变化,建议出行前再次查看最新的天气预报。

Process finished with exit code 0

7.2 多模态LLM调用工具-文生图

这里用国内的百度千帆来处理,国外的OpenAI在加速器的帮助下,我成功再花了钱充值。不过,大陆的同志们,学习用千帆就好:

百度千帆大模型广场  选择图像生成。

 7.2.1 OpenAI生成图片
import dotenv
from langchain_community.tools.openai_dalle_image_generation import OpenAIDALLEImageGenerationTool
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

dalle = OpenAIDALLEImageGenerationTool(api_wrapper=DallEAPIWrapper(model="dall-e-3"))

llm = ChatOpenAI(model="gpt-4o")
llm_with_tools = llm.bind_tools([dalle], tool_choice="openai_dalle")

chain = llm_with_tools | (lambda msg: msg.tool_calls[0]["args"]) | dalle

print(chain.invoke("帮我绘制一张老爷爷爬山的图片"))
7.2.2 百度千帆生成图片
import dotenv
import requests
import json

dotenv.load_dotenv()

url = "https://qianfan.baidubce.com/v2/images/generations"

payload = json.dumps({
    "prompt": "生成哪吒在和敖丙对决的图片",
    "model": "irag-1.0"
}, ensure_ascii=False)

gaode_api_key = os.getenv("QIANFAN_API_KEY")

headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {gaode_api_key}'
}

response = requests.request("POST", url, headers=headers, data=payload.encode("utf-8"))

print(response.text)

测试输出:

"/Users/xiyangyang/Documents/workspaces/python-ai/第2周/第2章 实现第一个GPT聊天机器人/llmops-api/venv/bin/python" /Users/xiyangyang/Documents/workspaces/python-ai/第2周/第2章 实现第一个GPT聊天机器人/llmops-api/study/61-多模态LLM执行函数调用的技巧/2.LLM文生图应用.py 
{"id":"as-jbcxgqr4ia","created":1759741215,"data":[{"url":"http://qianfan-modelbuilder-img-gen.bj.bcebos.com/irag-1.0/45fa340533c74beca0ee50f925fe6a8d/45fa340533c74beca0ee50f925fe6a8d/img-d9a21442-2506-4f9a-46f1-31e22bfb2657.png?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2025-10-06T09%3A00%3A34Z%2F86400%2Fhost%2F19dad3d24c3fc98dfaa70a28dbdd0ed8cd379ce664fbde029f419b00eb3ff192"}]}

Process finished with exit code 0

实际效果图如下:

7.3 基于ReACT架构的智能体设计

点击查看ReACT架构相关论文, 在 LLM 应用中,如果知道用户输入所需的工具使用特定顺序时,使用 LCEL 表达式构建链应用非常有用,但对于特例,使用工具的次数与顺序取决于输入,在这种情况下希望让 LLM 本身决定使用工具的次数和顺序,Agent 智能体能做到这一点。

在 LangChain 中,Agent 是一个核心概念,它代表能利用语言模型(LLM)和其他工具来执行复杂任务的系统,Agent 设计的目的是为了处理语言模型可能无法直接解决的问题,尤其是当这些任务涉及到多个步骤或需要外部数据源的情况。

import os

import requests
import dotenv
from langchain.agents import create_react_agent, AgentExecutor
from langchain_community.tools import GoogleSerperRun
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.tools import render_text_description_and_args, Tool, tool
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()


class GoogleSerperArgsSchema(BaseModel):
    query: str = Field(description="执行谷歌搜索的查询语句")

@tool
def bocha_web_search_tool(query: str, count: int = 8) -> str:
    """
    使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。

    参数:
    - query: 搜索关键词
    - count: 返回的搜索结果数量

    返回:
    - 搜索结果的字符串形式
    """
    url = 'https://api.bochaai.com/v1/web-search'
    headers = {
        'Authorization': f'Bearer {os.getenv("BOCHA_API_KEY")}',  # 请替换为你的API密钥
        'Content-Type': 'application/json'
    }
    data = {
        "query": query,
        "freshness": "noLimit",  # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
        "summary": True,  # 是否返回长文本摘要总结
        "count": count
    }

    response = requests.post(url, headers=headers, json=data)

    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")


# 1. 创建LangChain工具
bocha_tool = Tool(
    name="BochaWebSearch",
    func=bocha_web_search_tool,
    description="使用Bocha Web Search API进行网络搜索",
    args_schema = GoogleSerperArgsSchema,
    api_wrapper = GoogleSerperAPIWrapper(),
)




# 2.定义工具与工具列表
google_serper = GoogleSerperRun(
    name="google_serper",
    description=(
        "一个低成本的谷歌搜索API。"
        "当你需要回答有关时事的问题时,可以调用该工具。"
        "该工具的输入是搜索查询语句。"
    ),
    args_schema=GoogleSerperArgsSchema,
    api_wrapper=GoogleSerperAPIWrapper(),
)

## 这里看你需要哪个搜查工具,中国大陆可以用bocha,其余地方可以考虑经济问题用google
## ① google的搜索工具
## tools = [google_serper]

## ② 博查的搜索工具
tools = [bocha_tool]

# 3.定义智能体提示模板
prompt = ChatPromptTemplate.from_template(
    "Answer the following questions as best you can. You have access to the following tools:\n\n"
    "{tools}\n\n"
    "Use the following format:\n\n"
    "Question: the input question you must answer\n"
    "Thought: you should always think about what to do\n"
    "Action: the action to take, should be one of [{tool_names}]\n"
    "Action Input: the input to the action\n"
    "Observation: the result of the action\n"
    "... (this Thought/Action/Action Input/Observation can repeat N times)\n"
    "Thought: I now know the final answer\n"
    "Final Answer: the final answer to the original input question\n\n"
    "Begin!\n\n"
    "Question: {input}\n"
    "Thought:{agent_scratchpad}"
)

# 4.创建大语言模型与智能体
#  这次我换了个更好点的模型,真的好花钱的
llm = ChatOpenAI(model="kimi-k2-turbo-preview", temperature=0)
agent = create_react_agent(
    llm=llm,
    prompt=prompt,
    tools=tools,
    tools_renderer=render_text_description_and_args,
)

# 5.创建智能体执行者
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 6.执行智能体并检索
print(agent_executor.invoke({"input": "你好,今年国庆,全国各省市的旅游状况总结,包括出行人数,经济收入,人群体验等等。"}))

7.3.1 测试输出:
> Entering new AgentExecutor chain...
Thought: 用户想了解今年(2024年)国庆期间全国各省市的旅游综合情况,包括出行人数、经济收入、游客体验等。由于这些信息需要最新、权威的数据,我需要先通过网络搜索获取官方发布的国庆旅游数据报告。

Action: BochaWebSearch
Action Input: 2024年国庆黄金周全国各省市旅游数据 出行人数 旅游收入 官方统计{'code': 200, 'log_id': '01922fb0990d01ef', 'msg': None, 'data': {'_type': 'SearchResponse', 'queryContext': {'originalQuery': '2024年国庆黄金周全国各省市旅游数据 出行人数 旅游收入 官方统计'}, 'webPages': {'webSearchUrl': 'https://bochaai.com/search?q=2024年国庆黄金周全国各省市旅游数据 出行人数 旅游收入 官方统计', 'totalEstimatedMatches': 10000000, 'value': [{'id': 'https://api.bochaai.com/v1/#WebPages.0', 'name': '2024年国庆假期各省及主要城市旅游', 'url': 'https://xueqiu.com/3689438884/307297467', 'displayUrl': 'https://xueqiu.com/3689438884/307297467', 'snippet': '“ 成绩单 ”\n【 品橙旅游 】 随着2024年国庆假期的结束 , 2024年全部法定节假日也均结束 。 2024年国庆假期全国 、 各省 、 主要城市的出游数据如何 ? 本文将逐一呈现 。\n国庆节成', 'summary': '“ 成绩单 ”\n【 品橙旅游 】 随着2024年国庆假期的结束 , 2024年全部法定节假日也均结束 。 2024年国庆假期全国 、 各省 、 主要城市的出游数据如何 ? 本文将逐一呈现 。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算 , 国庆节假日7天 , 全国国内出游7.65亿人次 , 按可比口径同比增长5.9% , 较2019年同期增长10.2% ; 国内游客出游总花费7008.17亿元 , 按可比口径同比增长6.3% , 较2019年同期增长7.9% 。\n 表1 2024年度法定假期旅游情况\n来源 : 文化和旅游部\n从本年度7个法定节假日出游数据来看 , 国庆节毫无疑问地成为年度旅游人次和旅游花费 “ 双冠王 ” 。 国庆节假期 , 人均消费达到916.10元/人 , 仅此于春节假期 , 排名第二 ; 在人均日消费方面为130.87元/人 , 超过劳动节和端午节 , 排名第五 , 位于元旦 、 春节 、 中秋节以及清明节之后 。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看 。 截至10月9日 , 国内26省 、 市 、 区相继发布国庆节假期 “ 成绩单 ” , 整体来看国内国庆假期出游人情持续高涨 。 其中 , 河南省以接待7991.6万旅游人次位列第一 , 有包括河南省 、 安徽省 、 广东省 、 辽宁省 、 四川省 、 陕西省 、 江苏省 、 福建省 、 浙江省 、 湖南省等在内的9个省份国庆节假期游客接待量破3000万人次 。 从同比增长率来看 , 湖南省同比增长25.78% , 位列增长率第一 , 新疆维吾尔自治区 ( 以下简称 “ 新疆 ” ) 、 北京市位列第二和第三 。 此外 , 香港接待游客数量也大幅增长 。\n 表2 2024年度主要省份国庆节旅游情况\n来源 : 各省文旅厅或公开报道\n从各省旅游收入来看', 'siteName': '雪球', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://xueqiu.com/3689438884/307297467', 'datePublished': '2024-10-09T23:41:03+08:00', 'dateLastCrawled': '2024-10-09T23:41:03Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.1', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://m.163.com/dy/article/JE2J088G05249VGO.html', 'displayUrl': 'https://m.163.com/dy/article/JE2J088G05249VGO.html', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年 国庆假期 全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年 国庆假期 全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况\n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源:各省文旅厅或公开报道\n从各省旅游收入来看。河南省以565.9亿元的旅游收入排名第一。除此之外,国庆节假期旅游收入超过400亿元的省份有广东省、浙江省和安徽省,分别为536.9亿元、508.1亿元和445.6亿元;有包括辽宁省、陕西省、四川省等在内的12个省份的旅游收入超过200亿元。从同比', 'siteName': '网易', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.163.com/dy/article/JE2J088G05249VGO.html', 'datePublished': '2024-10-09T23:32:00+08:00', 'dateLastCrawled': '2024-10-09T23:32:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.2', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://m.sohu.com/a/814891150_425901/?pvid=000115_3w_a', 'displayUrl': 'https://m.sohu.com/a/814891150_425901/?pvid=000115_3w_a', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况 \n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。 截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。 其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏 省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。 从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。 此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源: 各省文旅厅或公开报道\n从各省旅游收入来看。河南省以565.9亿元的旅游收入排名第一。除此之外,国庆节假期旅游收入超过400亿元的省份有广东省、浙江省和安徽省,分别为536.9亿元、508.1亿元和445.6亿元;有包括辽宁省、陕西省、四川省等在内的12个省份的旅游收入超过200亿', 'siteName': '手机搜狐网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.sohu.com/a/814891150_425901/?pvid=000115_3w_a', 'datePublished': '2024-10-09T19:48:00+08:00', 'dateLastCrawled': '2024-10-09T19:48:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.3', 'name': '持续更新:2024年国庆出行数据.pdf', 'url': 'https://m.book118.com/html/2024/1102/6204154051010241.shtm', 'displayUrl': 'https://m.book118.com/html/2024/1102/6204154051010241.shtm', 'snippet': '内容提供方 : 蓝色星球快生活 大小 : 350.08 KB 字数 : 约2.33万字 发布时间 : 2024-11-04发布于河北  浏览人气 : 1 下载次数 : 仅上传者可见 收藏次数 : 0 ', 'summary': '内容提供方 : 蓝色星球快生活 大小 : 350.08 KB 字数 : 约2.33万字 发布时间 : 2024-11-04发布于河北  浏览人气 : 1 下载次数 : 仅上传者可见 收藏次数 : 0 需要金币 : *** 金币  (10金币=人民币1元)\n国庆消费数据【财通商社】\n国庆消费数据【财通商社】\n要点\n要点\nO1、旅游数据\n⭕1、旅游数据\n全国数据\n全国数据\n待更新,目前根据各个景区假期前几天的数据,预计景区层面同比客流增速在两位数,超\n待更新,目前根据各个景区假期前几天的数据,预计景区层面同比客流增速在两位数,超\n出预期。全国旅游大盘根据目前已有的部分交运数据判断,预计在接近10??增速,基本\n出预期。全国旅游大盘根据目前已有的部分交运数据判断,预计在接近10%的增速,基本\n符合预期。\n符合预期。\n图:2019-2024年节假日恢复度\n图:2019-2024年节假日恢复度\n待更新\n待更新\n数据来源:文旅部\n数据来源:文旅部\n目的地数据\n目的地数据\n【省市县】\n【省市县】\n湖南省:假期第五天,全省当日全域客流1388.50万人次\n湖南省:假期第五天,全省当日全域客流1388.50万人次\n广东省:假期前四天,广东省级及以上景区接待游客万人次,按可比口径同比\n广东省:假期前四天,广东省4A级及以上景区接待游客1446.2万人次,按可比口径同比\n4A1446.2\n增长6.3%\n增长6.3%\n四川省:假期前三天四川省累计接待游客1691.24万人次、门票收入17712.24万元,同比\n四川省:假期前三天四川省累计接待游客1691.24万人次、门票收入17712.24万元,同比\n2023年同期分别增长28.53??25.58??\n2023年同期分别增长28.53%、25.58%。\n安徽省:待更新\n安徽省:待更新\n辽宁省:假期前五天,辽宁省累计接待游客4116.5万人次,同比', 'siteName': '原创力文档', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.book118.com/html/2024/1102/6204154051010241.shtm', 'datePublished': '2024-11-02T08:00:00+08:00', 'dateLastCrawled': '2024-11-02T08:00:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.4', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://view.inews.qq.com/a/20241009A03OMH00', 'displayUrl': 'https://view.inews.qq.com/a/20241009A03OMH00', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况 \n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。 截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。 其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏 省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。 从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。 此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源: 各省文旅厅或公开报道', 'siteName': '腾讯网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://view.inews.qq.com/a/20241009A03OMH00', 'datePublished': '2024-10-09T19:47:00+08:00', 'dateLastCrawled': '2024-10-09T19:47:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.5', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://new.qq.com/rain/a/20241009A03OMH00?media_id=&openApp=false&suid=&web_channel=wap', 'displayUrl': 'https://new.qq.com/rain/a/20241009A03OMH00?media_id=&openApp=false&suid=&web_channel=wap', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况 \n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。 截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。 其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏 省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。 从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。 此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源: 各省文旅厅或公开报道', 'siteName': '腾讯网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://new.qq.com/rain/a/20241009A03OMH00?media_id=&openApp=false&suid=&web_channel=wap', 'datePublished': '2024-10-09T19:47:00+08:00', 'dateLastCrawled': '2024-10-09T19:47:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.6', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'displayUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况\n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源:各省文旅厅或公开报道\n从各省旅游收入来看。河南省以565.9亿元的旅游收入排名第一。除此之外,国庆节假期旅游收入超过400亿元的省份有广东省、浙江省和安徽省,分别为536.9亿元、508.1亿元和445.6亿元;有包括辽宁省、陕西省、四川省等在内的12个省份的旅游收入超过200亿元。从同比增长', 'siteName': '新浪看点', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'datePublished': '2024-10-09T23:28:00+08:00', 'dateLastCrawled': '2024-10-09T23:28:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.7', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://k.sina.cn/article_3903034300_e8a393bc00101cuj0.html', 'displayUrl': 'https://k.sina.cn/article_3903034300_e8a393bc00101cuj0.html', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n  \n  \n国庆节成本年度旅游人次和花费最高节假日\n', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n  \n  \n国庆节成本年度旅游人次和花费最高节假日\n   经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n   表1 2024年度法定假期旅游情况\n  \n  \n来源:文化和旅游部\n   从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n  \n河南省成本年度国庆节旅游人次和花费最高省份\n   从各省旅游接待人次来看。截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。此外,香港接待游客数量也大幅增长。\n   表2 2024年度主要省份国庆节旅游情况\n  \n来源:各省文旅厅或公开报道\n  \n   从各省旅游收入来看。河南省以565.9亿元的旅游收入排名第一。除此之外,国庆节假期旅游收入超过400亿元的省份有广东省、浙江省和安徽省,分别为536.9亿元、508.1亿元和445.6亿元', 'siteName': '新浪看点', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://k.sina.cn/article_3903034300_e8a393bc00101cuj0.html', 'datePublished': '2024-10-09T23:28:00+08:00', 'dateLastCrawled': '2024-10-09T23:28:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}], 'someResultsRemoved': True}, 'images': {'id': None, 'readLink': None, 'webSearchUrl': None, 'value': [{'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://xqimg.imedao.com/192703952be4b3643fe2d2c3.png!800.jpg', 'datePublished': None, 'contentUrl': 'https://xqimg.imedao.com/192703952be4b3643fe2d2c3.png!800.jpg', 'hostPageUrl': 'https://xueqiu.com/3689438884/307297467', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://xueqiu.com/3689438884/307297467', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1009%2Fa5b863faj00sl2s050010d000go0073m.jpg&thumbnail=750x2147483647&quality=75&type=jpg', 'datePublished': None, 'contentUrl': 'https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1009%2Fa5b863faj00sl2s050010d000go0073m.jpg&thumbnail=750x2147483647&quality=75&type=jpg', 'hostPageUrl': 'https://m.163.com/dy/article/JE2J088G05249VGO.html', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.163.com/dy/article/JE2J088G05249VGO.html', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://q8.itc.cn/q_70/images03/20241009/1b88d350b437434abf09368ffd6efc57.jpeg', 'datePublished': None, 'contentUrl': 'https://q8.itc.cn/q_70/images03/20241009/1b88d350b437434abf09368ffd6efc57.jpeg', 'hostPageUrl': 'https://m.sohu.com/a/814891150_425901/?pvid=000115_3w_a', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.sohu.com/a/814891150_425901/?pvid=000115_3w_a', 'width': 900, 'height': 383, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'datePublished': None, 'contentUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'hostPageUrl': 'https://view.inews.qq.com/a/20241009A03OMH00', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://view.inews.qq.com/a/20241009A03OMH00', 'width': 640, 'height': 330, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'datePublished': None, 'contentUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'hostPageUrl': 'https://new.qq.com/rain/a/20241009A03OMH00?media_id=&openApp=false&suid=&web_channel=wap', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://new.qq.com/rain/a/20241009A03OMH00?media_id=&openApp=false&suid=&web_channel=wap', 'width': 640, 'height': 330, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'http://k.sinaimg.cn/n/sinakd20115/55/w600h255/20241009/ee8d-e1383f28c18bcbcdf8dd87a853ae83d4.jpg/w700d1q75cms.jpg', 'datePublished': None, 'contentUrl': 'http://k.sinaimg.cn/n/sinakd20115/55/w600h255/20241009/ee8d-e1383f28c18bcbcdf8dd87a853ae83d4.jpg/w700d1q75cms.jpg', 'hostPageUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'width': 600, 'height': 255, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'http://k.sinaimg.cn/n/sinakd20115/276/w832h1044/20241009/8d3a-68f9c6e82ff8157ac1defb3f0f173433.jpg/w700d1q75cms.jpg', 'datePublished': None, 'contentUrl': 'http://k.sinaimg.cn/n/sinakd20115/276/w832h1044/20241009/8d3a-68f9c6e82ff8157ac1defb3f0f173433.jpg/w700d1q75cms.jpg', 'hostPageUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'width': 700, 'height': 879, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'http://k.sinaimg.cn/n/sinakd20115/725/w873h1452/20241009/75d9-6de8551f84c5198af771e0a34b87c0d6.jpg/w700d1q75cms.jpg', 'datePublished': None, 'contentUrl': 'http://k.sinaimg.cn/n/sinakd20115/725/w873h1452/20241009/75d9-6de8551f84c5198af771e0a34b87c0d6.jpg/w700d1q75cms.jpg', 'hostPageUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://k.sina.cn/article_3903034300_e8a393bc02701cuj8.html?from=news', 'width': 700, 'height': 1164, 'thumbnail': None}], 'isFamilyFriendly': None}, 'videos': None}}Thought: 已拿到权威数据:全国7.65亿人次、花费7008亿元,河南接待量与收入“双第一”。但用户还关心“人群体验”,目前材料里只有宏观数字,没有游客满意度、投诉率、服务口碑等“体验”维度信息,需要再补一轮搜索。

Action: BochaWebSearch
Action Input: 2024国庆旅游 游客满意度 体验 投诉 服务口碑 各省市{'code': 200, 'log_id': 'f7fe29362250ac7b', 'msg': None, 'data': {'_type': 'SearchResponse', 'queryContext': {'originalQuery': '2024国庆旅游 游客满意度 体验 投诉 服务口碑 各省市'}, 'webPages': {'webSearchUrl': 'https://bochaai.com/search?q=2024国庆旅游 游客满意度 体验 投诉 服务口碑 各省市', 'totalEstimatedMatches': 10000000, 'value': [{'id': 'https://api.bochaai.com/v1/#WebPages.0', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”_品橙旅游-商业新知', 'url': 'https://www.shangyexinzhi.com/article/22518076.html', 'displayUrl': 'https://www.shangyexinzhi.com/article/22518076.html', 'snippet': '新知一下 海量新知 查看全文 点赞 收藏 分享至: 本文来自新知号自媒体,不代表商业新知观点和立场。 若有侵权嫌疑,请联系商业新知平台管理员。 联系方式:system@shangyexinzhi.co', 'summary': '新知一下 海量新知 查看全文 点赞 收藏 分享至: 本文来自新知号自媒体,不代表商业新知观点和立场。 若有侵权嫌疑,请联系商业新知平台管理员。 联系方式:system@shangyexinzhi.com', 'siteName': 'www.shangyexinzhi.com', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.shangyexinzhi.com/article/22518076.html', 'datePublished': '2024-10-09T15:38:00+08:00', 'dateLastCrawled': '2024-10-09T15:38:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.1', 'name': '2024年江西省“国庆”假期旅游市场服务质量调查问卷 - 今日头条', 'url': 'https://www.toutiao.com/article/7422144867419128361/', 'displayUrl': 'https://www.toutiao.com/article/7422144867419128361/', 'snippet': '为全面、客观了解全省旅游服务水平,切实提升旅游服务品质,满足游客多层次消费需求和游览体验。江西省文化和旅游厅在2024年国庆期间,继续以线上形式面向广大游客发出问卷调查。期待您提出宝贵意见和建议,对您', 'summary': '为全面、客观了解全省旅游服务水平,切实提升旅游服务品质,满足游客多层次消费需求和游览体验。江西省文化和旅游厅在2024年国庆期间,继续以线上形式面向广大游客发出问卷调查。期待您提出宝贵意见和建议,对您的积极参与和大力支持,谨致谢忱! 来源:江西省文化和旅游厅市场管理处 初审:黄昱艳 复审:李倩男 终审:谢华杰', 'siteName': '今日头条', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.toutiao.com/article/7422144867419128361/', 'datePublished': '2024-10-05T12:33:00+08:00', 'dateLastCrawled': '2024-10-05T12:33:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.2', 'name': '2024年国庆假期各省及主要城市旅游', 'url': 'https://xueqiu.com/3689438884/307297467', 'displayUrl': 'https://xueqiu.com/3689438884/307297467', 'snippet': '“ 成绩单 ”\n【 品橙旅游 】 随着2024年国庆假期的结束 , 2024年全部法定节假日也均结束 。 2024年国庆假期全国 、 各省 、 主要城市的出游数据如何 ? 本文将逐一呈现 。\n国庆节成', 'summary': '“ 成绩单 ”\n【 品橙旅游 】 随着2024年国庆假期的结束 , 2024年全部法定节假日也均结束 。 2024年国庆假期全国 、 各省 、 主要城市的出游数据如何 ? 本文将逐一呈现 。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算 , 国庆节假日7天 , 全国国内出游7.65亿人次 , 按可比口径同比增长5.9% , 较2019年同期增长10.2% ; 国内游客出游总花费7008.17亿元 , 按可比口径同比增长6.3% , 较2019年同期增长7.9% 。\n 表1 2024年度法定假期旅游情况\n来源 : 文化和旅游部\n从本年度7个法定节假日出游数据来看 , 国庆节毫无疑问地成为年度旅游人次和旅游花费 “ 双冠王 ” 。 国庆节假期 , 人均消费达到916.10元/人 , 仅此于春节假期 , 排名第二 ; 在人均日消费方面为130.87元/人 , 超过劳动节和端午节 , 排名第五 , 位于元旦 、 春节 、 中秋节以及清明节之后 。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看 。 截至10月9日 , 国内26省 、 市 、 区相继发布国庆节假期 “ 成绩单 ” , 整体来看国内国庆假期出游人情持续高涨 。 其中 , 河南省以接待7991.6万旅游人次位列第一 , 有包括河南省 、 安徽省 、 广东省 、 辽宁省 、 四川省 、 陕西省 、 江苏省 、 福建省 、 浙江省 、 湖南省等在内的9个省份国庆节假期游客接待量破3000万人次 。 从同比增长率来看 , 湖南省同比增长25.78% , 位列增长率第一 , 新疆维吾尔自治区 ( 以下简称 “ 新疆 ” ) 、 北京市位列第二和第三 。 此外 , 香港接待游客数量也大幅增长 。\n 表2 2024年度主要省份国庆节旅游情况\n来源 : 各省文旅厅或公开报道\n从各省旅游收入来看', 'siteName': '雪球', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://xueqiu.com/3689438884/307297467', 'datePublished': '2024-10-09T23:41:03+08:00', 'dateLastCrawled': '2024-10-09T23:41:03Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.3', 'name': '《国庆旅游者点评报告》发布 全国各省市游客满意度排行榜大曝光 (附报告全文)-中商情报网', 'url': 'http://www.askci.com/news/chanye/20171018/175355109963.shtml', 'displayUrl': 'http://www.askci.com/news/chanye/20171018/175355109963.shtml', 'snippet': '中商情报网讯:在过去不久的国庆中秋超级黄金周,假期最长、出游人数最多、消费支出最高,旅游者对长假的自我评价怎么样?对什么满意或者不满意?哪些省市和目的地的游客满意度最高? 10月12日,国内领先的在线', 'summary': '中商情报网讯:在过去不久的国庆中秋超级黄金周,假期最长、出游人数最多、消费支出最高,旅游者对长假的自我评价怎么样?对什么满意或者不满意?哪些省市和目的地的游客满意度最高? 10月12日,国内领先的在线旅游公司携程旅游集团,对十一假期的旅游者评价情况进行全面监测,发布了《2017国庆中秋长假旅游者点评指数报告》,包括整体旅游者点评分、各个省市与目的地的满意度评分等。 记者获悉,这是国内首次发布黄金周假期旅游者满意度评价的调查报告,也是首个以假期旅游者的真实点评为唯一依据的满意度报告。这一报告基于3亿携程用户假期旅游情况,依据最大规模的国内游与出境游订单用户的国庆出游点评大数据得出。通过对携程平台20000多家旅行社、黄金周服务的百万级跟团、自由行、当地玩乐等用户的点评进行统计,反映了游客对黄金周旅行的真实感受。 报告还发布了黄金周不同客户群体、出发省市、目的地等,吃住行等各个旅游要素维度的点评指数,从而构成一个旅游者评价指数模型。目前,携程度假线路已经积累了数百万条真实点评,单个产品的点评最高达到上万条。 黄金周我国游客平均点评分指数 92.4 ,成满意度最高黄金周', 'siteName': '中商情报网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=http://www.askci.com/news/chanye/20171018/175355109963.shtml', 'datePublished': '2017-10-18T17:53:00+08:00', 'dateLastCrawled': '2017-10-18T17:53:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.4', 'name': '某市2024年国庆旅游工作总结 - 今日头条', 'url': 'https://www.toutiao.com/article/7424716049280451081/', 'displayUrl': 'https://www.toutiao.com/article/7424716049280451081/', 'snippet': '某市2024年国庆旅游工作总结 一、2024年国庆假期旅游工作基本情况 (一)旅游市场安全平稳有序。假期期间,我市旅游市场未出现重大旅游安全事故,全市文化和旅游市场秩序良好、运行平稳。未发生涉旅安全事', 'summary': '某市2024年国庆旅游工作总结 一、2024年国庆假期旅游工作基本情况 (一)旅游市场安全平稳有序。假期期间,我市旅游市场未出现重大旅游安全事故,全市文化和旅游市场秩序良好、运行平稳。未发生涉旅安全事件,无人员伤亡报告;共受理旅游投诉举报和咨询6件次,都已及时办结并反馈。各景区景点、旅行社、酒店民宿等旅游企业安全生产意识进一步加强,制度落实更加严格,安全管理和应急处置能力有效提升。全市文旅行业未发生安全生产责任事故,为全市文旅市场安全平稳运行打下坚实基础。 (二)旅游产品供给丰富多彩。为满足游客出游需求,丰富节日市场供给,我市开展“XX邀约·冬季来XX”系列活动96场次。为促进全市假日消费,组织全市11家重点商超、38家餐饮单位、20家景区景点举办美食节、消费季等活动31场次,投放各类惠民消费券5万张,直接带动消费超千万元。通过线上线下相结合的方式举办“2024喜迎XX”网络直播节,其中抖音平台直播场次达75场,吸引线上观看人数近800万人次,互动评论近15万条。为丰富秋冬季文旅活动,投入2000万元,举办“我在XX等你打卡”秋冬旅游季活动,开展XX踩街活动、“村晚”展演、非遗展示等19项主题活动。通过前期广泛宣传发动,国庆长假期间,XX山风景区门票收入达6910万元,同比增长21%,XX古城旅游区门票收入达3589万元,同比增长6%。 (三)旅游市场宣传营销持续升温。一是新媒体宣传强势启动。', 'siteName': '今日头条', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.toutiao.com/article/7424716049280451081/', 'datePublished': '2024-10-12T14:35:00+08:00', 'dateLastCrawled': '2024-10-12T14:35:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.5', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://view.inews.qq.com/a/20241009A03OMH00', 'displayUrl': 'https://view.inews.qq.com/a/20241009A03OMH00', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况 \n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。 截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。 其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏 省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。 从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。 此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源: 各省文旅厅或公开报道', 'siteName': '腾讯网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://view.inews.qq.com/a/20241009A03OMH00', 'datePublished': '2024-10-09T19:47:00+08:00', 'dateLastCrawled': '2024-10-09T19:47:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.6', 'name': '数读:2024年国庆假期各省及主要城市旅游“成绩单”', 'url': 'https://new.qq.com/rain/a/20241009A03OMH00', 'displayUrl': 'https://new.qq.com/rain/a/20241009A03OMH00', 'snippet': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游', 'summary': '【品橙旅游】随着2024年国庆假期的结束,2024年全部法定节假日也均结束。2024年国庆假期全国、各省、主要城市的出游数据如何?本文将逐一呈现。\n国庆节成本年度旅游人次和花费最高节假日\n经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。\n表1 2024年度法定假期旅游情况 \n来源:文化和旅游部\n从本年度7个法定节假日出游数据来看,国庆节毫无疑问地成为年度旅游人次和旅游花费“双冠王”。国庆节假期,人均消费达到916.10元/人,仅此于春节假期,排名第二;在人均日消费方面为130.87元/人,超过劳动节和端午节,排名第五,位于元旦、春节、中秋节以及清明节之后。\n河南省成本年度国庆节旅游人次和花费最高省份\n从各省旅游接待人次来看。 截至10月9日,国内26省、市、区相继发布国庆节假期“成绩单”,整体来看国内国庆假期出游人情持续高涨。 其中,河南省以接待7991.6万旅游人次位列第一,有包括河南省、安徽省、广东省、辽宁省、四川省、陕西省、江苏 省、福建省、浙江省、湖南省等在内的9个省份国庆节假期游客接待量破3000万人次。 从同比增长率来看,湖南省同比增长25.78%,位列增长率第一,新疆维吾尔自治区(以下简称“新疆”)、北京市位列第二和第三。 此外,香港接待游客数量也大幅增长。\n表2 2024年度主要省份国庆节旅游情况\n来源: 各省文旅厅或公开报道', 'siteName': '腾讯网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://new.qq.com/rain/a/20241009A03OMH00', 'datePublished': '2024-10-09T19:47:00+08:00', 'dateLastCrawled': '2024-10-09T19:47:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.7', 'name': '2024年江西省“国庆”假期旅游市场服务质量调查问卷  丰城市人民政府', 'url': 'http://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062.shtml', 'displayUrl': 'http://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062.shtml', 'snippet': '索 引 号: 014728174U/2024-0109272 发布机构: 丰城市文化广电旅游局 发文日期: 公开方式: 主动公开 公开时限: 常年公开 公开范围: 面向全社会 分类: 行政权力运行 全', 'summary': '索 引 号: 014728174U/2024-0109272 发布机构: 丰城市文化广电旅游局 发文日期: 公开方式: 主动公开 公开时限: 常年公开 公开范围: 面向全社会 分类: 行政权力运行 全面、客观了解全省旅游服务水平,切实提升旅游服务品质,满足游客多层次消费需求和游览体验。江西省文化和旅游厅在2024年国庆期间,继续以线上形式面向广大游客发出问卷调查。期待您提出宝贵意见和建议,对您的积极参与和大力支持,谨致谢忱!', 'siteName': '丰城市人民政府', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=http://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062.shtml', 'datePublished': '2024-10-01T06:51:36+08:00', 'dateLastCrawled': '2024-10-01T06:51:36Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}], 'someResultsRemoved': True}, 'images': {'id': None, 'readLink': None, 'webSearchUrl': None, 'value': [{'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'http://www.pinchain.com/wp-content/uploads/2024/10/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20241009105232-600x255.jpg', 'datePublished': None, 'contentUrl': 'http://www.pinchain.com/wp-content/uploads/2024/10/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20241009105232-600x255.jpg', 'hostPageUrl': 'https://www.shangyexinzhi.com/article/22518076.html', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.shangyexinzhi.com/article/22518076.html', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/5a04c307cc9289398b2b1f7081860863~tplv-tt-cs0:1080:1920.jpg?_iz=31826&bid=11&from=article.headline&gid=7447746661742428722&lk3s=06827d14&x-expires=1739561164&x-signature=yNCaJfT8oA1%2Ba9tmtmyI518laOI%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/5a04c307cc9289398b2b1f7081860863~tplv-tt-cs0:1080:1920.jpg?_iz=31826&bid=11&from=article.headline&gid=7447746661742428722&lk3s=06827d14&x-expires=1739561164&x-signature=yNCaJfT8oA1%2Ba9tmtmyI518laOI%3D', 'hostPageUrl': 'https://www.toutiao.com/article/7422144867419128361/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.toutiao.com/article/7422144867419128361/', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://xqimg.imedao.com/192703952be4b3643fe2d2c3.png!800.jpg', 'datePublished': None, 'contentUrl': 'https://xqimg.imedao.com/192703952be4b3643fe2d2c3.png!800.jpg', 'hostPageUrl': 'https://xueqiu.com/3689438884/307297467', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://xueqiu.com/3689438884/307297467', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'http://image1.askci.com/images/2017/10/18/c76dfc8a-4bae-4f49-a833-0b07a4740350.png', 'datePublished': None, 'contentUrl': 'http://image1.askci.com/images/2017/10/18/c76dfc8a-4bae-4f49-a833-0b07a4740350.png', 'hostPageUrl': 'http://www.askci.com/news/chanye/20171018/175355109963.shtml', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'http://www.askci.com/news/chanye/20171018/175355109963.shtml', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/563fc50bb764429c8b9d7ee1aa7abb71~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1743036766&x-signature=CZEsKGLZcofuo%2FJf0VTIZVbwWuc%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/563fc50bb764429c8b9d7ee1aa7abb71~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1743036766&x-signature=CZEsKGLZcofuo%2FJf0VTIZVbwWuc%3D', 'hostPageUrl': 'https://www.toutiao.com/article/7424716049280451081/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.toutiao.com/article/7424716049280451081/', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'datePublished': None, 'contentUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'hostPageUrl': 'https://view.inews.qq.com/a/20241009A03OMH00', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://view.inews.qq.com/a/20241009A03OMH00', 'width': 640, 'height': 330, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'datePublished': None, 'contentUrl': 'https://inews.gtimg.com/om_ls/OtjrhlviAVyeoT6pdSy1lko9lMUQmUT17FXg-w85tcrkAAA_640330/0', 'hostPageUrl': 'https://new.qq.com/rain/a/20241009A03OMH00', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://new.qq.com/rain/a/20241009A03OMH00', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062/images/b4dd1e6714924b069d030a66da49b210.jpg', 'datePublished': None, 'contentUrl': 'https://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062/images/b4dd1e6714924b069d030a66da49b210.jpg', 'hostPageUrl': 'http://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062.shtml', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'http://www.jxfc.gov.cn/fcsrmzf/xzqlyxa9/202410/4bc666b7b30243f28dd5469d8079f062.shtml', 'width': 0, 'height': 0, 'thumbnail': None}], 'isFamilyFriendly': None}, 'videos': None}}Thought: 第二轮搜索只拿到“江西在问卷”和“某市零投诉”两条零散信息,仍缺全国层面的满意度、投诉率、服务口碑等“体验”维度权威数据。需要再换关键词,把“体验”拆成更具体的“投诉/满意度/舆情”等,并限定在2024年国庆,看看能否找到文旅部或大型OTA发布的权威报告。

Action: BochaWebSearch
Action Input: 2024年国庆 旅游投诉率 全国游客满意度 文旅部发布 舆情报告{'code': 200, 'log_id': 'a77ec26d4c9c5f66', 'msg': None, 'data': {'_type': 'SearchResponse', 'queryContext': {'originalQuery': '2024年国庆 旅游投诉率 全国游客满意度 文旅部发布 舆情报告'}, 'webPages': {'webSearchUrl': 'https://bochaai.com/search?q=2024年国庆 旅游投诉率 全国游客满意度 文旅部发布 舆情报告', 'totalEstimatedMatches': 10000000, 'value': [{'id': 'https://api.bochaai.com/v1/#WebPages.0', 'name': '2024年“十一”假期消费维权舆情分析报告旅游酒店预订_网易订阅', 'url': 'https://www.163.com/dy/article/JEQ2PCQF0514EAHV.html', 'displayUrl': 'https://www.163.com/dy/article/JEQ2PCQF0514EAHV.html', 'snippet': '核心提示:为进一步洞悉长假新型消费行为,聚焦消费者投诉热点,发挥社会监督作用,中国消费者协会利用互联网舆情监测系统,对10月1日至10月7日相关消费维权情况进行了网络大数据舆情分析。数据显示,安全管理', 'summary': '核心提示:为进一步洞悉长假新型消费行为,聚焦消费者投诉热点,发挥社会监督作用,中国消费者协会利用互联网舆情监测系统,对10月1日至10月7日相关消费维权情况进行了网络大数据舆情分析。数据显示,安全管理、定价收费、住宿预订等方面话题热度较高。......(世界食品网-www.shijieshipin.com) 2024年“十一”假期消费需求集中爆发。公众旅游出行热情高涨,文旅景区、城市商圈、乡村山水、文博影院诸多场景游人如织,销售额和人流量均实现明显上涨。 据文化和旅游部数据中心测算,2024年“十一”假期全国国内旅游出游合计7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。商务部数据显示,“十一”期间全国重点零售和餐饮企业销售额按可比口径同比增长4.5%。国家税务局增值税发票数据显示,居民通过观演出、看电影、逛书店等方式满足文化消费需求,带动文化服务销售收入同比增长85.2%。 今年“十一”假期,消费市场各项数据创历史新高,旅游业态推陈出新。红色游、县域游、小众游圈粉年轻人,自驾出行、临时预订等消费习惯加速养成,对传统经典目的地和新兴网红打卡地的文旅产业运营及后勤管理提出新要求。 为进一步洞悉长假新型消费行为,聚焦消费者投诉热点,发挥社会监督作用,中国消费者协会利用互联网舆情监测系统,对10月1日至10月7日相关消费维权情况进行了网络大数据舆情分析。数据显示,安全管理、定价收费、住宿预订等方面话题热度较高。 一、消费维权舆情基本情况 在10月1日至10月7日共计7天监测期内,共收集到“消费维权”相关信息50,836,138条,日均约726万条。舆情热度平稳,后期缓慢下行,10月1日信息量即达到峰值,为8,400,451条。 在信息传播渠道上,“消费维权”', 'siteName': '网易', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.163.com/dy/article/JEQ2PCQF0514EAHV.html', 'datePublished': '2024-10-18T17:12:39+08:00', 'dateLastCrawled': '2024-10-18T17:12:39Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.1', 'name': '中国消费者协会:2024年“十一”假期消费维权舆情分析报告 - 外唐智库', 'url': 'https://www.waitang.com/article/109276.html', 'displayUrl': 'https://www.waitang.com/article/109276.html', 'snippet': '2024年“十一”假期消费需求集中爆发。公众旅游出行热情高涨,文旅景区、城市商圈、乡村山水、文博影院诸多场景游人如织,销售额和人流量均实现明显上涨。\n据文化和旅游部数据中心测算,2024年“十一”假期', 'summary': '2024年“十一”假期消费需求集中爆发。公众旅游出行热情高涨,文旅景区、城市商圈、乡村山水、文博影院诸多场景游人如织,销售额和人流量均实现明显上涨。\n据文化和旅游部数据中心测算,2024年“十一”假期全国国内旅游出游合计7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。商务部数据显示,“十一”期间全国重点零售和餐饮企业销售额按可比口径同比增长4.5%。国家税务局增值税发票数据显示,居民通过观演出、看电影、逛书店等方式满足文化消费需求,带动文化服务销售收入同比增长85.2%。\n今年“十一”假期,消费市场各项数据创历史新高,旅游业态推陈出新。红色游、县域游、小众游圈粉年轻人,自驾出行、临时预订等消费习惯加速养成,对传统经典目的地和新兴网红打卡地的文旅产业运营及后勤管理提出新要求。\n为进一步洞悉长假新型消费行为,聚焦消费者投诉热点,发挥社会监督作用,中国消费者协会利用互联网舆情监测系统,对10月1日至10月7日相关消费维权情况进行了网络大数据舆情分析。数据显示,安全管理、定价收费、住宿预订等方面话题热度较高。\n在10月1日至10月7日共计7天监测期内,共收集到“消费维权”相关信息50,836,138条,日均约726万条。舆情热度平稳,后期缓慢下行,10月1日信息量即达到峰值,为8,400,451条。在信息传播渠道上,“消费维权”类信息传播渠道主要有视频、网站、微博、客户端、微信、论坛、数字报等。其中视频信息量最高,占比68.55%,短视频平台影响力逐年上升;其次是网站,占比9.80%;第三是微博,占比10.13%。\n监测期间,共监测到“消费维权”吐槽类信息1,393,753条,占“消费维权”总信息量的2.74%。\n此类信息体现了消费者对其所接受商品和服务的负', 'siteName': '外唐智库', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.waitang.com/article/109276.html', 'datePublished': '2024-10-18T00:00:00+08:00', 'dateLastCrawled': '2024-10-18T00:00:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.2', 'name': '2024年“十一”假期消费维权舆情分析报告', 'url': 'https://m.thepaper.cn/newsDetail_forward_29074691', 'displayUrl': 'https://m.thepaper.cn/newsDetail_forward_29074691', 'snippet': '2024年“十一”假期消费需求集中爆发。公众旅游出行热情高涨,文旅景区、城市商圈、乡村山水、文博影院诸多场景游人如织,销售额和人流量均实现明显上涨。\n据文化和旅游部数据中心测算,2024年“十一”假期', 'summary': '2024年“十一”假期消费需求集中爆发。公众旅游出行热情高涨,文旅景区、城市商圈、乡村山水、文博影院诸多场景游人如织,销售额和人流量均实现明显上涨。\n据文化和旅游部数据中心测算,2024年“十一”假期全国国内旅游出游合计7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。商务部数据显示,“十一”期间全国重点零售和餐饮企业销售额按可比口径同比增长4.5%。国家税务局增值税发票数据显示,居民通过观演出、看电影、逛书店等方式满足文化消费需求,带动文化服务销售收入同比增长85.2%。\n今年“十一”假期,消费市场各项数据创历史新高,旅游业态推陈出新。红色游、县域游、小众游圈粉年轻人,自驾出行、临时预订等消费习惯加速养成,对传统经典目的地和新兴网红打卡地的文旅产业运营及后勤管理提出新要求。\n为进一步洞悉长假新型消费行为,聚焦消费者投诉热点,发挥社会监督作用,中国消费者协会利用互联网舆情监测系统,对10月1日至10月7日相关消费维权情况进行了网络大数据舆情分析。数据显示,安全管理、定价收费、住宿预订等方面话题热度较高。\n一、消费维权舆情基本情况\n在10月1日至10月7日共计7天监测期内,共收集到“消费维权”相关信息50,836,138条,日均约726万条。舆情热度平稳,后期缓慢下行,10月1日信息量即达到峰值,为8,400,451条。\n图1 “消费维权”日信息量图\n在信息传播渠道上,“消费维权”类信息传播渠道主要有视频、网站、微博、客户端、微信、论坛、数字报等。其中视频信息量最高,占比68.55%,短视频平台影响力逐年上升;其次是网站,占比9.80%;第三是微博,占比10.13%。\n图2 “消费维权”渠道信息量及占比分布图\n二、消费维权问题集中领域\n及典型事例\n监测期间', 'siteName': '澎湃新闻', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.thepaper.cn/newsDetail_forward_29074691', 'datePublished': '2024-10-18T22:20:00+08:00', 'dateLastCrawled': '2024-10-18T22:20:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.3', 'name': ':《2024年10月中国电子商务用户体验与投诉数据报告》发布_教育_消费_数字', 'url': 'https://www.sohu.com/a/823525735_211762', 'displayUrl': 'https://www.sohu.com/a/823525735_211762', 'snippet': '10月8日,文旅部发布2024年国庆节假期国内文旅市场消费数据。经文旅部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%。火热的背后', 'summary': '10月8日,文旅部发布2024年国庆节假期国内文旅市场消费数据。经文旅部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%。火热的背后,旅游消费纠纷也不可避免,退款问题、霸王条款、售后服务、网络欺诈、订单问题等显著。 此外,从预售期的提前到各类优惠政策的推出,淘天、京东、拼多多、抖音电商等各大电商平台已打响争夺战。 在此背景下,2024年11月4日,依据网络消费纠纷调解平台“电诉宝”2024年10月受理的全国 93家 互联网消费平台纠纷大量案例数据,“一带一路”TOP10影响力社会智库电子商务研究中心发布了《2024年10月中国电子商务用户体验与投诉数据报告》。 报告涉及了数字零售(主要集中在生鲜电商、二手电商)、数字生活(主要集中于在线旅游、在线票务)及数字教育、跨境电商、产业电商、金融科技、物流科技等领域。报告公布了2024年10月网络消费投诉数据及 《2024年10月数字零售十大典型投诉案例》《2024年10月数字生活十大典型投诉案例》 和 《2024年10月数字教育十大典型投诉案例》 。 在报告公布的《2024年10月全国网络消费评级榜》中: 获 “建议下单” 的有:抖音、美团等2家; 获 “谨慎下单” 评级的有:去哪儿、智行、万师傅等4家; 获 “不建议下单” 评级的有:飞猪、小红书、分期乐等4家; 获 “不予评级” 的有:大麦网、淘宝、1688、天猫、闲鱼、快手、阿里巴巴、微信、微信小程序购物平台、微信视频号等10家。 一、退款问题仍是重灾区 据“电诉宝”显示,2024年10月全国网络消费投诉问题类型TOP10中, 任意退款问题 占比高达32.64%,其余问题类型依次为: 退款问题 17.42%、 过度维护消费者 (7.23%)、 商品质量 (4.98%)、 任意罚款 (4.34%)、 售后服务', 'siteName': '搜狐', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.sohu.com/a/823525735_211762', 'datePublished': '2024-11-04T15:42:00+08:00', 'dateLastCrawled': '2024-11-04T15:42:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.4', 'name': '新华社权威快报2024年国庆节假期国内出游7.65亿人次-荔枝网', 'url': 'https://m.gdtv.cn/article/8eca5fbc990850b39b5761e5e8d96c7a', 'displayUrl': 'https://m.gdtv.cn/article/8eca5fbc990850b39b5761e5e8d96c7a', 'snippet': '文化和旅游部10月8日公布2024年国庆节假期文化和旅游市场情况。经文化和旅游部数据中心测算,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费', 'summary': '文化和旅游部10月8日公布2024年国庆节假期文化和旅游市场情况。经文化和旅游部数据中心测算,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。 假期中,人们满怀对祖国的祝福、对生活的热爱出游,文化和旅游产品供给丰富,群众乐享休闲时光。 记者:徐壮、周玮 设计:潘一景 新华社国内部出品 地址:中国广东省广州市环市东路331号广东电视中心 电话:0086-20-83355188(转) 邮编:510066 违法和不良信息举报电话:020-61293176    报料电话:020-114转8', 'siteName': '荔枝网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.gdtv.cn/article/8eca5fbc990850b39b5761e5e8d96c7a', 'datePublished': '2024-10-08T20:11:00+08:00', 'dateLastCrawled': '2024-10-08T20:11:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.5', 'name': '图解丨2024年国庆节假期国内出游7.65亿人次 文旅消费热力十足 - 今日头条', 'url': 'https://www.toutiao.com/article/7423677154837152310/', 'displayUrl': 'https://www.toutiao.com/article/7423677154837152310/', 'snippet': '光明网讯(记者 杨亚楠 实习生 王星瑶)日前,文旅部公布2024年国庆节假期相关旅游数据。数据显示,2024年国庆节假期,全国文化和旅游市场平稳有序。经文化和旅游部数据中心测算,国庆节假日7天,全国国', 'summary': '光明网讯(记者 杨亚楠 实习生 王星瑶)日前,文旅部公布2024年国庆节假期相关旅游数据。数据显示,2024年国庆节假期,全国文化和旅游市场平稳有序。经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长', 'siteName': '今日头条', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.toutiao.com/article/7423677154837152310/', 'datePublished': '2024-10-09T23:38:00+08:00', 'dateLastCrawled': '2024-10-09T23:38:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.6', 'name': '文旅部:2024年国庆节假期国内出游7.65亿人次,总花费7008.17亿元 - 经济观察网 - 专业财经新闻网站', 'url': 'http://www.eeo.com.cn/2024/1008/690197.shtml', 'displayUrl': 'http://www.eeo.com.cn/2024/1008/690197.shtml', 'snippet': '经济观察网讯 据文旅之声微信公众号消息,2024年国庆节假期,全国文化和旅游市场平稳有序。经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019', 'summary': '经济观察网讯 据文旅之声微信公众号消息,2024年国庆节假期,全国文化和旅游市场平稳有序。经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较2019年同期增长10.2%;国内游客出游总花费7008.17亿元,按可比口径同比增长6.3%,较2019年同期增长7.9%。 地址:北京理工大学国防科技园2号楼4层 邮编:100081 电话:4001560066 传真:86-10-88510872 违法和不良信息举报电话:010-60910566 举报邮箱:jubao@eeo.com.cn', 'siteName': '经济观察网', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=http://www.eeo.com.cn/2024/1008/690197.shtml', 'datePublished': '2024-10-08T15:06:00+08:00', 'dateLastCrawled': '2024-10-08T15:06:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.7', 'name': '旅游行业市场报告-思途CMS', 'url': 'http://www.stourweb.com/peixun/yingxiao-91-0-0-0', 'displayUrl': 'http://www.stourweb.com/peixun/yingxiao-91-0-0-0', 'snippet': '行业报告 当旅游进入刚需时代,新的一年,中国旅游业发展趋势如何?行业前景又是怎么样?思途以丰富的行业知识和多年的研究经验,为你深度剖析重点行业报告,助您把握市场需求,判断市场潜力为您的企业决策提供专业', 'summary': '行业报告 当旅游进入刚需时代,新的一年,中国旅游业发展趋势如何?行业前景又是怎么样?思途以丰富的行业知识和多年的研究经验,为你深度剖析重点行业报告,助您把握市场需求,判断市场潜力为您的企业决策提供专业支持。 2024年国庆假期福建省文旅市场情况 | 分类: 行业报告 摘要: 今年是新中国成立75周年盛世华诞。省委省政府高度重视国庆假日文旅市场工作,省委书记周祖翼、省长赵龙对做好假日文旅市场和安全生产工作作出指示批示,省领导张彦、王永... 快速阅读 浏览: 415 摘要: 2024年国庆节假日期间,全区大部分地区秋高气爽、气候宜人,适合出游。全区文化和旅游市场持续火热,文化和旅游消费供需两旺,各大旅游景区景点、热门商圈人潮涌动,传... 摘要: 综合运营商手机信令大数据和旅游花费抽样调查,2024年国庆假日,浙江省累计全域旅游人数3694.3万人次,按可比口径(下同)增长16.6%,比2019年同期增长... 摘要: 国庆假期,陕西文旅市场人潮涌动,消费活力持续释放,各方获得感不断增强,文旅业在引导扩大消费、满足人民美好生活需要、推动市场繁荣方面的作用日益凸显。据抽样测算,国... 摘要: 2024年国庆假期,全省文化和旅游系统认真贯彻落实文化和旅游部、省委省政府假日工作部署和2024四川省文化和旅游发展大会精神,持续加强资源产品宣传推广,深度激发... 摘要: 今年国庆节期间全国边检机关共计保障1309.8万人次中外人员出入境,日均187.1万人次,同比去年增长25.8%,单日出入境通关最高峰出现在10月5日,达203... 摘要: 2024年国庆节假期,全国文化和旅游市场平稳有序。经文化和旅游部数据中心测算,国庆节假日7天,全国国内出游7.65亿人次,按可比口径同比增长5.9%,较20... 摘要: 2024年中秋节假期,全国文化和旅游市场总体平稳有序。据文化和旅游部数', 'siteName': '思途旅游CMS电商系统', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=http://www.stourweb.com/peixun/yingxiao-91-0-0-0', 'datePublished': '2024-10-10T22:59:15+08:00', 'dateLastCrawled': '2024-10-10T22:59:15Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}], 'someResultsRemoved': True}, 'images': {'id': None, 'readLink': None, 'webSearchUrl': None, 'value': [{'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://imagepphcloud.thepaper.cn/pph/image/326/473/713.jpg', 'datePublished': None, 'contentUrl': 'https://imagepphcloud.thepaper.cn/pph/image/326/473/713.jpg', 'hostPageUrl': 'https://m.thepaper.cn/newsDetail_forward_29074691', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.thepaper.cn/newsDetail_forward_29074691', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://q6.itc.cn/q_70/images03/20241104/bd4d7df4cbca439ca9ccdb511aa63d61.jpeg', 'datePublished': None, 'contentUrl': 'https://q6.itc.cn/q_70/images03/20241104/bd4d7df4cbca439ca9ccdb511aa63d61.jpeg', 'hostPageUrl': 'https://www.sohu.com/a/823525735_211762', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.sohu.com/a/823525735_211762', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://q6.itc.cn/q_70/images03/20241104/658aeda4aea84f56ae78e5606a963e29.png', 'datePublished': None, 'contentUrl': 'https://q6.itc.cn/q_70/images03/20241104/658aeda4aea84f56ae78e5606a963e29.png', 'hostPageUrl': 'https://www.sohu.com/a/823525735_211762', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.sohu.com/a/823525735_211762', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://q8.itc.cn/q_70/images03/20241104/1a75e3f446b34aa1ae21fa0ea44e691d.jpeg', 'datePublished': None, 'contentUrl': 'https://q8.itc.cn/q_70/images03/20241104/1a75e3f446b34aa1ae21fa0ea44e691d.jpeg', 'hostPageUrl': 'https://www.sohu.com/a/823525735_211762', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.sohu.com/a/823525735_211762', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://img.gdtv.cn/image/63epmXFIMcpx3EVrP2ZJ.jpeg', 'datePublished': None, 'contentUrl': 'https://img.gdtv.cn/image/63epmXFIMcpx3EVrP2ZJ.jpeg', 'hostPageUrl': 'https://m.gdtv.cn/article/8eca5fbc990850b39b5761e5e8d96c7a', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.gdtv.cn/article/8eca5fbc990850b39b5761e5e8d96c7a', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/1de198ce93d0446cb4229d74035305e9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1731884819&x-signature=h1fF%2FlQZJnuwdJsDTyN42BTfo4c%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/1de198ce93d0446cb4229d74035305e9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1731884819&x-signature=h1fF%2FlQZJnuwdJsDTyN42BTfo4c%3D', 'hostPageUrl': 'https://www.toutiao.com/article/7423677154837152310/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.toutiao.com/article/7423677154837152310/', 'width': 0, 'height': 0, 'thumbnail': None}], 'isFamilyFriendly': None}, 'videos': None}}Thought: 第三轮搜索终于拿到权威“体验”维度数据:中国消费者协会《2024年“十一”假期消费维权舆情分析报告》——7天监测期内共收集“消费维权”吐槽类信息139万条,仅占总量的2.74%,说明整体体验满意度仍处高位;舆情热点集中在安全管理、定价收费、住宿预订三方面,但并未出现系统性质量事件。至此,出行人数、经济收入、人群体验三大维度信息已完整,可以收拢作答。

Final Answer: 2024年国庆黄金周全国旅游“成绩单”可概括为“三高两稳”:

一、出行人数创新高  
- 全国国内出游7.65亿人次,同比增长5.9%,比2019年同期增长10.2%,为全年法定节假日之最。  
- 26省市公布接待量,其中9省突破3000万人次:  
  – 河南7 991.6万人次(全国第一)  
  – 安徽、广东、辽宁、四川、陕西、江苏、福建、浙江、湖南均在3000万+  
- 增速最快:湖南+25.8%、新疆+21%、北京+18%。

二、旅游收入创新高  
- 全国游客总花费7 008.17亿元,同比增长6.3%,较2019年增长7.9%。  
- 人均花费916元/人,仅次于春节,为历年国庆第二高。  
- 各省收入排名:  
  – 河南565.9亿元(第一)  
  – 广东536.9亿元、浙江508.1亿元、安徽445.6亿元,四省均超400亿;  
  – 辽宁、陕西、四川等12省过200亿。

三、人均消费结构提升  
- 人均日消费130.9元,同比提高4.1%;自驾、小众目的地、红色游、县域游人均停留时间延长0.7天,带动综合消费。

四、市场秩序与体验总体平稳  
- 中消协监测显示,7天假期共收集“消费维权”吐槽类信息139万条,仅占总量的2.74%,同比持平,整体满意度保持高位。  
- 投诉热点集中在“安全管理、定价收费、住宿预订”三类,未出现重大质量事件或群体性投诉。  
- 各地抽样反馈:江西、福建、四川等省问卷满意度均≥85%;“某市”样本零重大事故、零滞留、投诉6件全部当日办结。

五、省市亮点速览  
- 河南:游客量、收入“双第一”,云台山、清明上河园连续多日满负荷。  
- 湖南:增速最快,张家界、凤凰古城预约率98%,线上好评率93%。  
- 新疆:自驾进疆车辆同比+38%,独库公路“堵”上热搜,但游客满意度仍达87%。  
- 北京:市属公园游客量+25%,故宫、国家博物馆“一票难求”,无重大投诉。  
- 四川:门票收入1.77亿元,同比+25.6%,三星堆新馆客流创新高,未发生安全事件。

综上,2024年国庆全国旅游呈现“人气高、收入高、满意度高、运行稳、安全稳”的特征,各地供给丰富、保障有力,为全年假日市场画上圆满句号。

> Finished chain.
{'input': '你好,今年国庆,全国各省市的旅游状况总结,包括出行人数,经济收入,人群体验等等。', 'output': '2024年国庆黄金周全国旅游“成绩单”可概括为“三高两稳”:\n\n一、出行人数创新高  \n- 全国国内出游7.65亿人次,同比增长5.9%,比2019年同期增长10.2%,为全年法定节假日之最。  \n- 26省市公布接待量,其中9省突破3000万人次:  \n  – 河南7 991.6万人次(全国第一)  \n  – 安徽、广东、辽宁、四川、陕西、江苏、福建、浙江、湖南均在3000万+  \n- 增速最快:湖南+25.8%、新疆+21%、北京+18%。\n\n二、旅游收入创新高  \n- 全国游客总花费7 008.17亿元,同比增长6.3%,较2019年增长7.9%。  \n- 人均花费916元/人,仅次于春节,为历年国庆第二高。  \n- 各省收入排名:  \n  – 河南565.9亿元(第一)  \n  – 广东536.9亿元、浙江508.1亿元、安徽445.6亿元,四省均超400亿;  \n  – 辽宁、陕西、四川等12省过200亿。\n\n三、人均消费结构提升  \n- 人均日消费130.9元,同比提高4.1%;自驾、小众目的地、红色游、县域游人均停留时间延长0.7天,带动综合消费。\n\n四、市场秩序与体验总体平稳  \n- 中消协监测显示,7天假期共收集“消费维权”吐槽类信息139万条,仅占总量的2.74%,同比持平,整体满意度保持高位。  \n- 投诉热点集中在“安全管理、定价收费、住宿预订”三类,未出现重大质量事件或群体性投诉。  \n- 各地抽样反馈:江西、福建、四川等省问卷满意度均≥85%;“某市”样本零重大事故、零滞留、投诉6件全部当日办结。\n\n五、省市亮点速览  \n- 河南:游客量、收入“双第一”,云台山、清明上河园连续多日满负荷。  \n- 湖南:增速最快,张家界、凤凰古城预约率98%,线上好评率93%。  \n- 新疆:自驾进疆车辆同比+38%,独库公路“堵”上热搜,但游客满意度仍达87%。  \n- 北京:市属公园游客量+25%,故宫、国家博物馆“一票难求”,无重大投诉。  \n- 四川:门票收入1.77亿元,同比+25.6%,三星堆新馆客流创新高,未发生安全事件。\n\n综上,2024年国庆全国旅游呈现“人气高、收入高、满意度高、运行稳、安全稳”的特征,各地供给丰富、保障有力,为全年假日市场画上圆满句号。'}

7.4 基于工具调用的Agent

基于 ReACT 架构的智能体会将 tools(工具描述)、agent_scratchpad(智能体草稿)、工具结果、推理等内容全部放到同一个 prompt 中,并通过提取 LLM 的规范输出来决定下一步的操作,这种模式会随着 LLM 输出的随机性,不同 LLM 性能的差异让程序变得异常脆弱。

而且 ReACT 架构早期设计之初是针对 LLM(文本补全模型)进行设计的,即传入一段话,让 LLM 补全其后续的文本,随着 LLM 的发展,消息设计更友好、结构化输出更稳定的函数调用、性能更强大的 ChatModel 发布了,可以考虑将 ReACT 迁移到基于聊天消息 + 工具调用的架构上,思想不变,但是使用更稳定的消息列表 + 工具调用。

迁移流程图如下:

在上述的工具调用智能体 Prompt 中,输出规范会通过检测 LLM 是输出文本内容还是工具调用参数来判断下一步是什么,这样性能更加稳定,而且对于绝大部分 LLM 来说,工具调用支持一次性调用生成多个工具的参数,性能会更强。

在 LangChain 中,其实也为基于工具调用的 Agent 封装了一个快速创建的方法 create_tool_calling_agent () 和预设 Prompt。

import os
import requests
import json
import dotenv
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_community.tools import GoogleSerperRun
from langchain_community.tools.openai_dalle_image_generation import OpenAIDALLEImageGenerationTool
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
from langchain_core.prompts import ChatPromptTemplate
from pydantic import Field, BaseModel
from langchain_core.tools import tool, Tool
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

@tool
def bocha_web_search_tool(query: str, count: int = 8) -> str:
    """
    使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。

    参数:
    - query: 搜索关键词
    - count: 返回的搜索结果数量

    返回:
    - 搜索结果的字符串形式
    """
    url = 'https://api.bochaai.com/v1/web-search'
    headers = {
        'Authorization': f'Bearer {os.getenv("BOCHA_API_KEY")}',  # 请替换为你的API密钥
        'Content-Type': 'application/json'
    }
    data = {
        "query": query,
        "freshness": "noLimit",  # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
        "summary": True,  # 是否返回长文本摘要总结
        "count": count
    }

    response = requests.post(url, headers=headers, json=data)

    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")

@tool
def baidu_qianfan_img_generate(query: str) -> str:
    """这是百度千帆的ai生成图片的工具。输出是图片的路径"""
    url = "https://qianfan.baidubce.com/v2/images/generations"
    payload = json.dumps({
        "prompt": query,
        "model": "irag-1.0"
    }, ensure_ascii=False)
    gaode_api_key = os.getenv("QIANFAN_API_KEY")
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {gaode_api_key}'
    }
    response = requests.request("POST", url, headers=headers, data=payload.encode("utf-8"))
    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")

class GoogleSerperArgsSchema(BaseModel):
    query: str = Field(description="执行谷歌搜索的查询语句")


class DallEArgsSchema(BaseModel):
    query: str = Field(description="输入应该是生成图像的文本提示(prompt)")

# 1. 创建博查查询工具
bocha_tool = Tool(
    name="BochaWebSearch",
    func=bocha_web_search_tool,
    description="使用Bocha Web Search API进行网络搜索",
    args_schema = GoogleSerperArgsSchema,
    api_wrapper = GoogleSerperAPIWrapper(),
)

# 2. 创建千帆文生图工具
qianfan_tool = Tool(
    name="QianfanImgGenerator",
    func=baidu_qianfan_img_generate,
    description="使用QIAN FAN irag-1.0生成图片",
    args_schema = DallEArgsSchema,
    # api_wrapper = GoogleSerperAPIWrapper(),
)

# 3.定义谷歌搜索工具
google_serper = GoogleSerperRun(
    name="google_serper",
    description=(
        "一个低成本的谷歌搜索API。"
        "当你需要回答有关时事的问题时,可以调用该工具。"
        "该工具的输入是搜索查询语句。"
    ),
    api_wrapper=GoogleSerperAPIWrapper(),
)

# 4. 定义OpenAI文生图工具
dalle = OpenAIDALLEImageGenerationTool(
    name="openai_dalle",
    api_wrapper=DallEAPIWrapper(model="dall-e-3"),
    # args_schema=DallEArgsSchema,
)
# tools = [google_serper, dalle]

tools = [bocha_tool, qianfan_tool]

# 2.定义工具调用agent提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是由OpenAI开发的聊天机器人,善于帮助用户解决问题。"),
    ("placeholder", "{chat_history}"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

# 3.创建大语言模型  这里还是moonshot 如果用OpenAI -> 模型改成 :gpt-4o-mini
llm = ChatOpenAI(model="kimi-k2-turbo-preview")

# 4.创建agent与agent执行者
agent = create_tool_calling_agent(
    prompt=prompt,
    llm=llm,
    tools=tools,
)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

print(agent_executor.invoke({"input": "帮我绘制一幅鲨鱼在天上游泳的场景"}))
7.4.1 测试输出:
> Entering new AgentExecutor chain...

Invoking: `QianfanImgGenerator` with `{'query': '鲨鱼在天上游泳,梦幻天空,云朵之间,巨大的鲨鱼在空中游动,阳光透过云层,超现实主义风格,色彩绚丽,想象力丰富'}`
responded: 我来为您生成一幅鲨鱼在天上游泳的奇幻场景。

{'id': 'as-p1ws33t4gj', 'created': 1759760306, 'data': [{'url': 'http://qianfan-modelbuilder-img-gen.bj.bcebos.com/irag-1.0/45fa340533c74beca0ee50f925fe6a8d/45fa340533c74beca0ee50f925fe6a8d/img-f88ab5b7-5768-404f-4a3b-a175fed9b2cf.png?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2025-10-06T14%3A18%3A41Z%2F86400%2Fhost%2F92a70b11d5d0fa95ff0204282d49436af7fb5bb74b856812c7da9ec6acc11c0e'}]}完成!我为您生成了一幅鲨鱼在天上游泳的奇幻场景。画面中展现了巨大的鲨鱼在梦幻般的天空中游动,穿梭于云朵之间,阳光透过云层洒下,营造出超现实主义的视觉效果。

您可以通过以下链接查看生成的图片:
http://qianfan-modelbuilder-img-gen.bj.bcebos.com/irag-1.0/45fa340533c74beca0ee50f925fe6a8d/45fa340533c74beca0ee50f925fe6a8d/img-f88ab5b7-5768-404f-4a3b-a175fed9b2cf.png?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2025-10-06T14%3A18%3A41Z%2F86400%2Fhost%2F92a70b11d5d0fa95ff0204282d49436af7fb5bb74b856812c7da9ec6acc11c0e

这幅图像捕捉了鲨鱼在天空中优雅游动的超现实场景,色彩绚丽,充满想象力!

> Finished chain.
{'input': '帮我绘制一幅鲨鱼在天上游泳的场景', 'output': '完成!我为您生成了一幅鲨鱼在天上游泳的奇幻场景。画面中展现了巨大的鲨鱼在梦幻般的天空中游动,穿梭于云朵之间,阳光透过云层洒下,营造出超现实主义的视觉效果。\n\n您可以通过以下链接查看生成的图片:\nhttp://qianfan-modelbuilder-img-gen.bj.bcebos.com/irag-1.0/45fa340533c74beca0ee50f925fe6a8d/45fa340533c74beca0ee50f925fe6a8d/img-f88ab5b7-5768-404f-4a3b-a175fed9b2cf.png?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2025-10-06T14%3A18%3A41Z%2F86400%2Fhost%2F92a70b11d5d0fa95ff0204282d49436af7fb5bb74b856812c7da9ec6acc11c0e\n\n这幅图像捕捉了鲨鱼在天空中优雅游动的超现实场景,色彩绚丽,充满想象力!'}

实际效果如下:

八. LangGraph的使用

        对比起langchain,LCEL表达式只能一条路走到黑,但实际的生产需求肯定是复杂的,需要有条件执行某些步骤,但LCEL表达式,对于之前步骤无法回溯,没法将多个Agent协同融合使用,且Agent和AgentExcutor是黑盒执行机制,执行过程无法外部干预,所以就有了LangGrah的诞生了。得回头重温数据结构的图了。

8.1 LangGraph 介绍与功能:

       LangGraph 是一个构建具有 状态、多角色 应用程序的库,用于创建智能体和多智能体工作流,与其他 LLM 框架相比,LangGraph 提供了以下核心优势:循环、可控制性和持久性。LangGraph 允许定义设计循环、条件判断的流程,这对于高级 Agent 非常重要,这和传统的有向无换图(DAG)解决方案区分开。因为 LangGraph 作为最底层的框架,所以涉及的组件都是最基础的,并没有过度封装,允许开发者实现对应用程序流程和状态的精细控制(自由度极高),而且 LangGraph 可以便捷集成持久化方案、任意节点中断交互、修改状态等特性,该框架虽然由 LangChain 团队构建,但是却可以在没有 LangChain 的情况下单独使用。对比 LCEL 表达式,LangGraph 的主要功能:

  • 循环和分支:在 LLM/Agent 应用程序中使用便捷的方式实现循环和条件语句,而无需配置额外的程序。
  • 持久化:在图的每个步骤之后自动保存状态,在运行的任意一个阶段都支持暂停和恢复图执行,以支持错误恢复、人机交互工作流、时间旅行等。
  • 人机交互:中断图的执行以批准或者编辑状态计划去执行下一计划。
  • 流支持:图结构的每个节点都支持流式输出(包括 token 流式输出)。
  • 与 Langchain 集成:LangGraph 可以和 LangChain 和 LangSmith 无缝集成。

在一个最基础 LangGraph 应用程序中,涵盖了 3 种基本组件:

  1. 状态:状态是图应用程序处理与交互的基础,是图中所有 节点 和 边 的输入,它可以是一个 dict(字典)或者 Pydantic 模型,在 LangGraph 中,状态包括 图的模式(数据结构)以及如何更新状态的 归纳函数,如果没有设置 归纳函数,则每次节点都会覆盖 状态的原始数据。
  2. 节点:节点通常是 Python 函数(同步或异步),其中节点函数的第一个参数是 state(状态),第二个参数是 config(Runnable 运行的配置),节点函数的返回值一般都是 状态,整个图的起点被称为开始节点,最后的终点被称为结束节点。
  3. :边在图中定义了路由逻辑,即不同节点之间是如何传递的,传递给谁,以及图节点从哪里开始,从哪里结束,并且一个节点可以设置多条边,如果有多条边,则下一条边连接的所有节点都会并行运行。

由于 LangGraph 是一个独立的框架,使用前必须先安装,命令如下:

pip install -U langgraph

8.2 LangGraph基础使用

from typing import TypedDict, Annotated, Any

import dotenv
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

dotenv.load_dotenv()
# openAI 用 gpt-4o-mini
llm = ChatOpenAI(model="kimi-k2-turbo-preview")


# 1.创建状态图,并使用GraphState作为状态数据
class State(TypedDict):
    """图结构的状态数据"""
    messages: Annotated[list, add_messages]
    use_name: str


def chatbot(state: State) -> Any:
    """聊天机器人节点,使用大语言模型根据传递的消息列表生成内容"""
    ai_message = llm.invoke(state["messages"])
    return {"messages": [ai_message], "use_name": "chatbot"}

# 1. 创建状态图,并使用GraphState作为状态数据
graph_builder = StateGraph(State)

# 2.添加节点
graph_builder.add_node("llm", chatbot)

# 3.添加边
graph_builder.add_edge(START, "llm")
graph_builder.add_edge("llm", END)

# 4.编译图为Runnable可运行组件
graph = graph_builder.compile()

# 5.调用图架构应用
print(graph.invoke({"messages": [("human", "你好,你是谁,我叫慕小课,我喜欢打篮球游泳")], "use_name": "graph"}))

测试输出:

{'messages': [HumanMessage(content='你好,你是谁,我叫慕小课,我喜欢打篮球游泳', additional_kwargs={}, response_metadata={}, id='8449810d-fefb-4eda-9888-3c55319d25f9'), AIMessage(content='你好,慕小课!很高兴认识你~  \n我叫 **Kimi**,是一个由月之暗面科技有限公司训练的大语言模型。虽然我不会打篮球也不会游泳,但我可以陪你聊篮球战术、分析比赛,或者帮你制定游泳训练计划!\n\n你喜欢哪个篮球明星?或者最近有没有哪场比赛特别精彩?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 64, 'prompt_tokens': 19, 'total_tokens': 83, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'kimi-k2-turbo-preview', 'system_fingerprint': None, 'id': 'chatcmpl-68e537776b15c54b73b920ca', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--d27e5cbb-b78b-4095-a917-ea6d9c71e599-0', usage_metadata={'input_tokens': 19, 'output_tokens': 64, 'total_tokens': 83, 'input_token_details': {}, 'output_token_details': {}})], 'use_name': 'chatbot'}

8.3 条件边与循环工具调用Agent

import os
from typing import TypedDict, Annotated, Any, Literal

import dotenv
import requests
import json
from langchain_community.tools import GoogleSerperRun
from langchain_community.tools.openai_dalle_image_generation import OpenAIDALLEImageGenerationTool
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
from pydantic import Field, BaseModel
from langchain_core.tools import tool, Tool
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langchain_core.messages import ToolMessage

dotenv.load_dotenv()


@tool
def bocha_web_search_tool(query: str, count: int = 8) -> str:
    """
    使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。

    参数:
    - query: 搜索关键词
    - count: 返回的搜索结果数量

    返回:
    - 搜索结果的字符串形式
    """
    url = 'https://api.bochaai.com/v1/web-search'
    headers = {
        'Authorization': f'Bearer {os.getenv("BOCHA_API_KEY")}',  # 请替换为你的API密钥
        'Content-Type': 'application/json'
    }
    data = {
        "query": query,
        "freshness": "noLimit",  # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
        "summary": True,  # 是否返回长文本摘要总结
        "count": count
    }

    response = requests.post(url, headers=headers, json=data)

    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")


@tool
def baidu_qianfan_img_generate(query: str) -> str:
    """这是百度千帆的ai生成图片的工具。输出是图片的路径"""
    url = "https://qianfan.baidubce.com/v2/images/generations"
    payload = json.dumps({
        "prompt": query,
        "model": "irag-1.0"
    }, ensure_ascii=False)
    gaode_api_key = os.getenv("QIANFAN_API_KEY")
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {gaode_api_key}'
    }
    response = requests.request("POST", url, headers=headers, data=payload.encode("utf-8"))
    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")


class GoogleSerperArgsSchema(BaseModel):
    query: str = Field(description="执行谷歌搜索的查询语句")


class DallEArgsSchema(BaseModel):
    query: str = Field(description="输入应该是生成图像的文本提示(prompt)")


# 1. 创建博查查询工具
bocha_tool = Tool(
    name="BochaWebSearch",
    func=bocha_web_search_tool,
    description="使用Bocha Web Search API进行网络搜索",
    args_schema=GoogleSerperArgsSchema,
    api_wrapper=GoogleSerperAPIWrapper(),
)

# 2. 创建千帆文生图工具
qianfan_tool = Tool(
    name="QianfanImgGenerator",
    func=baidu_qianfan_img_generate,
    description="使用QIAN FAN irag-1.0生成图片",
    args_schema=DallEArgsSchema,
    # api_wrapper = GoogleSerperAPIWrapper(),
)

# 3.定义谷歌搜索工具
google_serper = GoogleSerperRun(
    name="google_serper",
    description=(
        "一个低成本的谷歌搜索API。"
        "当你需要回答有关时事的问题时,可以调用该工具。"
        "该工具的输入是搜索查询语句。"
    ),
    api_wrapper=GoogleSerperAPIWrapper(),
)

# 4. 定义OpenAI文生图工具
dalle = OpenAIDALLEImageGenerationTool(
    name="openai_dalle",
    api_wrapper=DallEAPIWrapper(model="dall-e-3"),
    # args_schema=DallEArgsSchema,
)


class State(TypedDict):
    """图状态的数据结构,类型为字典"""
    messages: Annotated[list, add_messages]


tools = [bocha_tool, qianfan_tool]

# 有钱请上 model="dall-e-3"
llm = ChatOpenAI(model="kimi-k2-turbo-preview")
llm_with_tools = llm.bind_tools(tools)


def chatbot(state: State) -> Any:
    """聊天机器人函数"""
    # 1. 获取状态里存储的消息列表数据并传递给LLM
    ai_message = llm_with_tools.invoke(state["messages"])
    # 2. 返回更新/生成的状态
    return {"messages": [ai_message]}


def tool_executor(state: State) -> Any:
    """工具执行节点"""
    # 1. 提取数据状态中的tool_calls
    too_calls = state["messages"][-1].tool_calls

    # 2. 根据找到的tool_calls去获取需要执行什么工具
    tools_by_name = {tool.name: tool for tool in tools}
    # 3. 执行工具得到对应的结果
    messages = []
    for tool_call in too_calls:
        tool = tools_by_name[tool_call["name"]]
        tool.invoke(tool_call["args"])
        messages.append(ToolMessage(
            tool_call_id=tool_call["id"],
            content=json.dumps(tool.invoke(tool_call["args"])),
            name=tool_call["name"],
        ))

    # 4. 将工具的执行结果作为工具消息  新到数据状态机中
    return {"messages": messages}


def route(state: State) -> Literal["tool_executor", "__end__"]:
    """通过路由检测返回的节点,返回的节点有两个,一个工具执行,一个结束节点"""
    ai_message = state["messages"][-1]
    if hasattr(ai_message, "tool_calls") and len(ai_message.tool_calls) > 0:
        return "tool_executor"
    return "__end__"


################
# 1. 创建状态图, 并使用GrathState作为状态数据
graph_builder = StateGraph(State)

# 2. 添加节点
graph_builder.add_node("llm", chatbot)
graph_builder.add_node("tool_executor", tool_executor)

# 3. 添加边
graph_builder.set_entry_point("llm")
graph_builder.add_conditional_edges("llm", route)
graph_builder.add_edge("tool_executor", "llm")

# 4. 编译图为Runnable可运行组件
graph = graph_builder.compile()

# 5. 调用图架构应用
state = graph.invoke({"messages": [("human", "2024年北京半程马拉松的前三名成绩是多少? ")]})

for message in state["messages"]:
    print("消息类型:", message.type)
    if hasattr(message, "tool_calls") and len(message.tool_calls) > 0:
        print("工具调用参数", message.tool_calls)
    print("消息内容", message.content)
    print("==============================================")

输出测试:

消息类型: human
消息内容 2024年北京半程马拉松的前三名成绩是多少? 
==============================================
消息类型: ai
工具调用参数 [{'name': 'BochaWebSearch', 'args': {'query': '2024年北京半程马拉松前三名成绩'}, 'id': 'BochaWebSearch:0', 'type': 'tool_call'}]
消息内容 我来帮您查询2024年北京半程马拉松前三名的成绩信息。
==============================================
消息类型: tool
消息内容 "{'code': 200, 'log_id': 'faf7d169cba439f3', 'msg': None, 'data': {'_type': 'SearchResponse', 'queryContext': {'originalQuery': '2024\u5e74\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u524d\u4e09\u540d\u6210\u7ee9'}, 'webPages': {'webSearchUrl': 'https://bochaai.com/search?q=2024\u5e74\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u524d\u4e09\u540d\u6210\u7ee9', 'totalEstimatedMatches': 10000000, 'value': [{'id': 'https://api.bochaai.com/v1/#WebPages.0', 'name': '\u6700\u65b02024\u5317\u4eac\u534a\u9a6c\u6210\u7ee9\u516c\u793a_\u817e\u8baf\u65b0\u95fb', 'url': 'https://new.qq.com/rain/a/20240426A00GI200', 'displayUrl': 'https://new.qq.com/rain/a/20240426A00GI200', 'snippet': '+\u5173\u6ce80\u8bc4\u8bba\u6536\u85cf\u5206\u4eab\u590d\u5236\u94fe\u63a5\u5fae\u4fe1\u597d\u53cb\u7528\u5fae\u4fe1\u626b\u63cf\u4e8c\u7ef4\u7801QQ\u597d\u53cb\u7528QQ\u626b\u63cf\u4e8c\u7ef4\u7801\u624b\u673a\u770b\u5fae\u4fe1\u626b\u4e00\u626b,\u968f\u65f6\u968f\u5730\u770b\u95ee\u65b0\u95fb\u59b9 \u6700\u65b02024\u5317\u4eac\u534a\u9a6c\u6210\u7ee9\u516c\u793a\u770b\u9f50\u65b0\u95fb2024-04-26 06:29\u53d1\u5e03\u4e8e\u9ed1\u9f99\u6c5f\u9f50\u9f50\u54c8', 'summary': '+\u5173\u6ce80\u8bc4\u8bba\u6536\u85cf\u5206\u4eab\u590d\u5236\u94fe\u63a5\u5fae\u4fe1\u597d\u53cb\u7528\u5fae\u4fe1\u626b\u63cf\u4e8c\u7ef4\u7801QQ\u597d\u53cb\u7528QQ\u626b\u63cf\u4e8c\u7ef4\u7801\u624b\u673a\u770b\u5fae\u4fe1\u626b\u4e00\u626b,\u968f\u65f6\u968f\u5730\u770b\u95ee\u65b0\u95fb\u59b9 \u6700\u65b02024\u5317\u4eac\u534a\u9a6c\u6210\u7ee9\u516c\u793a\u770b\u9f50\u65b0\u95fb2024-04-26 06:29\u53d1\u5e03\u4e8e\u9ed1\u9f99\u6c5f\u9f50\u9f50\u54c8\u5c14\u5e02\u878d\u5a92\u4f53\u4e2d\u5fc3\u5b98\u65b9\u8d26\u53f7+\u5173\u6ce84\u670825\u65e5\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9 \u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00 \u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00 \u6765\u6e90 | \u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9\u67e5\u770b\u539f\u56fe 315K \u514d\u8d23\u58f0\u660e:\u672c\u5185\u5bb9\u6765\u81ea\u817e\u8baf\u5e73\u53f0\u521b\u4f5c\u8005,\u4e0d\u4ee3\u8868\u817e\u8baf\u65b0\u95fb\u6216\u817e\u8baf\u7f51\u7684\u89c2\u70b9\u548c\u7acb\u573a\u3002\u4e3e\u62a5 \u5357\u4eac\u5728\u804c\u7855\u58eb=2\u5e74\u5236+\u5b66\u8d397980\u5143(\u65e0\u9700\u5230\u6821)+(\u5b66\u5386+\u5b66\u4f4d)\u5e7f\u544a\u53cc\u8bc1\u7814\u7a76\u751f-\u6674\u8f89\u4e86\u89e3\u8be6\u60c5', 'siteName': '\u817e\u8baf\u7f51', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://new.qq.com/rain/a/20240426A00GI200', 'datePublished': '2024-04-26T06:29:00+08:00', 'dateLastCrawled': '2024-04-26T06:29:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.1', 'name': '2024\u5317\u4eac\u534a\u9a6c\u6210\u7ee9\u516c\u793a!\u7537\u5973\u7ec4\u524d8\u540d\u2014\u2014_\u516c\u4f17_\u7537\u5b50_\u5973\u5b50\u7ec4', 'url': 'https://www.sohu.com/a/774256772_121124607', 'displayUrl': 'https://www.sohu.com/a/774256772_121124607', 'snippet': '\u5feb!\u5173\u6ce8\u9996\u90fd\u7ecf\u6d4e\u62a5\u9053\u516c\u4f17\u53f7,\u4e00\u8d77\u770b\u65b0\u95fb! 4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9,\u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00\u3002\u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00\u3002 \u514d\u8d23\u58f0\u660e:\u6240\u8f7d\u5185\u5bb9\u6765\u6e90\u4e92\u8054\u7f51\u3001\u5fae\u4fe1\u516c\u4f17\u53f7\u7b49\u516c\u5f00\u6e20\u9053,\u6211\u4eec\u5bf9\u6587\u4e2d\u89c2', 'summary': '\u5feb!\u5173\u6ce8\u9996\u90fd\u7ecf\u6d4e\u62a5\u9053\u516c\u4f17\u53f7,\u4e00\u8d77\u770b\u65b0\u95fb! 4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9,\u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00\u3002\u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00\u3002 \u514d\u8d23\u58f0\u660e:\u6240\u8f7d\u5185\u5bb9\u6765\u6e90\u4e92\u8054\u7f51\u3001\u5fae\u4fe1\u516c\u4f17\u53f7\u7b49\u516c\u5f00\u6e20\u9053,\u6211\u4eec\u5bf9\u6587\u4e2d\u89c2\u70b9 \u4fdd\u6301\u4e2d\u7acb,\u4ec5\u4f9b\u53c2\u8003\u3001\u4ea4\u6d41\u7b49\u975e\u5546\u4e1a\u76ee\u7684\u3002\u8f6c\u8f7d\u7684\u7a3f\u4ef6\u548c\u56fe\u7247\u7248\u6743\u5f52\u539f\u4f5c\u8005\u548c\u673a\u6784\u6240\u6709,\u5982\u6709\u4fb5\u6743,\u8bf7\u8054\u7cfb\u6211\u4eec\u5220\u9664\u3002 sdjjbdwx \u9996\u90fd\u7ecf\u6d4e\u62a5\u9053 \u8fd4\u56de\u641c\u72d0,\u67e5\u770b\u66f4\u591a', 'siteName': '\u641c\u72d0', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.sohu.com/a/774256772_121124607', 'datePublished': '2024-04-25T17:29:00+08:00', 'dateLastCrawled': '2024-04-25T17:29:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.2', 'name': '2024\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7537\u5973\u7ec4\u524d8\u540d\u6210\u7ee9\u516c\u793a_\u4eac\u62a5\u7f51', 'url': 'https://news.bjd.com.cn/2024/04/25/10756390.shtml', 'displayUrl': 'https://news.bjd.com.cn/2024/04/25/10756390.shtml', 'snippet': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9\u3002 \u5982\u9047\u4f5c\u54c1\u5185\u5bb9\u3001\u7248\u6743\u7b49\u95ee\u9898,\u8bf7\u5728\u76f8\u5173\u6587\u7ae0\u520a\u53d1\u4e4b\u65e5\u8d7730\u65e5\u5185\u4e0e\u672c\u7f51\u8054\u7cfb\u3002\u7248\u6743\u4fb5\u6743\u8054\u7cfb\u7535\u8bdd:010-85202353', 'summary': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9\u3002 \u5982\u9047\u4f5c\u54c1\u5185\u5bb9\u3001\u7248\u6743\u7b49\u95ee\u9898,\u8bf7\u5728\u76f8\u5173\u6587\u7ae0\u520a\u53d1\u4e4b\u65e5\u8d7730\u65e5\u5185\u4e0e\u672c\u7f51\u8054\u7cfb\u3002\u7248\u6743\u4fb5\u6743\u8054\u7cfb\u7535\u8bdd:010-85202353', 'siteName': '\u4eac\u62a5\u7f51', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://news.bjd.com.cn/2024/04/25/10756390.shtml', 'datePublished': '2024-04-25T14:52:00+08:00', 'dateLastCrawled': '2024-04-25T14:52:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.3', 'name': '2024\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7537\u5973\u7ec4\u524d8\u540d\u6210\u7ee9\u516c\u793a', 'url': 'https://m.toutiao.com/article/7361694085092000283/', 'displayUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'snippet': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9,\u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00\u3002\u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00\u3002\\n(\u6765\u6e90:\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9)\\n\u66f4\u591a\u7cbe\u5f69\u8d44\u8baf\u8bf7\u5728\u5e94\u7528\u5e02\u573a\u4e0b\u8f7d\u201c\u6781\u76ee\u65b0\u95fb\u201d\u5ba2\u6237\u7aef,\u672a\u7ecf\u6388\u6743\u8bf7\u52ff\u8f6c\u8f7d,\u6b22\u8fce\u63d0\u4f9b\u65b0', 'summary': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9,\u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00\u3002\u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00\u3002\\n(\u6765\u6e90:\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9)\\n\u66f4\u591a\u7cbe\u5f69\u8d44\u8baf\u8bf7\u5728\u5e94\u7528\u5e02\u573a\u4e0b\u8f7d\u201c\u6781\u76ee\u65b0\u95fb\u201d\u5ba2\u6237\u7aef,\u672a\u7ecf\u6388\u6743\u8bf7\u52ff\u8f6c\u8f7d,\u6b22\u8fce\u63d0\u4f9b\u65b0\u95fb\u7ebf\u7d22,\u4e00\u7ecf\u91c7\u7eb3\u5373\u4ed8\u62a5\u916c\u300224\u5c0f\u65f6\u62a5\u6599\u70ed\u7ebf027-86777777\u3002', 'siteName': '\u4eca\u65e5\u5934\u6761', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.toutiao.com/article/7361694085092000283/', 'datePublished': '2024-04-25T22:52:00+08:00', 'dateLastCrawled': '2024-04-25T22:52:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.4', 'name': '2024\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\uff1a\u4e2d\u56fd\u9009\u624b\u5218\u654f\u83b7\u5f97\u5973\u5b50\u7ec4\u51a0\u519b', 'url': 'https://www.chinanews.com.cn/tp/hd2011/2024/04-14/1103597.shtml', 'displayUrl': 'https://www.chinanews.com.cn/tp/hd2011/2024/04-14/1103597.shtml', 'snippet': '4\u670814\u65e5,2024\u5e74\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u8d5b\u4e3e\u884c\u3002\u5728\u5973\u5b50\u7ec4\u6bd4\u8d5b\u4e2d,\u4e2d\u56fd\u9009\u624b\u5305\u63fd\u524d\u4e09\u540d\u3002\u5218\u654f(\u4e2d)\u4ee51\u5c0f\u65f611\u520612\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u51a0\u519b,\u674e\u6625\u971e(\u5de6)\u4ee51\u5c0f\u65f613\u520628\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u4e9a\u519b,\u9648\u4e3a\u82ac(\u53f3)\u4ee51\u5c0f\u65f614\u5206', 'summary': '4\u670814\u65e5,2024\u5e74\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u8d5b\u4e3e\u884c\u3002\u5728\u5973\u5b50\u7ec4\u6bd4\u8d5b\u4e2d,\u4e2d\u56fd\u9009\u624b\u5305\u63fd\u524d\u4e09\u540d\u3002\u5218\u654f(\u4e2d)\u4ee51\u5c0f\u65f611\u520612\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u51a0\u519b,\u674e\u6625\u971e(\u5de6)\u4ee51\u5c0f\u65f613\u520628\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u4e9a\u519b,\u9648\u4e3a\u82ac(\u53f3)\u4ee51\u5c0f\u65f614\u520620\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u5b63\u519b\u3002', 'siteName': '\u4e2d\u56fd\u65b0\u95fb\u7f51', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.chinanews.com.cn/tp/hd2011/2024/04-14/1103597.shtml', 'datePublished': '2024-04-14T20:53:31+08:00', 'dateLastCrawled': '2024-04-14T20:53:31Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.5', 'name': '2024\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e:\u4e2d\u56fd\u9009\u624b\u5218\u654f\u83b7\u5f97\u5973\u5b50\u7ec4\u51a0\u519b-\u4e2d\u65b0\u7f51', 'url': 'https://www.chinanews.com/tp/hd2011/2024/04-14/1103597.shtml', 'displayUrl': 'https://www.chinanews.com/tp/hd2011/2024/04-14/1103597.shtml', 'snippet': '4\u670814\u65e5,2024\u5e74\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u8d5b\u4e3e\u884c\u3002\u5728\u5973\u5b50\u7ec4\u6bd4\u8d5b\u4e2d,\u4e2d\u56fd\u9009\u624b\u5305\u63fd\u524d\u4e09\u540d\u3002\u5218\u654f(\u4e2d)\u4ee51\u5c0f\u65f611\u520612\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u51a0\u519b,\u674e\u6625\u971e(\u5de6)\u4ee51\u5c0f\u65f613\u520628\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u4e9a\u519b,\u9648\u4e3a\u82ac(\u53f3)\u4ee51\u5c0f\u65f614\u5206', 'summary': '4\u670814\u65e5,2024\u5e74\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u8d5b\u4e3e\u884c\u3002\u5728\u5973\u5b50\u7ec4\u6bd4\u8d5b\u4e2d,\u4e2d\u56fd\u9009\u624b\u5305\u63fd\u524d\u4e09\u540d\u3002\u5218\u654f(\u4e2d)\u4ee51\u5c0f\u65f611\u520612\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u51a0\u519b,\u674e\u6625\u971e(\u5de6)\u4ee51\u5c0f\u65f613\u520628\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u4e9a\u519b,\u9648\u4e3a\u82ac(\u53f3)\u4ee51\u5c0f\u65f614\u520620\u79d2\u7684\u6210\u7ee9\u83b7\u5f97\u5b63\u519b\u3002 \u3010\u7f16\u8f91:\u674e\u592a\u6e90\u3011', 'siteName': '\u4e2d\u56fd\u65b0\u95fb\u7f51', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://www.chinanews.com/tp/hd2011/2024/04-14/1103597.shtml', 'datePublished': '2024-04-14T12:53:31+08:00', 'dateLastCrawled': '2024-04-14T12:53:31Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.6', 'name': '2024\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7537\u5973\u7ec4\u524d8\u540d\u6210\u7ee9\u516c\u793a', 'url': 'https://m.sohu.com/a/774202072_121284943/?pvid=000115_3w_a', 'displayUrl': 'https://m.sohu.com/a/774202072_121284943/?pvid=000115_3w_a', 'snippet': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9,\u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00\u3002\u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00\u3002\\n(\u6765\u6e90:\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9)', 'summary': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9,\u674e\u6625\u6656\u4e3a\u7537\u5b50\u7ec4\u7b2c\u4e00\u3002\u5218\u654f\u4e3a\u5973\u5b50\u7ec4\u7b2c\u4e00\u3002\\n(\u6765\u6e90:\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9)', 'siteName': '\u624b\u673a\u641c\u72d0\u7f51', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://m.sohu.com/a/774202072_121284943/?pvid=000115_3w_a', 'datePublished': '2024-04-25T22:51:00+08:00', 'dateLastCrawled': '2024-04-25T22:51:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}, {'id': 'https://api.bochaai.com/v1/#WebPages.7', 'name': '2024\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7537\u5973\u7ec4\u524d8\u540d\u6210\u7ee9\u516c\u793a', 'url': 'https://k.sina.cn/article_1893892941_70e2834d02001ina6.html', 'displayUrl': 'https://k.sina.cn/article_1893892941_70e2834d02001ina6.html', 'snippet': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9\u3002\\n  \u6765\u6e90 \u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9\\n  \u7f16\u8f91 \u80e1\u5fb7\u6210\\n  \u6d41\u7a0b\u7f16\u8f91 \u9a6c\u6653\u53cc', 'summary': '4\u670825\u65e5,\u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u516c\u793a\u7537\u5b50\u53ca\u5973\u5b50\u7ec4\u524d8\u540d\u6210\u7ee9\u3002\\n  \u6765\u6e90 \u5317\u4eac\u534a\u7a0b\u9a6c\u62c9\u677e\u7f51\u7ad9\\n  \u7f16\u8f91 \u80e1\u5fb7\u6210\\n  \u6d41\u7a0b\u7f16\u8f91 \u9a6c\u6653\u53cc', 'siteName': '\u65b0\u6d6a\u770b\u70b9', 'siteIcon': 'https://th.bochaai.com/favicon?domain_url=https://k.sina.cn/article_1893892941_70e2834d02001ina6.html', 'datePublished': '2024-04-25T08:00:00+08:00', 'dateLastCrawled': '2024-04-25T08:00:00Z', 'cachedPageUrl': None, 'language': None, 'isFamilyFriendly': None, 'isNavigational': None}], 'someResultsRemoved': True}, 'images': {'id': None, 'readLink': None, 'webSearchUrl': None, 'value': [{'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://q6.itc.cn/q_70/images03/20240425/d9fe7decfc7f4bf4b4431036b4fb88b2.jpeg', 'datePublished': None, 'contentUrl': 'https://q6.itc.cn/q_70/images03/20240425/d9fe7decfc7f4bf4b4431036b4fb88b2.jpeg', 'hostPageUrl': 'https://www.sohu.com/a/774256772_121124607', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.sohu.com/a/774256772_121124607', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://img1.bjd.com.cn/2024/04/25/18bb0cc50b6d4810ec62d912ceb087a930b3f867.png', 'datePublished': None, 'contentUrl': 'https://img1.bjd.com.cn/2024/04/25/18bb0cc50b6d4810ec62d912ceb087a930b3f867.png', 'hostPageUrl': 'https://news.bjd.com.cn/2024/04/25/10756390.shtml', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://news.bjd.com.cn/2024/04/25/10756390.shtml', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/67b7ab88eec247318a9ba26a82476ec0~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1738756333&x-signature=LfO3FUbmTOvZ0fiXx7Zftx1Vfno%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/67b7ab88eec247318a9ba26a82476ec0~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1738756333&x-signature=LfO3FUbmTOvZ0fiXx7Zftx1Vfno%3D', 'hostPageUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'width': 700, 'height': 549, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/7caad05cbceacfb9af28d3636472675d~tplv-tt-cs0:1280:720.jpg?_iz=31826&bid=11&from=article.headline&gid=7464985474399011354&lk3s=06827d14&x-expires=1740743533&x-signature=TQZAJF2BJCSHQytnHOTBTVusIsg%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/7caad05cbceacfb9af28d3636472675d~tplv-tt-cs0:1280:720.jpg?_iz=31826&bid=11&from=article.headline&gid=7464985474399011354&lk3s=06827d14&x-expires=1740743533&x-signature=TQZAJF2BJCSHQytnHOTBTVusIsg%3D', 'hostPageUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'width': 1280, 'height': 720, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/8832a860f99eee4094b4b508d58af7ac~tplv-tt-cs0:720:1280.jpg?_iz=31826&bid=11&from=article.headline&gid=7465159156996080168&lk3s=06827d14&x-expires=1740743533&x-signature=dg55BxhPwf%2F%2FBcYu5Jq2PrRo6r8%3D', 'datePublished': None, 'contentUrl': 'https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/8832a860f99eee4094b4b508d58af7ac~tplv-tt-cs0:720:1280.jpg?_iz=31826&bid=11&from=article.headline&gid=7465159156996080168&lk3s=06827d14&x-expires=1740743533&x-signature=dg55BxhPwf%2F%2FBcYu5Jq2PrRo6r8%3D', 'hostPageUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://m.toutiao.com/article/7361694085092000283/', 'width': 720, 'height': 1280, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'https://i2.chinanews.com.cn/simg/hd/2024/04/14/fc094d799bc44d8b961639e841617f36.jpg', 'datePublished': None, 'contentUrl': 'https://i2.chinanews.com.cn/simg/hd/2024/04/14/fc094d799bc44d8b961639e841617f36.jpg', 'hostPageUrl': 'https://www.chinanews.com/tp/hd2011/2024/04-14/1103597.shtml', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://www.chinanews.com/tp/hd2011/2024/04-14/1103597.shtml', 'width': 0, 'height': 0, 'thumbnail': None}, {'webSearchUrl': None, 'name': None, 'thumbnailUrl': 'http://n.sinaimg.cn/sinakd20240425s/269/w700h369/20240425/e27c-bca49b967cb534be8f81c127f8e3871b.jpg', 'datePublished': None, 'contentUrl': 'http://n.sinaimg.cn/sinakd20240425s/269/w700h369/20240425/e27c-bca49b967cb534be8f81c127f8e3871b.jpg', 'hostPageUrl': 'https://k.sina.cn/article_1893892941_70e2834d02001ina6.html', 'contentSize': None, 'encodingFormat': None, 'hostPageDisplayUrl': 'https://k.sina.cn/article_1893892941_70e2834d02001ina6.html', 'width': 0, 'height': 0, 'thumbnail': None}], 'isFamilyFriendly': None}, 'videos': None}}"
==============================================
消息类型: ai
消息内容 根据搜索结果,我了解到2024年北京半程马拉松的前三名信息如下:

**男子组前三名:**
1. 李春晖 - 第一名
2. 具体成绩未在搜索结果中显示
3. 具体成绩未在搜索结果中显示

**女子组前三名:**
1. 刘敏 - 第一名,成绩为1小时11分12秒
2. 李春霞 - 第二名,成绩为1小时13分28秒
3. 陈为芬 - 第三名,成绩为1小时14分20秒

很抱歉,搜索结果中只提供了女子组的详细成绩,男子组的具体成绩信息没有显示。如果您需要更详细的成绩信息,建议查看北京半程马拉松的官方网站或相关体育新闻报道。
==============================================

8.4  条件边与循环工具调用Agent-并行节点

from typing import Any

from langchain_core.messages import AIMessage, HumanMessage
from langgraph.graph.message import StateGraph, MessagesState

graph_builder = StateGraph(MessagesState)


def chatbot(state: MessagesState, config: dict) -> Any:
    return {"messages": [AIMessage(content="你好,我是OpenAI开发的聊天机器人")]}


def parallel1(state: MessagesState, config: dict) -> Any:
    print("并行1: ", state)
    return {"messages": [HumanMessage(content="这是并行1函数")]}


def parallel2(state: MessagesState, config: dict) -> Any:
    print("并行2: ", state)
    return {"messages": [HumanMessage(content="这是并行2函数")]}


def chat_end(state: MessagesState, config: dict) -> Any:
    print("聊天结束: ", state)
    return {"messages": [HumanMessage(content="这是聊天结束函数")]}


graph_builder.add_node("chat_bot", chatbot)
graph_builder.add_node("parallel1", parallel1)
graph_builder.add_node("parallel2", parallel2)
graph_builder.add_node("chat_end", chat_end)

graph_builder.set_entry_point("chat_bot")
graph_builder.set_finish_point("chat_end")
graph_builder.add_edge("chat_bot", "parallel1")
graph_builder.add_edge("chat_bot", "parallel2")
graph_builder.add_edge("parallel2", "chat_end")

graph = graph_builder.compile()

print(graph.invoke({"messages": [HumanMessage(content="你好,你是")]}))

输出结果:

并行1:  {'messages': [HumanMessage(content='你好,你是', additional_kwargs={}, response_metadata={}, id='99f950bc-2271-4aba-b01e-31432b468bc9'), AIMessage(content='你好,我是OpenAI开发的聊天机器人', additional_kwargs={}, response_metadata={}, id='6a7288bb-f009-4c3c-bcbb-b555d7ba81bb')]}
并行2:  {'messages': [HumanMessage(content='你好,你是', additional_kwargs={}, response_metadata={}, id='99f950bc-2271-4aba-b01e-31432b468bc9'), AIMessage(content='你好,我是OpenAI开发的聊天机器人', additional_kwargs={}, response_metadata={}, id='6a7288bb-f009-4c3c-bcbb-b555d7ba81bb')]}
聊天结束:  {'messages': [HumanMessage(content='你好,你是', additional_kwargs={}, response_metadata={}, id='99f950bc-2271-4aba-b01e-31432b468bc9'), AIMessage(content='你好,我是OpenAI开发的聊天机器人', additional_kwargs={}, response_metadata={}, id='6a7288bb-f009-4c3c-bcbb-b555d7ba81bb'), HumanMessage(content='这是并行1函数', additional_kwargs={}, response_metadata={}, id='bc0cc573-dda8-4635-bd2a-5fa8862b243d'), HumanMessage(content='这是并行2函数', additional_kwargs={}, response_metadata={}, id='544a1f92-5897-4cc2-8f9b-43fe385fdba4')]}
{'messages': [HumanMessage(content='你好,你是', additional_kwargs={}, response_metadata={}, id='99f950bc-2271-4aba-b01e-31432b468bc9'), AIMessage(content='你好,我是OpenAI开发的聊天机器人', additional_kwargs={}, response_metadata={}, id='6a7288bb-f009-4c3c-bcbb-b555d7ba81bb'), HumanMessage(content='这是并行1函数', additional_kwargs={}, response_metadata={}, id='bc0cc573-dda8-4635-bd2a-5fa8862b243d'), HumanMessage(content='这是并行2函数', additional_kwargs={}, response_metadata={}, id='544a1f92-5897-4cc2-8f9b-43fe385fdba4'), HumanMessage(content='这是聊天结束函数', additional_kwargs={}, response_metadata={}, id='8f12c6ff-c728-4c7d-89da-ac0bd83e60c7')]}

Logo

更多推荐