1. はじめに質問: 技術専門家にとっての精神的な栄養とは何でしょうか? AIが最初に提案したポイントは「知識と学習」でした。学習方法はたくさんありますが、私にとって、新しい技術やトレンドに関する情報を常に把握しておくことは、職業への情熱を維持するために不可欠です。日々のタスクをこなすことで基本的な物質的な基盤は確保できますが、最終的には、人々は精神的な価値を追求したいと考えているのです😂。 しかし、日々の仕事に既に多くの時間が取られており、さらに日々の雑用もこなさなければならないため、新しい知識を集めて学ぶ時間はありません。もし、トレンドのテクノロジーを自動的に捉え、長文を100~200語の要約にまとめてくれるツールがあれば、毎日わずか30分で情報を消化できるでしょう!(要約を読むのは、まるで記事を読んでいるような感覚です😁)。 2. 実装アプローチ このプロセスは、情報収集→情報解釈→結果表示という3つのステップで構成されます。具体的には以下のとおりです。 ① 情報収集:関心のあるコンテンツを収集します。これは、API集約、RSS、またはカスタムWebクローラーを使用して実現できます。 ② 情報解釈:大規模モデルを通してコンテンツを解釈する。現在、クライアントから直接アクセスできる大規模モデルのほとんどは検索機能を備えており、Webページを送信するだけで概要が生成されます。しかし、大規模モデルのオープンAPIの多くは検索機能を備えておらず、ユーザーはWebページのコンテンツを手動でクロールし、APIに渡すことで処理する必要があります。 ③ 結果表示:論文の原文情報と解釈された要旨が一定の形式で表示されます。 3. 実施計画余暇を利用して、developer-hotspots-summaryというデモを作成しました。これは基本的に、設定されたランキングリストに基づいて情報をクロールして解釈する機能を実装していますが、「記事重複データフィルタリング」「カスタムクローラー」「記事コンテンツの前処理」といった機能はまだ含まれていません。これらは今後徐々に改善していく予定です。生成された結果のサンプルを以下に示します。完全なデータについては、☞ 生成されたサンプルをご覧ください。 実装スキームについて簡単に説明します。 3.1 情報収集情報収集は主に、関心のあるコンテンツの収集を伴います。これは、API集約、RSS、またはカスタムウェブクローラーを使用して実現できます。現在のデモでは、API集約とRSSに基づくコンテンツ収集を実装しています。各手法の基本的な実装方法は以下のとおりです。 ① 集計API アグリゲータAPIは情報をカプセル化し、使いやすいインターフェースを提供しているため、最も習得しやすいツールです。しかし、タダ飯はありません。一般的に、呼び出し回数に応じて料金が発生します。このデモでは、Today's Hot ListのオープンAPIであるTophubdataを使用しています。Tophubdataは現在7500以上のデータソースを提供しています。 API呼び出しも非常に簡潔です。データソースの種類を変更することで、最新のデータをリアルタイムで取得できます。具体的なコード実装については、DEMOソースコードをご覧ください。 curl --location 'https://api.tophubdata.com/nodes/mproPpoq6O' --header '認証: YOUR_ACCESS_KEY' {
"エラー":false,
「ステータス」:200
"データ": {
"ハシッド": "mproPpoq6O",
"名前": "ジフ",
"display": "ホットリスト",
「ドメイン」:「zhihu.com」
「ロゴ」:「********」、
「アイテム」: [
{
"extra": "455万回視聴",
「URL」: 「https://www.zhihu.com/question/629047878」
「サムネイル」: 「https://pica.zhimg.com/80/v2-00a693d9ac81c601223512d5725cbacd_1440w.png」
「説明」:「FRBの利上げサイクルはついに終わりを迎えようとしているようだ。」
タイトル:「ドルが急落、10年国債利回りが急落、オフショア人民元が400ポイント急騰、米国株が5日続伸:FRBの利上げサイクルは終わったのか?」
},
{
"extra": "206万回視聴",
「URL」: 「https://www.zhihu.com/question/621684259」
「サムネイル」: 「https://pic3.zhimg.com/50/v2-0e599dcb44ad61215462fdfbb58d983e_qhd.jpg」
"description": "年上の親戚には、まるで境界線がないように感じます。彼らはいつも私の私生活や個人的な事柄に、際限なく詮索してくるので、とても不快です。どう丁寧に対応すればいいでしょうか?"
タイトル:「休日の集まりでは、親戚がいつも私の境界線を『侵害』しているように感じます。私が敏感すぎるのでしょうか、それとも『親戚のPTSD』が影響しているのでしょうか?」
}
...
]
}
}その他の機能としては、履歴データの取得やWebHook機能などがあります。APIドキュメントをご自身で確認することもできますが、これらの機能の利用には料金がかかるため、長期的なソリューションとしては適していません。 ② RSSソース ウェブサイトが RSS をサポートしている場合は、RSS フィードを通じてページの最新のコンテンツ情報を取得できます。 フィードが提供されていない場合は、RSSHubプロジェクトに感謝しましょう。RSSはあらゆる種類の珍しいウェブサイトのRSSフィードを生成できるため、まさに「あらゆるもののためのRSS」です。RSSHub RadarまたはスクリプトベースのRSS+と組み合わせて現在のページのRSSフィードを検出すれば、購読しているフィードが見つからないという心配はもうありません。さらに詳しい情報については、「WeChat公式アカウントを含む、おそらく2023年で最も包括的なRSSフィードコレクション!」の記事をご覧ください。人気のRSSフィードはtop-rss-listでご覧いただけます。 RSS フィードを取得する方法を紹介した後、次のコードは RSS フィードから記事名と URL を抽出する方法を示しています。 feedparserdef parse_rss_feed(rss_url) をインポートします。
# RSSフィードを解析します: feed = feedparser.parse(rss_url)
# 結果を保存するリストを作成する result = []
# 各エントリを反復処理し、タイトルとリンクを抽出して結果リストに追加します。feed.entries のエントリの場合:
アイテム = {
'タイトル': エントリ.タイトル,
'url': エントリ.リンク }
結果.append(アイテム)
結果を返す # RSS フィード URL の例 rss_url = 'https://www.shawnxie.top/feed.xml' # 関数を呼び出して結果を取得する parsed_feed = parse_rss_feed(rss_url) # parsed_feed 内のアイテムの結果を印刷します。
印刷(アイテム)③ カスタムウェブクローラー 上記の2つの方法のどちらも必要な情報を取得できない場合は、カスタムWebクローラーが唯一の選択肢となります。高度にカスタマイズされたロジックのため、この機能はデモではまだ提供されていません。次の例は、Juejin Hot Listからデータをスクレイピングするプロセスを示しています。Seleniumを使用してページを読み込み、BeautifulSoupを使用してHTMLを解析して必要な情報を抽出します。 Seleniumからwebdriverをインポート、Selenium.webdriver.chrome.serviceからServiceをインポート、webdriver_manager.chromeからChromeDriverManagerをインポート、timeからbs4をインポート、BeautifulSoup
url = 'https://juejin.cn/hot/articles/6809637769959178254'
# ブラウザオプションを設定する options = webdriver.ChromeOptions() options.add_argument('--headless') # ヘッドレスモード、ブラウザウィンドウを表示しない options.add_argument('--disable-gpu') # ブラウザを起動する driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get(url) # ページが読み込まれるまで待機する (ページの複雑さに応じて適切な待機時間を設定する) time.sleep(5) # ページの HTML を取得する html = driver.page_source # BeautifulSoup を使用して HTML を解析する soup = BeautifulSoup(html, 'html.parser') # すべての記事アイテムを検索する article_items = soup.find_all('a', class_='article-item-link') # 記事データを保存する articles = [] for item in article_items:
リンク = アイテム['href']
タイトル = item.find('div', class_='article-title').text.strip()
articles.append({'title': title, 'link': 'https://juejin.cn' + link}) # articles内の記事データを出力します。
print(f"タイトル: {article['title']}, リンク: {article['link']}") # ブラウザを閉じる driver.quit() 3.2 情報解釈記事内容の解釈は大規模モデルを用いて行います。大規模モデルに検索機能があるかどうかは、実装の容易さに影響します。OpenAIやGeminiのような検索機能が組み込まれた大規模モデルは、URLを送信するだけで要約できます。しかし、国内の大規模モデルAPIの多くはオフラインであり、事前にWebページのコンテンツをクロールして前処理する必要があります。そのため、デモでは、強力な文書要約機能を持つ大規模モデルKIMIを検索機能なしで使用しています。情報解釈機能は、以下の2つの部分で実装されています。 ① ウェブページコンテンツの検索 使用する大規模モデル API には検索機能がないため、Web ページの HTML の静的テキスト情報を取得して文字列に変換する必要があります。 Selenium から webdriver をインポートします。Selenium.webdriver.chrome.service から Service をインポートします。Webdriver_manager.chrome から ChromeDriverManager をインポートします。Selenium.webdriver.common.by から By をインポートします。Selenium.webdriver.support.ui から WebDriverWait をインポートします。Selenium.webdriver.support から expected_conditions をインポートします。EC から bs4 をインポートします。BeautifulSoupdef から fetch_article_content(url):
print(f"[LOG]fetch_article_content: {url}")
試す:
# ブラウザオプションを設定する options = webdriver.ChromeOptions()
options.add_argument('--headless') # ヘッドレスモード。ブラウザウィンドウは表示されません。options.add_argument('--disable-gpu')
# ブラウザを起動します。driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
ドライバー.get(url)
# ページの読み込みが完了するまで待機します WebDriverWait(driver, 10).until(
EC.要素の存在((By.TAG_NAME, "body"))
)
# ページコンテンツを取得する page_content = driver.page_source
ドライバー.quit()
# ページコンテンツを解析する soup = BeautifulSoup(page_content, 'html.parser')
テキスト = soup.get_text()
cleaned_lines = [line.strip() の場合、text.splitlines() 内の行は line.strip() です]
'\n'.join(cleaned_lines) を返します
except Exception を e として:
print(f"【ログ】記事内容の取得エラー: {e}")
なしを返す 直接取得したコンテンツには、コメント、著者情報、目次、おすすめ記事リストなど、多くのノイズが含まれており、AI生成に影響を与え、生成された結果が満足のいくものでなくなる可能性があります。そのため、コンテンツ取得後に「前処理」または「データクリーニング」のステップを追加し、より関連性の高いコンテンツのみを保持するのが最適です。現在のデモにはクリーニング機能はありませんが、後ほど一般的な実装ソリューションを検討する予定です。 ② 大規模モデルを用いた論文要約の生成 最初のステップで取得されたコンテンツは、大規模モデル API に渡され、記事の概要が生成されます。 from openai import OpenAI import fetch, time # Kimi API を呼び出して要約を生成します def summarize_content_kimi(url, key):
試す:
# Kimi APIは現在検索をサポートしていません。コンテンツの取得が必要です: content = fetch_article_content(url)
コンテンツ == None の場合: 戻り値
# Kimi APIを呼び出してサマリーを生成する client = OpenAI(
api_key = キー、
ベースURL = 'https://api.moonshot.cn/v1'、
)
完了 = client.chat.completions.create(
# 入力テキストが大きすぎる場合は、モデルを調整できます: model = "moonshot-v1-32k",
メッセージ = [
{"role": "system", "content": "あなたはKimiさんです。ソフトウェア開発技術ブログのコンテンツを要約するのが得意です。ユーザーに安全で役立つ、そして正確な回答を提供しています。"},
{"role": "user", "content": "ブログの内容を150語以内で要約してください。ブログの内容は次のとおりです: " + content}
],
温度 = 0.3
)
結果 = 完了.選択肢[0].メッセージ.コンテンツ
time.sleep(20) # 通話制御の頻度に注意してください。無料版では1分間に3回呼び出されます。 return result except Exception as e:
print(f"【ログ】AIによる記事要約に異常が発生しました: {e}")
なしを返す3.3 結果の発表原文情報と解釈された要約は特定の形式で表示されます。この要件は人によって異なりますが、著者にとっては読みやすさだけで十分であるため、マークダウン文字列を使用してシンプルなマークダウンテーブルを生成しました。 markdown_strings を md としてインポートします...contents = []file_title = date + 'Hot articles'contents.append(md.header(file_title, 1))contents.append(md.blockquote('Power By: [developer-hotspots-summary](https://github.com/Xiaoxie1994/developer-hotspots-summary).'))for key, value in result.items():
contents.append(md.header(キー, 2))
table_title = ['記事']
table_summary = ['概要']
アイテムの値:
table_title.append(f"[{item['title'].replace("|", "")}]({item['url'].replace(" ", "")})")
table_summary.append(item['summary'])
contents.append(md.table([table_title, table_summary])) をファイルとして open('./result/' + file_title + '.md', 'w', encoding="utf8") で追加します:
file.write("\n".join(contents))4. まとめこの種の機能の開発経験は全くなかったため、開発プロセス全体を通して、大規模なモデルの調査と使用にかなりの時間を費やしました。全体としては非常に成功しました。大規模モデルは多くのリクエストに対してほぼ理想的な解決策を提供し、詳細な問題も複数ターンの対話を通じて解決できました。デモにはまだ改善の余地が数多くあります。今後のアップデートでは、クローリングロジックの最適化に重点を置き、より自由なクローリング方法の提供と、重複記事のフィルタリング機能の追加を行います。記事解釈に関しては、検索機能を内蔵した大規模モデルをいくつか統合し、より正確で簡潔な解釈を実現する予定です。 最後に、より大きなモデルがどのように進化していくのか、とても楽しみですが、少し怖い気もします😂。しかし、歴史を振り返ると、生産力の解放はしばしば新たな生産力の創造につながります。歴史の奔流の中の塵のように、流れに身を任せましょう。 5. 参考文献• Seleniumブラウザ自動化プロジェクト• 2023年で最も包括的なRSSフィードの可能性。WeChat公式アカウントでも利用可能! • sum4all • GPT-4o |