AI 관련 워크로드를 구현하는 코드를 작성할 때, RAG에 앞서 전처리를 수행하는 것을 많이 고민하게 됩니다. 이 때, 블로그 아티클이나 포털 뉴스 기사처럼 본문이 아닌 다른 영역이나 주변부 콘텐츠들이 섞여있어 골라내기 쉽지 않은 종류의 페이지들을 처리하는 것이 무척 중요합니다.
이런 부분을 파이썬 측 라이브러리나 AI의 추가 도움 없이 빠르게 추출할 수 있는 방법을 간단히 구현해보았습니다. ReverseMarkdown과 SmartReader nuget 패키지 2개면 충분합니다.
var url = "https://n.news.naver.com/mnews/article/003/0013545358";
var parseResult = await SmartReader.Reader.ParseArticleAsync(url);
var converter = new ReverseMarkdown.Converter(new ReverseMarkdown.Config()
{
CleanupUnnecessarySpaces = true,
GithubFlavored = true,
SmartHrefHandling = true,
UnknownTags = ReverseMarkdown.Config.UnknownTagsOption.Bypass,
});
var contentTitle = converter.Convert($"<h1>{parseResult.Title}</h1>");
Console.WriteLine(contentTitle);
var contentMarkdown = converter.Convert(parseResult.Content);
Console.WriteLine(contentMarkdown);
그러면 아래와 같이 마크다운 문서를 본문에서 정확히 추출할 수 있습니다.
만약 LINQPad에서 실제로 마크다운을 렌더링해보고 싶으시다면, 아래처럼 코드를 작성하면 렌더링된 모습도 볼 수 있습니다. (단 이것은 Chromium 렌더링 엔진을 사용하는 LINQPad 8 이상이 필요합니다.)
Util.RawHtml($"<script src=\"https://cdn.jsdelivr.net/gh/MarketingPipeline/Markdown-Tag/markdown-tag.js\"></script><md>{contentMarkdown}</md>").Dump();