From bcfc7f1f4b805a6324c8663aa03f74ec94142562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E9=B9=8F?= Date: Fri, 13 Sep 2024 13:09:05 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20summer2024EulerCopilot?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E6=90=9C=E7=B4=A2Agent=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/.keep" diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/.keep" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From e3d6205d0643a816867702d2a14deb1bc82495b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E9=B9=8F?= Date: Fri, 13 Sep 2024 13:11:05 +0000 Subject: [PATCH 2/5] =?UTF-8?q?summer2024EulerCopilot=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E6=90=9C=E7=B4=A2Agent=E6=8F=92=E4=BB=B6=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 胡鹏 --- .../README.md" | 58 +++ .../Searchagent.py" | 368 ++++++++++++++++++ .../agent.png" | Bin 0 -> 36180 bytes .../modelSet.py" | 24 ++ .../promptSet.py" | 193 +++++++++ .../requirements.txt" | 8 + 6 files changed, 651 insertions(+) create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/Searchagent.py" create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/agent.png" create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/modelSet.py" create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/promptSet.py" create mode 100644 "summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" new file mode 100644 index 0000000..3bfafdc --- /dev/null +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" @@ -0,0 +1,58 @@ +### 项目简介 + +本项目是一个基于搜索引擎的信息获取系统,通过搜索引擎为模型检索所需的信息。系统利用大语言模型(LLM)将用户问题拆解为子问题,结合搜索引擎并行获取相关内容,最终生成针对用户问题的精准摘要。该项目可补充现有的 RAG(Retrieval-Augmented Generation)和 `chat_to_db` 模块,特别适用于处理涉及最新信息或本地文档库未包含的内容。 + +### 项目流程图 + +![项目流程图](./agent.png) + +1. **输入问题与子问题拆解** + + - 系统接收用户的问题,使用大语言模型将其拆解为多个子问题,增加搜索的广度和深度。 + +2. **并行搜索** + + - 系统将主问题和子问题通过搜索引擎并行搜索,获取相关网页的标题和链接,并过滤无效链接。 + +3. **基于 TF-IDF 筛选最优标题** + + - 使用 TF-IDF 和余弦相似度计算标题与问题的相关性,筛选出最优的链接,并去重,确保搜索结果的质量。 + +4. **网页爬取与内容过滤** + + - 爬取筛选出的网页内容,过滤乱码、广告页面和无效内容,仅保留有效的文本信息,提升信息的准确性。 + +5. **生成摘要** + + - 将爬取的内容与原问题和子问题整合,使用大语言模型生成针对问题的精准摘要,并返回给用户。 + +### 可调节参数 + +运行程序时,可以通过命令行参数调整程序的行为: + +- `--qury`:所提问的问题(默认值:"请问NLP是什么?")。 +- `--model_path`:模型路径(默认值:`"/home/nfs02/model/Qwen1.5-14B-Chat"`)。 +- `--max_new_tokens`:生成文本的最大长度,控制摘要的字数(默认值:`500`)。 +- `--summary`:是否生成总结,布尔值,`True` 或 `False`(默认值:`True`)。 +- `--splitQFlag`:是否将问题拆解为子问题,布尔值,`True` 或 `False`(默认值:`True`)。 +- `--mainTopn`:主问题的 Top N 网页选择,用于控制爬取的网页数量(默认值:`3`)。 +- `--subTopn`:子问题的 Top N 网页选择(默认值:`1`)。 +- `--timeout`:网页爬取的超时时间,单位为秒(默认值:`1.5`)。 + +### 安装与运行 + +1. **克隆项目仓库:** + + ```bash + git clone https://github.com/your-repo.git + cd your-repo + +2. **安装依赖:** + + ```bash + pip install -r requirements.txt + +3. **运行程序:** + + ```bash + python main.py --qury "请问NLP是什么?" diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/Searchagent.py" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/Searchagent.py" new file mode 100644 index 0000000..0757742 --- /dev/null +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/Searchagent.py" @@ -0,0 +1,368 @@ +import requests +from bs4 import BeautifulSoup +from promptSet import prompt,user_agent_pool +import torch +import re +import random +import concurrent.futures +from urllib.parse import urlparse +from collections import Counter +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity +from typing import List, Optional +from readability import Document +import chardet +import time +import os +from modelSet import getModel +import argparse + +TIMEOUT=1.5 # 网页请求超时时间 +MAX_TOKENS=4000 # 网页+问题的输入文本最大长度 +black_list: Optional[List[str]] = [ + 'enoN', 'researchgate.net','zhihu.com' # 知乎爬不下来,知乎好像有api。 +] + +video_sites = [ + "youtube.com", "vimeo.com", "dailymotion.com", "youku.com", + "bilibili.com", "v.qq.com", "iqiyi.com", "netflix.com", + "hulu.com", "primevideo.com" +] + +all_filtered_sites = list(set(video_sites + black_list)) + +def is_video_site(url): + """判断链接是否属于常见视频网站""" + parsed_url = urlparse(url) + domain = parsed_url.netloc + return any(filtered_site in domain for filtered_site in all_filtered_sites) + +def filtByTFIDF(query, results, top_n=1): + # 计算TF-IDF特征,去选择最相关的结果 + titles=[result["title"] for result in results] + vectorizer = TfidfVectorizer().fit_transform([query] + titles) + vectors = vectorizer.toarray() + + # 计算相似度 + cosine_similarities = cosine_similarity(vectors[0:1], vectors[1:]).flatten() + + # 根据相似度对结果进行排序 + sorted_indices = cosine_similarities.argsort()[::-1][:top_n] + filtered_results = [results[i] for i in sorted_indices] + + return filtered_results + + +def baidu_search(query, max_results=5, top_n=1,timeout=TIMEOUT): + """从百度搜索中获取搜索结果并过滤无关链接""" + # 构建百度搜索的URL + url = f"https://www.baidu.com/s?wd={query}" + + # 发送GET请求 + headers = { + "User-Agent": random.choice(user_agent_pool)} + try: + response = requests.get(url, headers=headers,timeout=timeout) + except requests.RequestException as e: + print(f"无法访问 {url}: {e}") + return [] + + # 解析HTML内容 + soup = BeautifulSoup(response.text, "html.parser") + + # 提取搜索结果标题和链接 + results = [] + for item in soup.find_all('h3', class_='t'): + if len(results) >= max_results: + break + title = item.get_text() + link = item.a['href'] + + # 过滤掉常见视频网站的链接 + if not is_video_site(link): + results.append({"title": title, "link": link, "query": query}) + + if len(results) <= top_n: + return results + + return filtByTFIDF(query, results, top_n=top_n) + + + +def decodeQList(output_text): + # 使用正则表达式匹配列表中的每个子问题 + # 假设子问题列表格式为 ["子问题1", "子问题2", ...] + pattern = r'"\s*(.*?)\s*"' + matches = re.findall(pattern, output_text) + + # 提取出每个子问题并返回一个列表 + sub_questions = [match for match in matches] + + return sub_questions + + +def splitQ(query): + # 使用模型生成文本 + context=prompt['splitQ'].format(question=query) + response = getModelResultByLLM(context) + # Print the response text + query_list = decodeQList(response) + query_list = [query] + query_list + query_list = list(Counter(query_list).keys()) + print(query_list) + return query_list + + +def fetch_page_content_old(link): + headers = { + "User-Agent": random.choice(user_agent_pool) + } + try: + response = requests.get(link, headers=headers) + response.raise_for_status() # 检查请求是否成功 + soup = BeautifulSoup(response.text, "html.parser") + + # 选取主要内容的可能标签 + main_content = soup.find('article') or soup.find('div', class_='content') or soup.find('div', class_='main') or soup.find('div', class_='article-body') + + # 如果找不到指定的内容块,则使用

