From 159c4efd99a28d06162b8e1daf30f1db78c5b4eb Mon Sep 17 00:00:00 2001 From: Element <2401926342@qq.com> Date: Wed, 20 Aug 2025 20:10:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Element <2401926342@qq.com> --- configuration.py | 64 +++++++++++++++++++++ prompts.py | 142 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 configuration.py create mode 100644 prompts.py diff --git a/configuration.py b/configuration.py new file mode 100644 index 0000000..83e9fae --- /dev/null +++ b/configuration.py @@ -0,0 +1,64 @@ +import os +from enum import Enum +from dataclasses import dataclass, fields +from typing import Any, Optional, Dict +from pydantic import BaseModel, Field +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.runnables import RunnableConfig +from dataclasses import dataclass + + + +class SearchAPI(Enum): + PERPLEXITY = "perplexity" + TAVILY = "tavily" + EXA = "exa" + ARXIV = "arxiv" + PUBMED = "pubmed" + LINKUP = "linkup" + DUCKDUCKGO = "duckduckgo" + GOOGLESEARCH = "googlesearch" + + +@dataclass(kw_only=True) +class Configuration: + """The configurable fields for the chatbot.""" + number_of_queries: int = 2 # 每次迭代生成几个查询 + planner_provider: str = "deepseek" + planner_model: str = "deepseek-chat" + writer_provider: str = "deepseek" + writer_model: str = "deepseek-chat" + search_api: SearchAPI = SearchAPI.TAVILY + search_api_config: Optional[Dict[str, Any]] = None + max_tokens : 4000 + + + + + @classmethod + def from_runnable_config( + cls, config: Optional[RunnableConfig] = None + ) -> "Configuration": + """Create a Configuration instance from a RunnableConfig.""" + configurable = ( + config["configurable"] if config and "configurable" in config else {} + ) + values: dict[str, Any] = { + f.name: os.environ.get(f.name.upper(), configurable.get(f.name)) + for f in fields(cls) + if f.init + } + return cls(**{k: v for k, v in values.items() if v}) + + + + +class BaseConfiguration(BaseModel): + number_of_queries: int = Field(default=2, description="每次迭代生成几个查询") + planner_provider: str = Field(default="deepseek") + planner_model: str = Field(default="deepseek-reasoner") + writer_provider: str = Field(default="deepseek") + writer_model: str = Field(default="deepseek-chat") + search_api: SearchAPI = Field(default=SearchAPI.TAVILY) + search_api_config: Optional[Dict[str, Any]] = Field(default=None) + search_max_len: int = Field(default=20000, description="搜索结果最大字符数") diff --git a/prompts.py b/prompts.py new file mode 100644 index 0000000..0d33a59 --- /dev/null +++ b/prompts.py @@ -0,0 +1,142 @@ +thinking_process = """ +你还需要输出自己的思考过程,即是怎么推理出自己要查询的内容的,这些推理可以源于你的知识或者目前的主题或章节内容。以下为思考过程模式: +- 首先你需要表明自己是根据哪些目前已有的内容,比如已写的章节(若还没开始写则是大纲),目前章节的大致内容。这部分在100字以下 +- 然后你需要思考并推理自己下一步的信息搜索方向。 +# 示例(示例主题为:多智能体强化学习在社会科学模拟实验中应用于劳动力市场研究) + +### 初步探索方向 +我正在思考如何开始这项关于多智能体强化学习在社会科学模拟实验中应用于劳动力市场研究的报告。我的初步想法是先进行一次广泛的搜索,查找关于“多智能体强化学习”在“社会科学模拟”方面的英文研究报告。我将重点关注像arXiv、JAIR这样的知名学术平台以及AAMAS和NeurIPS等重要会议的论文。 +### 下一步行动计划 +接下来,我将缩小搜索范围,专门寻找将多智能体强化学习应用于建模和模拟“劳动力市场”、“就业”或“工资”的研究。我仍然会优先考虑学术资源。然后,我会继续探索多智能体强化学习在劳动力市场相关的社会科学实验中的潜力。 +""" + +report_planner_query_writer_instructions = """ +# 设定 +你是一个专业的查询编写者,专门根据主题来生成网络查询文本,以尽可能准确高效地搜索到相关结果。 + +# 主题 +{topic} + + +# 任务 +您的目标是生成 **{number_of_queries}** 个网络搜索查询,为大纲部分收集信息,查询需要与大纲高度相关。 +请确保查询足够具体,以便找到高质量、相关的来源,同时覆盖报告结构所需的广度。 +"""+thinking_process + + +report_planner_instructions = """ +# 设定 +你是一个专业的报告大纲编写者,专门生成合理,覆盖面广,逻辑清晰的报告大纲 + +# 主题 +{topic} + +# 上下文 +以下是一些有用的上下文信息: +{context} + +# 任务 +生成报告的章节列表,您的大纲应紧凑且聚焦,避免重复章节或不必要的填充内容。若用户已提供大纲,则基于用户标准进行适当修改。 + +# 提示 +- 在主要主题章节中包含示例和实现细节,而不是单独列为章节 +- 确保每个章节都有明确的目的,且没有内容重叠 +- 合并相关概念,而不是将它们分开 +- 整体报告结构需要合理,符合类似学术论文规范,例如包括引言,正文内容,结论等。 +在提交之前,请检查您的结构,确保没有冗余章节,并遵循逻辑流程。 + +# 包含的字段: +- 名称(name):章节的标题,应简洁明了地概括本章节的主题或主旨。 +- 描述(description):简要说明这一章节将围绕哪些内容进行展开,字数在50-100字。描述应突出章节的写作重点,明确要讨论的问题、角度或结构。。 +- 是否需要研究(research):判断该章节的写作是否需要进行网络搜索。若该部分需要引用外部资料、数据、案例或是知识储备不足以独立完成,则应标记为需要研究。 +- 内容(content):章节的主要写作内容。暂时留空,后续将用于填写具体文本内容。 + +# 反馈 +以下是报告结构的反馈(如有): +{feedback} + +""" + + +query_writer_instructions = """ +# 设定 +你是一个专业的查询编写者,专门根据要求来生成网络查询文本,以尽可能准确高效地搜索到相关结果。 + +# 章节名称 +{section} + +# 章节描述 +{section_description} + +# 任务 +您的目标是生成 **{number_of_queries}** 个网络搜索查询,为撰写这个章节收集信息,查询需要与该章节内容高度相关。 +请确保查询足够具体,以便找到高质量、相关的来源,同时覆盖这个章节的各个部分。 +"""+thinking_process + + +section_writer_system_prompt = """ + +你是一个专业报告撰写者,目前正在撰写报告的一个特定章节的内容。 + +任务:仔细查看章节名称和主题。同时参考辅助资料,撰写本章节内容,并保证内容与主题高度相关,同时质量较高。 + +要求: +- 每次请只目前撰写的章节,不要从已完成的章节内容开始,也不要继续撰写下一个章节,仅单独完成该章节。 +- **内容在 2000 字**以上,若内容较为复杂可以增加到3000字 +- 尽可能少分点叙述,采用较大的段落叙述。 +- 使用Markdown格式,章节使用二级标题,有更细粒度的内容使用三级标题。但注意章节二级小标题不要超过3个! +- 需要注意内容的连贯性,这一点可以参考你已撰写的内容,必要的时候还能承上启下,适当提到之前写到内容来保证一致连贯。 +- 对于比较性内容,例如需要同时比较多个事物: +必须包含一个聚焦的比较表格,使用 Markdown 表格语法,表格应提炼报告中的见解,保持表格条目清晰简洁 + +- 对于非比较性内容: +只能使用一个结构元素(如果有助于提炼报告中的观点): +要么是一个聚焦的比较表格(使用 Markdown 表格语法),要么是一个简短的列表,使用正确的 Markdown 列表语法 + +# 引用格式 +- 引用标记 [url:] 应放在相关描述的句子之后。 +- 不需要写参考文献列表,我们会在后处理时根据引用编号插入。 +- 同一url只引用一次,不要重复引用一个url多次。例如在一段中有多个地方引用一个url,那么只需在最重要的地方引用一次。 + +例如以下是本章节可用的辅助资料 +1. 某文章A:https://example.com/a +2. 某文章B:https://example.com/b +示例输出:近年来,人工智能领域迅速发展,尤其是在自然语言处理方面取得了显著进展 [url:https://example.com/a]。 +与此同时,搜索增强生成(RAG)等技术被提出,用于改善语言模型的事实性 [url:https://example.com/b]。 +""" + +section_writer_instructions = """ +<当前章节名称> +{section_name} + + +<当前章节描述> +{section_description} + + +<当前章节的辅助资料> +{context} + + +<当前章节已撰写内容> +{section_content} + + +请只目前撰写的章节,不要从已完成的章节内容开始,也不要继续撰写下一个章节,仅单独完成该章节内容。 +本章节内容小标题用二级标题,更细用三级标题。直接开始撰写内容,不需要把章节名称放最开头。 + +<举例> +“标题” +当前章节:“引言” +章节描述:关于RAG技术的背景、定义及其在人工智能领域的重要性 +你的生成内容: +# 引言 +随着大规模预训练语言模型(如GPT、BERT等)在自然语言处理(NLP)领域的广泛应用……(引言内容) +## RAG技术背景 +…… +## RAG的发展时间线 +…… + +""" + +