Toilを無くして徒然なるままに日暮し硯に向かひたい

生成AIアプリケーション開発などを行うエンジニアのブログです。

LangChainでgithubリポジトリのソースコードを読む方法

shu-kob.hateblo.jp

昨日の記事に関連して、今回はLangChainでgithubリポジトリソースコードを読む方法です。

github.com

サンプルソースコードを載せています。

js.langchain.com

↑使い方はこちら

実行例

npx ts-node githubLoader.ts https://github.com/shu-kob/langchain-sample-code
Document {
  pageContent: "import { CheerioWebBaseLoader } from '@langchain/community/document_loaders/web/cheerio'\n" +
    "import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'\n" +
    "import { HtmlToTextTransformer } from '@langchain/community/document_transformers/html_to_text'\n" +
    '\n' +
    'const url = process.argv[2]\n' +
    '\n' +
    'async function webLoad (url: string) {\n' +
    '  const loader = new CheerioWebBaseLoader(url)\n' +
    '  const docs = await loader.load()\n' +
    "  const splitter = RecursiveCharacterTextSplitter.fromLanguage('html')\n" +
    '  const transformer = new HtmlToTextTransformer()\n' +
    '  const sequence = splitter.pipe(transformer)\n' +
    '  const newDocuments = await sequence.invoke(docs)\n' +
    "  console.log('newDocuments:')\n" +
    '  console.log(newDocuments)\n' +
    '}\n' +
    '\n' +
    'webLoad(url)\n',
  metadata: {
    source: 'cheerioWebBaseLoader.ts',
    repository: 'https://github.com/shu-kob/langchain-sample-code',
    branch: 'main'
  },
  id: undefined
}
Document {
  pageContent: "import { GithubRepoLoader } from '@langchain/community/document_loaders/web/github'\n" +
    '\n' +
    'const url = process.argv[2]\n' +
    '\n' +
    'async function readSorceCodesFromGithub(url: string) {\n' +
    '\n' +
    '  const loader = new GithubRepoLoader(\n' +
    '    url,\n' +
    '    {\n' +
    '      branch: "main", // Defaultブランチが "master" でないか注意。他のブランチも選択可能\n' +
    '      recursive: true,\n' +
    '      processSubmodules: true,\n' +
    '      unknown: "warn",\n' +
    '      maxConcurrency: 5, // Defaults to 2\n' +
    '      ignorePaths: ["*.json", "*.yaml", "*.yml", "*config*", "*.md", "Dockerfile", "*ignore", ".eslintrc.js", "*.svg"] // 除外するファイルパス\n' +
    '    }\n' +
    '  );\n' +
    '\n' +
    '  for await (const doc of loader.loadAsStream()) {\n' +
    '    console.log(doc)\n' +
    '  }\n' +
    '};\n' +
    '\n' +
    'readSorceCodesFromGithub(url)\n',
  metadata: {
    source: 'githubLoader.ts',
    repository: 'https://github.com/shu-kob/langchain-sample-code',
    branch: 'main'
  },
  id: undefined
}
Document {
  pageContent: "import * as cheerio from 'cheerio'\n" +
    '\n' +
    'const url = process.argv[2]\n' +
    '\n' +
    'async function webLoad (url: string) {\n' +
    '  // HTMLの取得\n' +
    '  const response = await fetch(url)\n' +
    '  const htmlText = await response.text()\n' +
    '  const cheerioText = cheerio.load(htmlText)\n' +
    '\n' +
    '  // styleとscriptを除去\n' +
    "  cheerioText('style').remove()\n" +
    "  cheerioText('script').remove()\n" +
    '\n' +
    "  const bodyContent: string = cheerioText('body').text().replace(/\\s+/g, '')\n" +
    '\n' +
    "  console.log('bodyContent:')\n" +
    '  console.log(bodyContent)\n' +
    '  return bodyContent\n' +
    '}\n' +
    '\n' +
    'webLoad(url)\n',
  metadata: {
    source: 'webLoad.ts',
    repository: 'https://github.com/shu-kob/langchain-sample-code',
    branch: 'main'
  },
  id: undefined
}

これらのソースコードをプロンプトに含めて、生成AIに投げます。

例えば、GitHubリポジトリの仕様を聞くなどです。

多くの場合、ソースコードの文量は多くなり、それなりのトークン数になるので、

200万トークン対応のGemini-1.5などを使うのが良いでしょう。