标签作为默认内容 + if main_content: + paragraphs = main_content.find_all('p') + else: + paragraphs = soup.find_all('p') + + # 过滤掉可能的无关内容 + content = '\n'.join([p.get_text() for p in paragraphs if p.get_text(strip=True)]) + + return content.strip() if content else None + + except requests.RequestException as e: + print(f"无法访问 {link}: {e}") + return None + +def is_page_valid(text, threshold=0.8): + # 过滤乱码和无效内容的网页 + # 使用正则表达式匹配中文字符 + chinese_pattern = re.compile(r'[\u4e00-\u9fff]') + # 匹配数字 + digit_pattern = re.compile(r'\d') + # 匹配英语字母 + english_pattern = re.compile(r'[a-zA-Z]') + # 匹配中英文常见标点符号 + punctuation_pattern = re.compile(r'[,。?!:;、“”‘’《》〈〉【】\[\](),.!?\'":;]') + + # 确保文本不为空 + if not text or len(text) == 0: + return False # 如果文本为空,认为是乱码 + + total_count = len(text) + + # 统计中文、数字、英语字符和标点符号的数量 + valid_count = ( + len(chinese_pattern.findall(text)) + + len(digit_pattern.findall(text)) + + len(english_pattern.findall(text)) + + len(punctuation_pattern.findall(text)) + ) + + # 计算有效字符比例 + valid_ratio = valid_count / total_count + + # 如果有效字符比例超过阈值,则返回True表示内容有效,否则返回False + return valid_ratio >= threshold + + +def clean_html_content(html_content): + # 去除 HTML 标签 + soup = BeautifulSoup(html_content, "html.parser") + text = soup.get_text() + + # 移除多余的空行和空格 + text = re.sub(r'\n+', '\n', text) + text = re.sub(r'\s+', ' ', text).strip() + + # 去除常见的符号和无关内容 + text = re.sub(r'[<>|*{}]', '', text) + + return text + + +def fetch_page_content(url,timeout=TIMEOUT): + headers = { + "User-Agent": random.choice(user_agent_pool), + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Connection": "keep-alive", + } + try: + with requests.Session() as session: + session.headers.update(headers) + + # 使用Session获取页面内容 + response = session.get(url, timeout=timeout) + response.raise_for_status() # 检查请求是否成功 + detected_encoding = chardet.detect(response.content)['encoding'] + if detected_encoding: + response.encoding = detected_encoding # 设置检测到的编码 + doc = Document(response.text) + content = doc.summary() + # 清理内容 + cleaned_content = clean_html_content(content) + except requests.RequestException as e: + print(f"Error fetching content from {url}: {e}") + return None + return cleaned_content + + +# 检查是否为重定向链接并返回最终的链接(如果有重定向) +def resolve_redirect(link): + try: + # 检查是否为重定向链接 + response = requests.head(link, allow_redirects=False) + if 300 <= response.status_code < 400: + # 重定向链接,获取重定向目标 + redirect_url = response.headers.get('Location') + if redirect_url: + return redirect_url # 返回重定向后的目标链接 + return link # 如果没有重定向,返回原始链接 + except Exception as e: + print(f"Error checking redirection for {link}: {e}") + return link # 出错时返回原始链接 + +def cleanResults(search_results,redirect=True): + # 排除重复的link和None值 + filtered_results = [] + if not redirect: + for loc,result in enumerate(search_results): + if result is None or result["link"] in [res["link"] for res in filtered_results]: + continue + filtered_results.append(result) + # 并行检查重定向并替换链接 + else: + with concurrent.futures.ThreadPoolExecutor() as executor: + resolved_links = executor.map(lambda result: resolve_redirect(result["link"]), search_results) + # 遍历 search_results,并根据返回的 resolved_links 更新链接 + for result, final_link in zip(search_results, resolved_links): + if any(site in final_link for site in black_list + video_sites): + continue + + # 检查重复的链接 + if final_link in [res["link"] for res in filtered_results]: + continue + + # 更新结果中的链接为重定向目标(如果有) + result["link"] = final_link + filtered_results.append(result) + return filtered_results + +def search(query,mainTopn=3,subTopn=1,summary=True,splitQFlag=True): + # 拆分问题为子问题,增加上原问题并去重 + if splitQFlag: + query_list = splitQ(query) + else: + query_list = [query] + + # 使用并行的方式搜索每个子问题 + search_results = [] + top_nSet=[mainTopn] + [subTopn]*(len(query_list)-1) + with concurrent.futures.ThreadPoolExecutor() as executor: + results = executor.map(lambda loc_q: baidu_search(loc_q[1], max_results=5, top_n=top_nSet[loc_q[0]]), enumerate(query_list)) + for result in results: + search_results.extend(result) + + print(search_results) + # 过滤掉重复的链接和None值 + search_results=cleanResults(search_results) + + # 并行爬取每个链接的内容 + page_contents = [] + with concurrent.futures.ThreadPoolExecutor() as executor: + links = [result["link"] for result in search_results] + contents = executor.map(fetch_page_content, links) + # 将结果按顺序添加回 search_results 中 + for result, content in zip(search_results, contents): + if content and is_page_valid (content): + result["content"] = content + page_contents.append(result) + + + if summary: + return summaryResultByLLM(page_contents) + return page_contents + + +def getModelResultByLLM(text,max_tokens=MAX_TOKENS): + # 使用模型生成文本 + text=text[:min(max_tokens, len(text))] + text = tokenizer.apply_chat_template( + [{"role": "user", "content": text}], + tokenize=False, + add_generation_prompt=True + ) + model_inputs = tokenizer([text], return_tensors="pt")['input_ids'].to(device) + # input_text= tokenizer.decode(model_inputs[0], skip_special_tokens=True) + # print(f"输入文本: {input_text}") + # 在不更新梯度的情况下生成结果 + with torch.no_grad(): + generated_ids = model.module.generate( + input_ids=model_inputs, + max_new_tokens=max_new_tokens, + ) + + # 确保正确计算生成的token,并排除输入部分 + generated_ids = [ + output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs, generated_ids) + ] + + # 将生成的token ID解码为可读文本 + response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] + + return response + +def summaryResultByLLM(page_contents): + # 将搜索结果和子问题拼接成一个文本,并使用模型筛选关键信息 + link=[content["link"] for content in page_contents] + main_query = page_contents[0]['query'] + mainAnswer = "" + subq="" + answer="" + query =None + for loc, content in enumerate(page_contents): + if content['query'] == main_query: + mainAnswer+=prompt['pageItem'].format(id=loc, content=content['content']) + elif content['query'] == query: + answer+=prompt['pageItem'].format(id=loc, content=content['content']) + else: + if query: + subq+=prompt['subq'].format(subq=query,answers=answer,subqLast=prompt['subq']) + query = content['query'] + answer=prompt['pageItem'].format(id=loc, content=content['content']) + if query: + if subq!="": + subq=subq.format(subq=query,answers=answer,subqLast="") + else: + subq=prompt['subq'].format(subq=query,answers=answer,subqLast="") + context=prompt['summary'].format(question=main_query,answers=mainAnswer,subq=subq) + infrence_time = time.time() + response=getModelResultByLLM(context) + infrence_time = time.time()-infrence_time + print(f"总结推理时间: {infrence_time:.2f}秒") + return response, link + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="解析模型相关参数的示例。") + parser.add_argument('--qury', type=str, default="请问NLP是什么?", help='所提问的问题') + parser.add_argument('--model_path', type=str, default="/home/nfs02/model/Qwen1.5-14B-Chat", help='模型路径') + parser.add_argument('--max_new_tokens', type=int, default=500, help='生成文本的最大长度') + parser.add_argument('--summary', type=bool, default=True, help='是否生成总结') + parser.add_argument('--splitQFlag', type=bool, default=True, help='是否分割子问题') + parser.add_argument('--mainTopn', type=int, default=3, help='主任务的 top n 网页选择') + parser.add_argument('--subTopn', type=int, default=1, help='子任务的 top n 网页选择') + args = parser.parse_args() + + model_path = args.model_path + model, tokenizer, device = getModel(model_path) + + max_new_tokens = args.max_new_tokens + print(search(args.qury,mainTopn=args.mainTopn,subTopn=args.subTopn,summary=args.summary,splitQFlag=args.splitQFlag)) \ No newline at end of file diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/agent.png" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/agent.png" new file mode 100644 index 0000000000000000000000000000000000000000..2d30b4c70e9fd62ed31ae47d8c7c93742ffc0170 GIT binary patch literal 36180 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 S7Y>A}EIxYZ7>ao?= 1: + print(f"使用 {torch.cuda.device_count()} 块 GPU!") + model = torch.nn.DataParallel(model) + # 如果有GPU可用,使用GPU,否则使用CPU cuda + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + model.to(device) + return model, tokenizer, device + +bertFlag = False +if bertFlag: + bertTokenizer = BertTokenizer.from_pretrained('bert-base-uncased') + bertModel = BertModel.from_pretrained('bert-base-uncased') \ No newline at end of file diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/promptSet.py" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/promptSet.py" new file mode 100644 index 0000000..8df7704 --- /dev/null +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/promptSet.py" @@ -0,0 +1,193 @@ +prompt={} +prompt['splitQ'] = """ +现在是2024年,你是一个拆分问题的智能助手,负责将"需拆分问题"拆分为可通过搜索回答的子问题。 + +## 任务介绍 +将问题拆分为多个单一、具体的子问题,便于搜索获取答案。每个子问题应涉及一个特定的知识点、时间、地点、人物或事件。请避免复合问题(如多个知识点的问题或者多个事物的比较加筛选)或重复提问(提问已经提问过的问题)。子问题必须完整独立,避免使用模糊表达,如"该组织,以上内容"。 + + +## 返回格式 +返回一个列表,每个元素为一个子问题。如果不可拆分,请返回空列表。 + +## 样例 +样例问题:什么是生成式 AI? +答案:["生成式模型定义", "生成式模型的运作原理是什么?", "生成式模型的应用有哪些?"] +样例问题:中国的2023年的GDP是多少? +答案:[] + +需拆分问题:{question} +""" + +prompt['summary'] = """ +根据问题和拆解出的子问题,筛选有助于回答问题的网页内容,并在300字内总结。每个关键点需标明网页ID,格式为`[[int]]`,多个ID用`[[id_1]][[id_2]]`表示。 + +- 回答需逻辑清晰、结构分明,易于理解。 +- 确保每个关键点引用对应的搜索结果来源,保持专业、严谨的表达。 +- 回答必须完整,避免使用模糊表达,如"基于上述内容",最终展示的内容不包含网页内容。 +- 统一语法和词汇,保持文档一致性和连贯性。 +- 由于网页过长,网页内容可能被截断,请专注于抽取关键信息。 + +用户问题:{question} {answers} {subq} +""" + + +prompt['subq'] = "\n子问题:{subq} {answers} {subqLast}" + +prompt['pageItem'] = "\n搜索到的网页ID:{id} 网页内容:{content}" + + + +user_agent_pool = [ # User-Agent池 + # Cent Browser 4.3.9.248,Chromium 86.0.4240.198,2021.01 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', + + # Edge + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38', + # 2021.09 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.44', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.37', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.47', + # 2021.10 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44', + # 2021.11 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.41', + # 2021.12 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36 Edg/96.0.1054.53', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55', + # 2022.01 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.76', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43', + # 2022.02 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.50', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.55', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.56', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30', + # 2022.03 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.39', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.46', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.52', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36 Edg/100.0.1185.29', + # 2022.04 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.50', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39', + # 2022.05 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.47', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30', + # 2022.06 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.33', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.39', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.41', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36 Edg/103.0.1264.37', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44', + # 2022.07 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.71', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.77', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47', + # 2022.08 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.70', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27', + # 2022.09 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.50', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.34', + # 2022.10 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.37', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42', + + # Chrome + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36', + # 2021.10 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36', + # 2021.11 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36', + # 2021.12 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36', + # 2022.01 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36', + # 2022.02 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36', + # 2022.03 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36', + # 2022.04 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36', + # 2022.05 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.115 Safari/537.36', + # 2022.06 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36', + # 2022.07 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36', + # 2022.08 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.54 Safari/537.36', + # 2022.09 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.127 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.91 Safari/537.36', + # 2022.10 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.103 Safari/537.36', + + # Chrome Beta + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.41 Safari/537.36', + # 2021.09 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.17 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.32 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.40 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.49 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.18 Safari/537.36', + # 2021.10 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.27 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.35 Safari/537.36', + # 2021.11 + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36' +] \ No newline at end of file diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" new file mode 100644 index 0000000..8f256eb --- /dev/null +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" @@ -0,0 +1,8 @@ +torch +transformers==4.41.0 +scikit-learn +requests +beautifulsoup4 +lxml +readability +chardet \ No newline at end of file -- Gitee From fe1308974edb170e943dee899ed7c617960721d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E9=B9=8F?= Date: Fri, 13 Sep 2024 13:13:36 +0000 Subject: [PATCH 3/5] =?UTF-8?q?update=20summer2024EulerCopilot=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E6=90=9C=E7=B4=A2Agent=E6=8F=92=E4=BB=B6=E5=BC=80?= =?UTF-8?q?=E5=8F=91/README.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 胡鹏 --- .../README.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" index 3bfafdc..b7383cf 100644 --- "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" @@ -44,8 +44,8 @@ 1. **克隆项目仓库:** ```bash - git clone https://github.com/your-repo.git - cd your-repo + git clone https://gitee.com/hupeng2023/open-source-summer.git + cd repo(请修改为对应目录) 2. **安装依赖:** -- Gitee From 0b6213d9a58ad089055919330ea4781c46a731b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E9=B9=8F?= Date: Fri, 13 Sep 2024 13:14:47 +0000 Subject: [PATCH 4/5] =?UTF-8?q?update=20summer2024EulerCopilot=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E6=90=9C=E7=B4=A2Agent=E6=8F=92=E4=BB=B6=E5=BC=80?= =?UTF-8?q?=E5=8F=91/README.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 胡鹏 --- .../README.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" index b7383cf..da79b6e 100644 --- "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/README.md" @@ -37,7 +37,6 @@ - `--splitQFlag`:是否将问题拆解为子问题,布尔值,`True` 或 `False`(默认值:`True`)。 - `--mainTopn`:主问题的 Top N 网页选择,用于控制爬取的网页数量(默认值:`3`)。 - `--subTopn`:子问题的 Top N 网页选择(默认值:`1`)。 -- `--timeout`:网页爬取的超时时间,单位为秒(默认值:`1.5`)。 ### 安装与运行 -- Gitee From e76c8188475e0f49f9b0da1ad94efce3298d7205 Mon Sep 17 00:00:00 2001 From: hupeng2023 <422133749@qq.com> Date: Mon, 14 Oct 2024 11:57:07 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E9=82=AE=E7=AE=B1=E5=92=8C=E5=85=B6=E4=BB=96=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../requirements.txt" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" index 8f256eb..ccbe4dc 100644 --- "a/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" +++ "b/summer2024EulerCopilot\346\231\272\350\203\275\346\220\234\347\264\242Agent\346\217\222\344\273\266\345\274\200\345\217\221/requirements.txt" @@ -5,4 +5,5 @@ requests beautifulsoup4 lxml readability -chardet \ No newline at end of file +chardet + -- Gitee