Markdown 长文本分割为小段内容,发送给 Github Copilot SDK 逐个处理,规避 context deadline exceeded

文章目录

    基于 Github Copilot SDK 的免费模型,做了一个中文翻译英文的本地服务(参考前文:博客新功能,中文版自动翻译为英文,基于 Github Copilot SDK 的免费 gpt 5 mini 模型)。但是在处理长文本时,总是不能返回完整的翻译结果,并且报错。

    异常报错内容

    在处理长文本时,Github Copilot SDK 可能会报错:

    waiting for session.idle: context deadline exceeded

    并不是不处理,而是返回一定长度的内容后,就没有继续返回了。这种情况通常出现在需要返回较长文本的场景,例如翻译长文、生成长文等。

    我不确定是返回的 token 长度有限制,还是请求的总时长有限制,或者是其他原因导致的。在官方的 github issue 里也没有找到相关的讨论。

    分割 Markdown 长文本

    为了绕过这个问题,我尝试将 Markdown 长文本分割成小段内容,逐个发送给 Github Copilot SDK 处理。这样每次处理的文本长度就不会太长,应该能够避免报错。
    至少目前在翻译短标题的场景下,从来没有遇到过这个问题。

    因为需要翻译的文本都是我自己写的博客,没有太复杂的结构,就是正常的 markdown 格式。所以,我按照 markdown 的二级标题来进行分割。每当遇到一个二级标题,就认为是一个新的段落,进行一次翻译请求。最后再把翻译结果拼接起来,形成完整的翻译文本。测试了一下,效果不错:

    Connected to server. Waiting for tasks...
    Received task for Article ID: 1661
    Translating Title...
    Translating Content in segments...
    Translating Content Fragment 1/3...
    Translating Content Fragment 2/3...
    Translating Content Fragment 3/3...
    Result sent successfully.
    

    切割 Markdown 的三方库

    目前的基于二级标题的方式确实能解决我自己的问题,但是如果是一个结构更复杂,段落更长的 Markdown 文本,这种方式可能就不太适用了。比如说,如果一个段落下面还有三级标题,或者有很多的列表、代码块等,那么按照二级标题切割可能就不够细粒度了。

    找到一个 golang 的 langchaingo 三方库,提供了文本切割的功能,可以按照 markdown 的结构进行切割

    https://pkg.go.dev/github.com/tmc/langchaingo/textsplitter

    langchaingo 是什么?

    Building applications with LLMs through composability, with Go! This is the Go language implementation of LangChain.

    为了我这么个简单的需求引入 langchaingo,感觉有点臃肿了,暂时先不考虑了。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式