BettaFish
BettaFish copied to clipboard
微舆:人人可用的多Agent舆情分析助手,打破信息茧房,还原舆情原貌,预测未来走向,辅助决策!从0实现,不依赖任何框架。
â¡ é¡¹ç®æ¦è¿°
âå¾®èâ æ¯ä¸ä¸ªä»0å®ç°çåæ°å 夿ºè½ä½ èæ åæç³»ç»ï¼å¸®å©å¤§å®¶ç ´é¤ä¿¡æ¯è§æ¿ï¼è¿åèæ åè²ï¼é¢æµæªæ¥èµ°åï¼è¾ å©å³çãç¨æ·åªéåè天䏿 ·æåºåæéæ±ï¼æºè½ä½å¼å§å ¨èªå¨åæ å½å å¤30+主æµç¤¾åª ä¸ æ°ç¾ä¸æ¡å¤§ä¼è¯è®ºã
âå¾®èâè°é³â微鱼âï¼BettaFishæ¯ä¸ç§ä½åå¾å°ä½é常好æãæ¼äº®çé±¼ï¼å®è±¡å¾çâå°è强大ï¼ä¸çææâ
æ¥çç³»ç»ä»¥âæ¦æ±å¤§å¦èæ â为ä¾ï¼çæçç ç©¶æ¥åï¼æ¦æ±å¤§å¦åçå£°èªæ·±åº¦åææ¥å
æ¥çç³»ç»ä»¥âæ¦æ±å¤§å¦èæ â为ä¾ï¼ä¸æ¬¡å®æ´è¿è¡çè§é¢ï¼è§é¢-æ¦æ±å¤§å¦åçå£°èªæ·±åº¦åææ¥å
ä¸ä» ä» ä½ç°å¨æ¥åè´¨éä¸ï¼ç¸æ¯å类产åï¼æä»¬æ¥æðå 大ä¼å¿ï¼
-
AI驱å¨çå ¨åçæ§ï¼AIç¬è«é群7x24å°æ¶ä¸é´æä½ä¸ï¼å ¨é¢è¦çå¾®åãå°çº¢ä¹¦ãæé³ãå¿«æç10+å½å å¤å ³é®ç¤¾åªãä¸ä» 宿¶æè·çç¹å å®¹ï¼æ´è½ä¸é»è³æµ·éç¨æ·è¯è®ºï¼è®©æ¨å¬å°æçå®ãæå¹¿æ³ç大ä¼å£°é³ã
-
è¶ è¶LLMçå¤ååæå¼æï¼æä»¬ä¸ä» ä¾èµè®¾è®¡ç5ç±»ä¸ä¸Agentï¼æ´èåäºå¾®è°æ¨¡åãç»è®¡æ¨¡åçä¸é´ä»¶ãéè¿å¤æ¨¡åååå·¥ä½ï¼ç¡®ä¿äºåæç»æç深度ãå度ä¸å¤ç»´è§è§ã
-
强大ç夿¨¡æè½åï¼çªç ´å¾æéå¶ï¼è½æ·±åº¦è§£ææé³ãå¿«æççè§é¢å 容ï¼å¹¶ç²¾åæåç°ä»£æç´¢å¼æä¸ç天æ°ãæ¥åãè¡ç¥¨çç»æå夿¨¡æä¿¡æ¯å¡çï¼è®©æ¨å ¨é¢ææ¡èæ 卿ã
-
Agentâ论åâå使ºå¶ï¼ä¸ºä¸åAgentèµäºç¬ç¹çå·¥å ·éä¸æç»´æ¨¡å¼ï¼å¼å ¥è¾©è®ºä¸»æäººæ¨¡åï¼éè¿â论åâæºå¶è¿è¡é¾å¼æç»´ç¢°æä¸è¾©è®ºãè¿ä¸ä» é¿å äºå䏿¨¡åçæç»´å±éä¸äº¤æµå¯¼è´çåè´¨åï¼æ´å¬çåºæ´é«è´¨éçé使ºè½ä¸å³çæ¯æã
-
å ¬ç§åæ°æ®æ ç¼èåï¼å¹³å°ä¸ä» åæå ¬å¼èæ ï¼è¿æä¾é«å®å ¨æ§çæ¥å£ï¼æ¯ææ¨å°å é¨ä¸å¡æ°æ®åºä¸èæ æ°æ®æ ç¼éæãæéæ°æ®å£åï¼ä¸ºåç´ä¸å¡æä¾âå¤é¨è¶å¿+å 鍿´å¯âç强大åæè½åã
-
è½»éåä¸é«æ©å±æ§æ¡æ¶ï¼åºäºçº¯Python模åå设计ï¼å®ç°è½»éåãä¸é®å¼é¨ç½²ã代ç ç»ææ¸ æ°ï¼å¼åè å¯è½»æ¾éæèªå®ä¹æ¨¡åä¸ä¸å¡é»è¾ï¼å®ç°å¹³å°çå¿«éæ©å±ä¸æ·±åº¦å®å¶ã
å§äºèæ ï¼è䏿¢äºèæ ãâå¾®èâçç®æ ï¼æ¯æä¸ºé©±å¨ä¸åä¸å¡åºæ¯çç®æ´éç¨çæ°æ®åæå¼æã
举个ä¾å. ä½ åªéç®åä¿®æ¹Agentå·¥å ·éçapiåæ°ä¸promptï¼å°±å¯ä»¥æä»åæä¸ä¸ªéèé¢åçå¸åºåæç³»ç»
éä¸ä¸ªæ¯è¾æ´»è·çLç«é¡¹ç®è®¨è®ºå¸ï¼https://linux.do/t/topic/1009280
æ¥çLç«ä½¬ååçæµè¯ å¼æºé¡¹ç®(å¾®è)ä¸manus|minimax|ChatGPT对æ¯
åå«ä¼ ç»çæ°æ®çæ¿ï¼å¨âå¾®èâï¼ä¸åç±ä¸ä¸ªç®åçé®é¢å¼å§ï¼æ¨åªéå对è¯ä¸æ ·ï¼æåºæ¨çåæéæ±
ðª èµå©å
æèµå©LLMç®åç¦å©ï¼ç¼ç¨æ¼è½¦codecodex.aiï¼ç¼ç¨ç®åVibeCodingAPI.aiï¼
- æç½é¨å客LionCC.aiå·²æ´æ°ãBettaFish å¾®èç³»ç» - LionCC API é¨ç½²é ç½®å®å ¨æåãæ£å¨äºå¼ä¼åä¸é®é¨ç½²åäºæå¡å¨è°ç¨æ¹æ¡ã
- VibeCodingapi.aiç®åç®åå¹³å°å·²ç»éé ãBettaFish å¾®èç³»ç»ãææLLM模åå«claude codeåopenai codexågemini cliç¼ç¨å¼åä¸å·¨å¤´ç®åãé¢åº¦ä»·æ ¼ï¼åªè¦ä¸æ¯ä¸ï¼100å çäº100ç¾åé¢åº¦ï¼
- Codecodex.aiç®åç¼ç¨æ¼è½¦ç³»ç»ï¼å·²å®ç°æ IP鍿§ç»è¿claude codeåopenai codexå°éï¼æå®æ¹é¨ç½²æç¨å忢BASE_URLè°ç¨å°ååToken keyè°ç¨å¯é¥å³å¯ä½¿ç¨æå¼ºç¼ç¨æ¨¡åã
æç½é¨LionCCèµå©BettaFish å¾®èç¦å©ï¼æå¼codecodex.aiç®åç¼ç¨é¢éæ«ç å å ¥å¾®ä¿¡ç¤¾ç¾¤ï¼æ³¨åVibeCodingapi.aiç®åç®åï¼ç»ä¸é20åAPIé¢åº¦ï¼ä» éåä¸ååï¼
æç¨éä»è´¹çä¼ä¸çº§AIèµæºå¹³å°ï¼æä¾å¸åºä¸å
¨é¢çAI模ååAPIï¼ä»¥åå¤ç§å¨çº¿AIåºç¨ï¼
302.AIæ¯ä¸ä¸ªæç¨éä»è´¹çä¼ä¸çº§AIèµæºå¹³å°ï¼æä¾å¸åºä¸ææ°ãæå
¨é¢çAI模ååAPIï¼ä»¥åå¤ç§å¼ç®±å³ç¨çå¨çº¿AIåºç¨ã
AIèç½æç´¢ãæä»¶è§£æåç½é¡µå
容æåçæºè½ä½æ ¸å¿è½åæä¾åï¼
å®ææ´¾å¼æ¾å¹³å°(Anspire Open)æ¯é¢åæºè½ä½æ¶ä»£çé¢å
çåºç¡è®¾æ½æä¾åãæä»¬ä¸ºå¼åè
æä¾æå»ºå¼ºå¤§æºè½ä½æéçæ ¸å¿è½åæ ï¼ç°å·²ä¸çº¿AIèç½æç´¢ãå¤çæ¬ï¼æå
·ç«äºåçä»·æ ¼ããæä»¶è§£æãéå
ãåç½é¡µå
容æåãéå
ããäºç«¯æµè§å¨èªå¨åï¼Anspire Browser Agentï¼ãå
æµããå¤è½®æ¹åçæå¡ï¼æç»ä¸ºæºè½ä½è¿æ¥å¹¶æä½å¤æçæ°åä¸çæä¾åå®åºç¡ã坿 ç¼éæè³DifyãCozeãå
å¨çä¸»æµæºè½ä½å¹³å°ãéè¿éæç¹æ°è®¡è´¹ä½ç³»ä¸æ¨¡åå设计ï¼ä¸ºä¼ä¸æä¾é«æã使æ¬çå®å¶åæ¯æï¼å éæºè½åå级è¿ç¨ã
ðï¸ ç³»ç»æ¶æ
æ´ä½æ¶æå¾
Insight Agent ç§ææ°æ®åºææï¼ç§æèæ æ°æ®åºæ·±åº¦åæAI代ç
Media Agent 夿¨¡æå 容åæï¼å ·å¤å¼ºå¤§å¤æ¨¡æè½åçAI代ç
Query Agent ç²¾åä¿¡æ¯æç´¢ï¼å ·å¤å½å å¤ç½é¡µæç´¢è½åçAI代ç
Report Agent æºè½æ¥åçæï¼å 置模æ¿çå¤è½®æ¥åçæAI代ç
䏿¬¡å®æ´åææµç¨
| æ¥éª¤ | é¶æ®µåç§° | ä¸»è¦æä½ | åä¸ç»ä»¶ | 循ç¯ç¹æ§ |
|---|---|---|---|---|
| 1 | ç¨æ·æé® | Flask主åºç¨æ¥æ¶æ¥è¯¢ | Flask主åºç¨ | - |
| 2 | å¹¶è¡å¯å¨ | ä¸ä¸ªAgentåæ¶å¼å§å·¥ä½ | Query AgentãMedia AgentãInsight Agent | - |
| 3 | åæ¥åæ | åAgent使ç¨ä¸å±å·¥å ·è¿è¡æ¦è§æç´¢ | åAgent + ä¸å±å·¥å ·é | - |
| 4 | çç¥å¶å® | åºäºåæ¥ç»æå¶å®ååç ç©¶çç¥ | åAgentå é¨å³ç模å | - |
| 5-N | 循ç¯é¶æ®µ | 论ååä½ + 深度ç ç©¶ | ForumEngine + ææAgent | å¤è½®å¾ªç¯ |
| 5.1 | 深度ç ç©¶ | åAgentåºäºè®ºå主æäººå¼å¯¼è¿è¡ä¸é¡¹æç´¢ | åAgent + åææºå¶ + 论åå¼å¯¼ | æ¯è½®å¾ªç¯ |
| 5.2 | 论ååä½ | ForumEngineçæ§Agentåè¨å¹¶çæä¸»æäººå¼å¯¼ | ForumEngine + LLM主æäºº | æ¯è½®å¾ªç¯ |
| 5.3 | 交æµèå | åAgentæ ¹æ®è®¨è®ºè°æ´ç ç©¶æ¹å | åAgent + forum_readerå·¥å · | æ¯è½®å¾ªç¯ |
| N+1 | ç»ææ´å | Report Agentæ¶éææåæç»æå论åå 容 | Report Agent | - |
| N+2 | IRä¸é´è¡¨ç¤º | å¨æéæ©æ¨¡æ¿åæ ·å¼ï¼å¤è½®çæå æ°æ®ï¼è£ 订为IRä¸é´è¡¨ç¤º | Report Agent + 模æ¿å¼æ | - |
| N+3 | æ¥åçæ | ååè¿è¡è´¨éæ£æµï¼åºäºIR渲ææäº¤äºå¼ HTML æ¥å | Report Agent + è£ è®¢å¼æ | - |
项ç®ä»£ç ç»ææ
BettaFish/
âââ QueryEngine/ # å½å
夿°é»å¹¿åº¦æç´¢Agent
â âââ agent.py # Agent主é»è¾ï¼åè°æç´¢ä¸åææµç¨
â âââ llms/ # LLMæ¥å£å°è£
â âââ nodes/ # å¤çèç¹ï¼æç´¢ãæ ¼å¼åãæ»ç»ç
â âââ tools/ # å½å
夿°é»æç´¢å·¥å
·é
â âââ utils/ # å·¥å
·å½æ°
â âââ state/ # ç¶æç®¡ç
â âââ prompts/ # æç¤ºè¯æ¨¡æ¿
â âââ ...
âââ MediaEngine/ # 强大ç夿¨¡æçè§£Agent
â âââ agent.py # Agent主é»è¾ï¼å¤çè§é¢/å¾çç夿¨¡æå
容
â âââ llms/ # LLMæ¥å£å°è£
â âââ nodes/ # å¤çèç¹ï¼æç´¢ãæ ¼å¼åãæ»ç»ç
â âââ tools/ # 夿¨¡ææç´¢å·¥å
·é
â âââ utils/ # å·¥å
·å½æ°
â âââ state/ # ç¶æç®¡ç
â âââ prompts/ # æç¤ºè¯æ¨¡æ¿
â âââ ...
âââ InsightEngine/ # ç§ææ°æ®åºææAgent
â âââ agent.py # Agent主é»è¾ï¼åè°æ°æ®åºæ¥è¯¢ä¸åæ
â âââ llms/ # LLMæ¥å£å°è£
â â âââ base.py # ç»ä¸çOpenAIå
¼å®¹å®¢æ·ç«¯
â âââ nodes/ # å¤çèç¹ï¼æç´¢ãæ ¼å¼åãæ»ç»ç
â â âââ base_node.py # åºç¡èç¹ç±»
â â âââ search_node.py # æç´¢èç¹
â â âââ formatting_node.py # æ ¼å¼åèç¹
â â âââ report_structure_node.py # æ¥åç»æèç¹
â â âââ summary_node.py # æ»ç»èç¹
â âââ tools/ # æ°æ®åºæ¥è¯¢ååæå·¥å
·é
â â âââ keyword_optimizer.py # Qwenå
³é®è¯ä¼åä¸é´ä»¶
â â âââ search.py # æ°æ®åºæä½å·¥å
·éï¼è¯é¢æç´¢ãè¯è®ºè·åçï¼
â â âââ sentiment_analyzer.py # æ
æåæéæå·¥å
·
â âââ utils/ # å·¥å
·å½æ°
â â âââ config.py # é
置管ç
â â âââ db.py # SQLAlchemy弿¥å¼æä¸åªè¯»æ¥è¯¢å°è£
â â âââ text_processing.py # ææ¬å¤çå·¥å
·
â âââ state/ # ç¶æç®¡ç
â â âââ state.py # Agentç¶æå®ä¹
â âââ prompts/ # æç¤ºè¯æ¨¡æ¿
â â âââ prompts.py # åç±»æç¤ºè¯
â âââ __init__.py
âââ ReportEngine/ # å¤è½®æ¥åçæAgent
â âââ agent.py # æ»è°åº¦å¨ï¼æ¨¡æ¿éæ©âå¸å±âç¯å¹
âç« èâæ¸²æ
â âââ flask_interface.py # Flask/SSEå
¥å£ï¼ç®¡ç任塿é䏿µå¼äºä»¶
â âââ llms/ # OpenAIå
¼å®¹LLMå°è£
â â âââ base.py # ç»ä¸çæµå¼/éè¯å®¢æ·ç«¯
â âââ core/ # æ ¸å¿åè½ï¼æ¨¡æ¿è§£æãç« èåå¨ãææ¡£è£
订
â â âââ template_parser.py # Markdown模æ¿åçä¸slugçæ
â â âââ chapter_storage.py # ç« èrunç®å½ãmanifestä¸rawæµåå
¥
â â âââ stitcher.py # Document IRè£
订å¨ï¼è¡¥é½éç¹/å
æ°æ®
â âââ ir/ # æ¥åä¸é´è¡¨ç¤ºï¼IRï¼å¥çº¦ä¸æ ¡éª
â â âââ schema.py # å/æ è®°Schema常éå®ä¹
â â âââ validator.py # ç« èJSONç»ææ ¡éªå¨
â âââ nodes/ # å
¨æµç¨æ¨çèç¹
â â âââ base_node.py # èç¹åºç±»+æ¥å¿/ç¶æé©å
â â âââ template_selection_node.py # 模æ¿åéæ¶éä¸LLMçé
â â âââ document_layout_node.py # æ é¢/ç®å½/主é¢è®¾è®¡
â â âââ word_budget_node.py # ç¯å¹
è§åä¸ç« èæä»¤çæ
â â âââ chapter_generation_node.py # ç« è级JSONçæ+æ ¡éª
â âââ prompts/ # æç¤ºè¯åºä¸Schema说æ
â â âââ prompts.py # 模æ¿éæ©/å¸å±/ç¯å¹
/ç« èæç¤ºè¯
â âââ renderers/ # IR渲æå¨
â â âââ html_renderer.py # Document IRâ交äºå¼HTML
â â âââ pdf_renderer.py # HTMLâPDF导åºï¼WeasyPrintï¼
â â âââ pdf_layout_optimizer.py # PDFå¸å±ä¼åå¨
â â âââ chart_to_svg.py # å¾è¡¨è½¬SVGå·¥å
·
â âââ state/ # ä»»å¡/å
æ°æ®ç¶ææ¨¡å
â â âââ state.py # ReportStateä¸åºååå·¥å
·
â âââ utils/ # é
ç½®ä¸è¾
å©å·¥å
·
â â âââ config.py # Pydantic Settings䏿å°å©æ
â â âââ dependency_check.py # ä¾èµæ£æ¥å·¥å
·
â â âââ json_parser.py # JSONè§£æå·¥å
·
â â âââ chart_validator.py # å¾è¡¨æ ¡éªå·¥å
·
â â âââ chart_repair_api.py # å¾è¡¨ä¿®å¤API
â âââ report_template/ # Markdown模æ¿åº
â â âââ ä¼ä¸åç声èªåææ¥å.md
â â âââ ...
â âââ __init__.py
âââ ForumEngine/ # 论å弿ï¼Agentå使ºå¶
â âââ monitor.py # æ¥å¿çæ§å论åç®¡çæ ¸å¿
â âââ llm_host.py # 论å主æäººLLM模å
â âââ __init__.py
âââ MindSpider/ # 社交åªä½ç¬è«ç³»ç»
â âââ main.py # ç¬è«ä¸»ç¨åºå
¥å£
â âââ config.py # ç¬è«é
ç½®æä»¶
â âââ BroadTopicExtraction/ # è¯é¢æå模å
â â âââ main.py # è¯é¢æå主ç¨åº
â â âââ database_manager.py # æ°æ®åºç®¡çå¨
â â âââ get_today_news.py # 仿¥æ°é»è·å
â â âââ topic_extractor.py # è¯é¢æåå¨
â âââ DeepSentimentCrawling/ # 深度èæ
ç¬å模å
â â âââ main.py # 深度ç¬å主ç¨åº
â â âââ keyword_manager.py # å
³é®è¯ç®¡çå¨
â â âââ platform_crawler.py # å¹³å°ç¬è«ç®¡ç
â â âââ MediaCrawler/ # 社åªç¬è«æ ¸å¿
â â âââ main.py
â â âââ config/ # åå¹³å°é
ç½®
â â âââ media_platform/ # åå¹³å°ç¬è«å®ç°
â â âââ ...
â âââ schema/ # æ°æ®åºç»æå®ä¹
â âââ db_manager.py # æ°æ®åºç®¡çå¨
â âââ init_database.py # æ°æ®åºåå§åèæ¬
â âââ mindspider_tables.sql # æ°æ®åºè¡¨ç»æSQL
â âââ models_bigdata.py # å¤§è§æ¨¡åªä½èæ
表çSQLAlchemyæ å°
â âââ models_sa.py # DailyTopic/Taskçæ©å±è¡¨ORM模å
âââ SentimentAnalysisModel/ # æ
æåææ¨¡åéå
â âââ WeiboSentiment_Finetuned/ # å¾®è°BERT/GPT-2模å
â â âââ BertChinese-Lora/ # BERT䏿LoRAå¾®è°
â â â âââ train.py
â â â âââ predict.py
â â â âââ ...
â â âââ GPT2-Lora/ # GPT-2 LoRAå¾®è°
â â âââ train.py
â â âââ predict.py
â â âââ ...
â âââ WeiboMultilingualSentiment/ # å¤è¯è¨æ
æåæ
â â âââ train.py
â â âââ predict.py
â â âââ ...
â âââ WeiboSentiment_SmallQwen/ # å°åæ°Qwen3å¾®è°
â â âââ train.py
â â âââ predict_universal.py
â â âââ ...
â âââ WeiboSentiment_MachineLearning/ # ä¼ ç»æºå¨å¦ä¹ æ¹æ³
â âââ train.py
â âââ predict.py
â âââ ...
âââ SingleEngineApp/ # åç¬AgentçStreamlitåºç¨
â âââ query_engine_streamlit_app.py # QueryEngineç¬ç«åºç¨
â âââ media_engine_streamlit_app.py # MediaEngineç¬ç«åºç¨
â âââ insight_engine_streamlit_app.py # InsightEngineç¬ç«åºç¨
âââ query_engine_streamlit_reports/ # QueryEngineååºç¨è¿è¡è¾åº
âââ media_engine_streamlit_reports/ # MediaEngineååºç¨è¿è¡è¾åº
âââ insight_engine_streamlit_reports/ # InsightEngineååºç¨è¿è¡è¾åº
âââ templates/ # Flaskå端模æ¿
â âââ index.html # 主çé¢HTML
âââ static/ # éæèµæº
â âââ image/ # å¾çèµæº
â âââ logo_compressed.png
â âââ framework.png
â âââ ...
âââ logs/ # è¿è¡æ¥å¿ç®å½
âââ final_reports/ # æç»çæçæ¥åæä»¶
â âââ ir/ # æ¥åIR JSONæä»¶
â âââ *.html # æç»HTMLæ¥å
âââ utils/ # éç¨å·¥å
·å½æ°
â âââ forum_reader.py # Agenté´è®ºåéä¿¡å·¥å
·
â âââ github_issues.py # ç»ä¸çæGitHub Issue龿¥ä¸é误æç¤º
â âââ retry_helper.py # ç½ç»è¯·æ±éè¯æºå¶å·¥å
·
âââ tests/ # åå
æµè¯ä¸éææµè¯
â âââ run_tests.py # pytestå
¥å£èæ¬
â âââ test_monitor.py # ForumEngineçæ§åå
æµè¯
â âââ test_report_engine_sanitization.py # ReportEngineå®å
¨æ§æµè¯
â âââ ...
âââ app.py # Flask主åºç¨å
¥å£
âââ config.py # å
¨å±é
ç½®æä»¶
âââ .env.example # ç¯å¢åéç¤ºä¾æä»¶
âââ docker-compose.yml # Docker夿å¡ç¼æé
ç½®
âââ Dockerfile # Dockeréåæå»ºæä»¶
âââ requirements.txt # Pythonä¾èµå
æ¸
å
âââ regenerate_latest_pdf.py # PDFéæ°çæå·¥å
·èæ¬
âââ report_engine_only.py # Report Engineå½ä»¤è¡çæ¬
âââ README.md # ä¸æè¯´æææ¡£
âââ README-EN.md # è±æè¯´æææ¡£
âââ CONTRIBUTING.md # ä¸æè´¡ç®æå
âââ CONTRIBUTING-EN.md # è±æè´¡ç®æå
âââ LICENSE # GPL-2.0弿ºè®¸å¯è¯
ð å¿«éå¼å§ï¼Dockerï¼
1. å¯å¨é¡¹ç®
å¤å¶ä¸ä»½ .env.example æä»¶ï¼å½å为 .env ï¼å¹¶æéé
ç½® .env æä»¶ä¸çç¯å¢åé
æ§è¡ä»¥ä¸å½ä»¤å¨åå°å¯å¨æææå¡ï¼
docker compose up -d
注ï¼éåæåéåº¦æ ¢ï¼å¨å
docker-compose.ymlæä»¶ä¸ï¼æä»¬å·²ç»éè¿æ³¨éçæ¹å¼æä¾äºå¤ç¨éåå°å便¨æ¿æ¢
2. é 置说æ
æ°æ®åºé ç½®ï¼PostgreSQLï¼
请æç §ä»¥ä¸åæ°é ç½®æ°æ®åºè¿æ¥ä¿¡æ¯ï¼ä¹æ¯æMysqlå¯èªè¡ä¿®æ¹ï¼
| é 置项 | å¡«åå¼ | 说æ |
|---|---|---|
DB_HOST |
db |
æ°æ®åºæå¡åç§° (å¯¹åº docker-compose.yml ä¸çæå¡å) |
DB_PORT |
5432 |
é»è®¤ PostgreSQL ç«¯å£ |
DB_USER |
bettafish |
æ°æ®åºç¨æ·å |
DB_PASSWORD |
bettafish |
æ°æ®åºå¯ç |
DB_NAME |
bettafish |
æ°æ®åºåç§° |
| å ¶ä» | ä¿æé»è®¤ | æ°æ®åºè¿æ¥æ± çå ¶ä»åæ°è¯·ä¿æé»è®¤è®¾ç½®ã |
大模åé ç½®
æä»¬ææ LLM è°ç¨ä½¿ç¨ OpenAI ç API æ¥å£æ å
å¨å®ææ°æ®åºé ç½®åï¼è¯·æ£å¸¸é ç½®ææå¤§æ¨¡åç¸å ³çåæ°ï¼ç¡®ä¿ç³»ç»è½å¤è¿æ¥å°æ¨éæ©ç大模åæå¡ã
宿ä¸è¿°ææé 置并ä¿ååï¼ç³»ç»å³å¯æ£å¸¸è¿è¡ã
ð§ æºç å¯å¨æå
å¦æä½ æ¯å次å¦ä¹ ä¸ä¸ªAgentç³»ç»çæå»ºï¼å¯ä»¥ä»ä¸ä¸ªé常ç®åçdemoå¼å§ï¼Deep Search Agent Demo
ç¯å¢è¦æ±
- æä½ç³»ç»: WindowsãLinuxãMacOS
- Pythonçæ¬: 3.9+
- Conda: AnacondaæMiniconda
- æ°æ®åº: PostgreSQLï¼æ¨èï¼æMySQL
- å å: 建议2GB以ä¸
1. å建ç¯å¢
å¦æä½¿ç¨Conda
# å建condaç¯å¢
conda create -n your_conda_name python=3.11
conda activate your_conda_name
å¦æä½¿ç¨uv
# å建uvç¯å¢
uv venv --python 3.11 # å建3.11ç¯å¢
2. å®è£ PDF å¯¼åºæéç³»ç»ä¾èµï¼å¯éï¼
è¿é¨åæè¯¦ç»çé 置说æï¼é ç½®æéä¾èµ
3. å®è£ ä¾èµå
å¦æè·³è¿äºæ¥éª¤2ï¼weasyprintåºå¯è½æ æ³å®è£ ï¼PDFåè½å¯è½æ æ³æ£å¸¸ä½¿ç¨ã
# åºç¡ä¾èµå®è£
pip install -r requirements.txt
# uvçæ¬å½ä»¤ï¼æ´å¿«éå®è£
ï¼
uv pip install -r requirements.txt
# 妿䏿³ä½¿ç¨æ¬å°æ
æåææ¨¡åï¼ç®åéæ±å¾å°ï¼é»è®¤å®è£
cpuçæ¬ï¼ï¼å¯ä»¥å°è¯¥æä»¶ä¸ç"æºå¨å¦ä¹ "é¨å注éæåæ§è¡æä»¤
4. å®è£ Playwrightæµè§å¨é©±å¨
# å®è£
æµè§å¨é©±å¨ï¼ç¨äºç¬è«åè½ï¼
playwright install chromium
5. é ç½®LLM䏿°æ®åº
å¤å¶ä¸ä»½é¡¹ç®æ ¹ç®å½ .env.example æä»¶ï¼å½å为 .env
ç¼è¾ .env æä»¶ï¼å¡«å
¥æ¨çAPIå¯é¥ï¼æ¨ä¹å¯ä»¥éæ©èªå·±ç模åãæç´¢ä»£çï¼è¯¦æ
è§æ ¹ç®å½.env.exampleæä»¶å
ææ ¹ç®å½config.pyä¸ç说æï¼ï¼
# ====================== æ°æ®åºé
ç½® ======================
# æ°æ®åºä¸»æºï¼ä¾å¦localhost æ 127.0.0.1
DB_HOST=your_db_host
# æ°æ®åºç«¯å£å·ï¼é»è®¤ä¸º3306
DB_PORT=3306
# æ°æ®åºç¨æ·å
DB_USER=your_db_user
# æ°æ®åºå¯ç
DB_PASSWORD=your_db_password
# æ°æ®åºåç§°
DB_NAME=your_db_name
# æ°æ®åºå符éï¼æ¨èutf8mb4ï¼å
¼å®¹emoji
DB_CHARSET=utf8mb4
# æ°æ®åºç±»åpostgresqlæmysql
DB_DIALECT=postgresql
# æ°æ®åºä¸éè¦åå§åï¼æ§è¡app.pyæ¶ä¼èªå¨æ£æµ
# ====================== LLMé
ç½® ======================
# æ¨å¯ä»¥æ´æ¹æ¯ä¸ªé¨åLLM使ç¨çAPIï¼åªè¦å
¼å®¹OpenAIè¯·æ±æ ¼å¼é½å¯ä»¥
# é
ç½®æä»¶å
é¨ç»äºæ¯ä¸ä¸ªAgentçæ¨èLLMï¼å次é¨ç½²è¯·å
åèæ¨è设置
# Insight Agent
INSIGHT_ENGINE_API_KEY=
INSIGHT_ENGINE_BASE_URL=
INSIGHT_ENGINE_MODEL_NAME=
# Media Agent
...
6. å¯å¨ç³»ç»
6.1 宿´ç³»ç»å¯å¨ï¼æ¨èï¼
# å¨é¡¹ç®æ ¹ç®å½ä¸ï¼æ¿æ´»condaç¯å¢
conda activate your_conda_name
# å¯å¨ä¸»åºç¨å³å¯
python app.py
uv çæ¬å¯å¨å½ä»¤
# å¨é¡¹ç®æ ¹ç®å½ä¸ï¼æ¿æ´»uvç¯å¢
.venv\Scripts\activate
# å¯å¨ä¸»åºç¨å³å¯
python app.py
注1ï¼ä¸æ¬¡è¿è¡ç»æ¢åï¼streamlit appå¯è½ç»æå¼å¸¸ä»ç¶å ç¨ç«¯å£ï¼æ¤æ¶æç´¢å ç¨ç«¯å£çè¿ç¨killæå³å¯
注2ï¼æ°æ®ç¬åéè¦åç¬æä½ï¼è§6.3æå¼
è®¿é® http://localhost:5000 å³å¯ä½¿ç¨å®æ´ç³»ç»
6.2 åç¬å¯å¨æä¸ªAgent
# å¯å¨QueryEngine
streamlit run SingleEngineApp/query_engine_streamlit_app.py --server.port 8503
# å¯å¨MediaEngine
streamlit run SingleEngineApp/media_engine_streamlit_app.py --server.port 8502
# å¯å¨InsightEngine
streamlit run SingleEngineApp/insight_engine_streamlit_app.py --server.port 8501
6.3 ç¬è«ç³»ç»åç¬ä½¿ç¨
è¿é¨åæè¯¦ç»çé ç½®ææ¡£ï¼MindSpider使ç¨è¯´æ
MindSpider è¿è¡ç¤ºä¾
# è¿å
¥ç¬è«ç®å½
cd MindSpider
# 项ç®åå§å
python main.py --setup
# è¿è¡è¯é¢æåï¼è·åçç¹æ°é»åå
³é®è¯ï¼
python main.py --broad-topic
# è¿è¡å®æ´ç¬è«æµç¨
python main.py --complete --date 2024-01-20
# ä»
è¿è¡è¯é¢æå
python main.py --broad-topic --date 2024-01-20
# ä»
è¿è¡æ·±åº¦ç¬å
python main.py --deep-sentiment --platforms xhs dy wb
6.4 å½ä»¤è¡æ¥åçæå·¥å ·
è¯¥å·¥å ·ä¼è·³è¿ä¸ä¸ªåæå¼æçè¿è¡é¶æ®µï¼ç´æ¥è¯»åå®ä»¬çææ°æ¥å¿æä»¶ï¼å¹¶å¨æ é Web çé¢çæ åµä¸çæç»¼åæ¥åï¼åæ¶çç¥æä»¶å¢éæ ¡éªæ¥éª¤ï¼ãé常ç¨äºå¯¹æ¥åçæç»æä¸æ»¡æãéè¦å¿«ééè¯çåºæ¯ï¼æå¨è°è¯ Report Engine æ¶å¯ç¨ã
# åºæ¬ä½¿ç¨ï¼èªå¨ä»æä»¶åæå主é¢ï¼
python report_engine_only.py
# æå®æ¥å主é¢
python report_engine_only.py --query "忍工ç¨è¡ä¸åæ"
# è·³è¿PDFçæï¼å³ä½¿ç³»ç»æ¯æï¼
python report_engine_only.py --skip-pdf
# æ¾ç¤ºè¯¦ç»æ¥å¿
python report_engine_only.py --verbose
# æ¥ç帮å©ä¿¡æ¯
python report_engine_only.py --help
åè½è¯´æï¼
- èªå¨æ£æ¥ä¾èµï¼ç¨åºä¼èªå¨æ£æ¥PDFçææéçç³»ç»ä¾èµï¼å¦æç¼ºå¤±ä¼ç»åºå®è£ æç¤º
- è·åææ°æä»¶ï¼èªå¨ä»ä¸ä¸ªå¼æç®å½ï¼
insight_engine_streamlit_reportsãmedia_engine_streamlit_reportsãquery_engine_streamlit_reportsï¼è·åææ°çåææ¥å - æä»¶ç¡®è®¤ï¼æ¾ç¤ºææéæ©çæä»¶åãè·¯å¾åä¿®æ¹æ¶é´ï¼çå¾
ç¨æ·ç¡®è®¤ï¼é»è®¤è¾å
¥
yç»§ç»ï¼è¾å ¥néåºï¼ - ç´æ¥çææ¥åï¼è·³è¿æä»¶å¢å å®¡æ ¸ç¨åºï¼ç´æ¥è°ç¨Report Engineçæç»¼åæ¥å
- èªå¨ä¿åæä»¶ï¼
- HTMLæ¥åä¿åå°
final_reports/ç®å½ - PDFæ¥åï¼å¦ææä¾èµï¼ä¿åå°
final_reports/pdf/ç®å½ - æä»¶å½åæ ¼å¼ï¼
final_report_{主é¢}_{æ¶é´æ³}.html/pdf
- HTMLæ¥åä¿åå°
注æäºé¡¹ï¼
- ç¡®ä¿ä¸ä¸ªå¼æç®å½ä¸è³å°æä¸ä¸ªå
å«
.mdæ¥åæä»¶ - å½ä»¤è¡å·¥å ·ä¸Webçé¢ç¸äºç¬ç«ï¼ä¸ä¼ç¸äºå½±å
- PDFçæéè¦å®è£ ç³»ç»ä¾èµï¼è¯¦è§ä¸æ"å®è£ PDF å¯¼åºæéç³»ç»ä¾èµ"é¨å
âï¸ é«çº§é ç½®ï¼å·²è¿æ¶ï¼å·²ç»ç»ä¸ä¸ºé¡¹ç®æ ¹ç®å½.envæä»¶ç®¡çï¼å ¶ä»åagentèªå¨ç»§æ¿æ ¹ç®å½é ç½®ï¼
ä¿®æ¹å ³é®åæ°
Agenté ç½®åæ°
æ¯ä¸ªAgent齿ä¸é¨çé ç½®æä»¶ï¼å¯æ ¹æ®éæ±è°æ´ï¼ä¸é¢æ¯é¨å示ä¾ï¼
# QueryEngine/utils/config.py
class Config:
max_reflections = 2 # åæè½®æ¬¡
max_search_results = 15 # æå¤§æç´¢ç»ææ°
max_content_length = 8000 # æå¤§å
容é¿åº¦
# MediaEngine/utils/config.py
class Config:
comprehensive_search_limit = 10 # 综åæç´¢éå¶
web_search_limit = 15 # ç½é¡µæç´¢éå¶
# InsightEngine/utils/config.py
class Config:
default_search_topic_globally_limit = 200 # å
¨å±æç´¢éå¶
default_get_comments_limit = 500 # è¯è®ºè·åéå¶
max_search_results_for_llm = 50 # ä¼ ç»LLMçæå¤§ç»ææ°
æ æåææ¨¡åé ç½®
# InsightEngine/tools/sentiment_analyzer.py
SENTIMENT_CONFIG = {
'model_type': 'multilingual', # å¯é: 'bert', 'multilingual', 'qwen'ç
'confidence_threshold': 0.8, # 置信度éå¼
'batch_size': 32, # æ¹å¤ç大å°
'max_sequence_length': 512, # æå¤§åºåé¿åº¦
}
æ¥å ¥ä¸åçLLM模å
æ¯æä»»æopenAIè°ç¨æ ¼å¼çLLMæä¾åï¼åªéè¦å¨/config.pyä¸å¡«å对åºçKEYãBASE_URLãMODEL_NAMEå³å¯ã
ä»ä¹æ¯openAIè°ç¨æ ¼å¼ï¼ä¸é¢æä¾ä¸ä¸ªç®åçä¾åï¼
from openai import OpenAI client = OpenAI(api_key="your_api_key", base_url="https://api.siliconflow.cn/v1") response = client.chat.completions.create( model="Qwen/Qwen2.5-72B-Instruct", messages=[ {'role': 'user', 'content': "æ¨ç模åä¼ç»å¸åºå¸¦æ¥åªäºæ°çæºä¼"} ], ) complete_response = response.choices[0].message.content print(complete_response)
æ´æ¹æ æåææ¨¡å
ç³»ç»éæäºå¤ç§æ æåææ¹æ³ï¼å¯æ ¹æ®éæ±éæ©ï¼
1. å¤è¯è¨æ æåæ
cd SentimentAnalysisModel/WeiboMultilingualSentiment
python predict.py --text "This product is amazing!" --lang "en"
2. å°åæ°Qwen3å¾®è°
cd SentimentAnalysisModel/WeiboSentiment_SmallQwen
python predict_universal.py --text "è¿æ¬¡æ´»å¨åå¾å¾æå"
3. åºäºBERTçå¾®è°æ¨¡å
# 使ç¨BERTä¸ææ¨¡å
cd SentimentAnalysisModel/WeiboSentiment_Finetuned/BertChinese-Lora
python predict.py --text "è¿ä¸ªäº§åççå¾ä¸é"
4. GPT-2 LoRAå¾®è°æ¨¡å
cd SentimentAnalysisModel/WeiboSentiment_Finetuned/GPT2-Lora
python predict.py --text "ä»å¤©å¿æ
ä¸å¤ªå¥½"
5. ä¼ ç»æºå¨å¦ä¹ æ¹æ³
cd SentimentAnalysisModel/WeiboSentiment_MachineLearning
python predict.py --model_type "svm" --text "æå¡æåº¦éè¦æ¹è¿"
æ¥å ¥èªå®ä¹ä¸å¡æ°æ®åº
1. ä¿®æ¹æ°æ®åºè¿æ¥é ç½®
# config.py 䏿·»å æ¨çä¸å¡æ°æ®åºé
ç½®
BUSINESS_DB_HOST = "your_business_db_host"
BUSINESS_DB_PORT = 3306
BUSINESS_DB_USER = "your_business_user"
BUSINESS_DB_PASSWORD = "your_business_password"
BUSINESS_DB_NAME = "your_business_database"
2. å建èªå®ä¹æ°æ®è®¿é®å·¥å ·
# InsightEngine/tools/custom_db_tool.py
class CustomBusinessDBTool:
"""èªå®ä¹ä¸å¡æ°æ®åºæ¥è¯¢å·¥å
·"""
def __init__(self):
self.connection_config = {
'host': config.BUSINESS_DB_HOST,
'port': config.BUSINESS_DB_PORT,
'user': config.BUSINESS_DB_USER,
'password': config.BUSINESS_DB_PASSWORD,
'database': config.BUSINESS_DB_NAME,
}
def search_business_data(self, query: str, table: str):
"""æ¥è¯¢ä¸å¡æ°æ®"""
# å®ç°æ¨çä¸å¡é»è¾
pass
def get_customer_feedback(self, product_id: str):
"""è·å客æ·å馿°æ®"""
# å®ç°å®¢æ·å馿¥è¯¢é»è¾
pass
3. éæå°InsightEngine
# InsightEngine/agent.py ä¸éæèªå®ä¹å·¥å
·
from .tools.custom_db_tool import CustomBusinessDBTool
class DeepSearchAgent:
def __init__(self, config=None):
# ... å
¶ä»åå§å代ç
self.custom_db_tool = CustomBusinessDBTool()
def execute_custom_search(self, query: str):
"""æ§è¡èªå®ä¹ä¸å¡æ°æ®æç´¢"""
return self.custom_db_tool.search_business_data(query, "your_table")
èªå®ä¹æ¥å模æ¿
1. å¨Webçé¢ä¸ä¸ä¼
ç³»ç»æ¯æä¸ä¼ èªå®ä¹æ¨¡æ¿æä»¶ï¼.mdæ.txtæ ¼å¼ï¼ï¼å¯å¨çææ¥åæ¶éæ©ä½¿ç¨ã
2. åå»ºæ¨¡æ¿æä»¶
å¨ ReportEngine/report_template/ ç®å½ä¸å建æ°ç模æ¿ï¼æä»¬çAgentä¼èªè¡éç¨æåéçæ¨¡æ¿ã
ð¤ è´¡ç®æå
æä»¬æ¬¢è¿ææå½¢å¼çè´¡ç®ï¼
请é 读以ä¸è´¡ç®æåï¼
- CONTRIBUTING.md
ð¦ ä¸ä¸æ¥å¼å计å
ç°å¨ç³»ç»åªå®æäº"䏿¿æ§"ä¸çå两æ¥ï¼å³ï¼è¾å ¥è¦æ±->详ç»åæï¼è¿ç¼ºå°ä¸æ¥é¢æµï¼ç´æ¥å°ä»ç»§ç»äº¤ç»LLMæ¯ä¸å ·æè¯´æåçã
ç®åæä»¬ç»è¿å¾é¿ä¸æ®µæ¶é´çç¬åæ¶éï¼æ¥æäºå¤§éå ¨ç½è¯é¢çåº¦éæ¶é´ãçç¹ççååè¶å¿çåº¦æ°æ®ï¼å·²ç»å ·å¤äºå¯ä»¥å¼å颿µæ¨¡åçæ¡ä»¶ãæä»¬å¢éå°è¿ç¨æ¶åºæ¨¡åãå¾ç¥ç»ç½ç»ã夿¨¡æèåç颿µæ¨¡åææ¯å¨å¤äºæ¤ï¼å®ç°çæ£åºäºæ°æ®é©±å¨çèæ é¢æµåè½ã
â ï¸ å 责声æ
éè¦æéï¼æ¬é¡¹ç®ä» ä¾å¦ä¹ ã妿¯ç ç©¶åæè²ç®ç使ç¨
-
åè§æ§å£°æï¼
- æ¬é¡¹ç®ä¸çææä»£ç ãå·¥å ·ååè½åä» ä¾å¦ä¹ ã妿¯ç ç©¶åæè²ç®ç使ç¨
- 严ç¦å°æ¬é¡¹ç®ç¨äºä»»ä½åä¸ç¨éæç婿§æ´»å¨
- 严ç¦å°æ¬é¡¹ç®ç¨äºä»»ä½è¿æ³ãè¿è§æä¾µç¯ä»äººæççè¡ä¸º
-
ç¬è«åè½å è´£ï¼
- 项ç®ä¸çç¬è«åè½ä» ç¨äºææ¯å¦ä¹ åç ç©¶ç®ç
- 使ç¨è å¿ é¡»éµå®ç®æ ç½ç«çrobots.txtåè®®åä½¿ç¨æ¡æ¬¾
- 使ç¨è å¿ é¡»éµå®ç¸å ³æ³å¾æ³è§ï¼ä¸å¾è¿è¡æ¶æç¬åææ°æ®æ»¥ç¨
- å 使ç¨ç¬è«åè½äº§çç任使³å¾åæç±ä½¿ç¨è èªè¡æ¿æ
-
æ°æ®ä½¿ç¨å è´£ï¼
- é¡¹ç®æ¶åçæ°æ®åæåè½ä» ä¾å¦æ¯ç 究使ç¨
- 严ç¦å°åæç»æç¨äºåä¸å³çæçå©ç®ç
- 使ç¨è åºç¡®ä¿æåææ°æ®çåæ³æ§ååè§æ§
-
ææ¯å è´£ï¼
- æ¬é¡¹ç®æ"ç°ç¶"æä¾ï¼ä¸æä¾ä»»ä½æç¤ºææç¤ºçä¿è¯
- ä½è ä¸å¯¹ä½¿ç¨æ¬é¡¹ç®é æçä»»ä½ç´æ¥æé´æ¥æå¤±æ¿æ 责任
- 使ç¨è åºèªè¡è¯ä¼°é¡¹ç®çéç¨æ§åé£é©
-
责任éå¶ï¼
- 使ç¨è å¨ä½¿ç¨æ¬é¡¹ç®ååºå åäºè§£ç¸å ³æ³å¾æ³è§
- 使ç¨è åºç¡®ä¿å ¶ä½¿ç¨è¡ä¸ºç¬¦åå½å°æ³å¾æ³è§è¦æ±
- å è¿åæ³å¾æ³è§ä½¿ç¨æ¬é¡¹ç®è产ççä»»ä½åæç±ä½¿ç¨è èªè¡æ¿æ
请å¨ä½¿ç¨æ¬é¡¹ç®åä»ç»é 读并çè§£ä¸è¿°å 责声æãä½¿ç¨æ¬é¡¹ç®å³è¡¨ç¤ºæ¨å·²åæå¹¶æ¥åä¸è¿°æææ¡æ¬¾ã
ð 许å¯è¯
æ¬é¡¹ç®éç¨ GPL-2.0许å¯è¯ã详ç»ä¿¡æ¯è¯·åé LICENSEæä»¶ã
ð æ¯æä¸èç³»
è·å帮å©
常è§é®é¢è§£çï¼https://github.com/666ghj/BettaFish/issues/185
- 项ç®ä¸»é¡µï¼GitHubä»åº
- é®é¢åé¦ï¼Issues页é¢
- åè½å»ºè®®ï¼Discussions页é¢
èç³»æ¹å¼
- ð§ é®ç®±ï¼[email protected]
åå¡åä½
- ä¼ä¸å®å¶å¼å
- å¤§æ°æ®æå¡
- 妿¯åä½
- ææ¯å¹è®
ð¥ è´¡ç®è
æè°¢ä»¥ä¸ä¼ç§çè´¡ç®è 们ï¼
ð å å ¥å®æ¹äº¤æµç¾¤