基于langchaingo实现知识库对接本地模型ollama的分步探索
内容提要
本文介绍了使用langchaingo实现开发rag应用的流程。首先将知识库内容切分并向量化存入向量数据库,然后通过相似性检索找出匹配度高的答案,包装好Prompt。最后调用大语言模型进行分析并返回最终答案。通过示例代码演示了整个流程。文章提到调优可以提高结果预期值。
延伸解读
RAG 流程中的关键参数:chunkSize 与 chunkOverlap
文章通过 TextToChunks 函数将文档切分为块,其中 chunkSize 决定单个块的大小,chunkOverlap 决定块之间的重叠内容。示例中,默认参数下切分出 40 个块,而将 chunkSize 调整为 500 后,块数量减少到 13 个。这说明参数选择直接影响检索的粒度和效果,需要根据文档内容和长度进行调整。
检索阈值与 topk 对结果的影响
在 useRetriaver 函数中,通过 WithScoreThreshold(0.80) 设置相似度分数阈值,并指定 topk 参数控制返回的文档数量。示例中 topk=3 时,检索出的内容与问题“规定”相关,但并非完全匹配。这表明阈值和 topk 的设定会影响检索结果的相关性和数量,需要根据实际场景权衡。
模型选择与翻译问题:以 mistral 为例
文章提到,使用 GetAnswer 函数获取的回答总是英文,即使调整 prompt 也未能直接输出中文。作者猜测这与所选模型有关,并发现 mistral 模型在翻译时仍会输出英文。因此,作者增加 Translate 函数进行二次翻译。这提示我们,不同模型对多语言任务的支持存在差异,可能需要额外处理。
调优的必要性与预期落差
作者指出,最终得到的结果可能只有实际预期的 50% 不到,需要通过调优每个步骤和参数来提高质量。调优并非一劳永逸,需结合原始文档的格式和内容进行调整。这反映了 RAG 应用开发的复杂性,也印证了作者此前“劝退”的结论,提醒读者对结果保持合理预期。
Q&A
如何使用langchaingo实现rag应用的基本流程?
基本流程包括将知识库内容切分、向量化存入向量数据库、进行相似性检索、包装Prompt,并调用大语言模型分析返回答案。
在实现rag应用时,如何进行文档切分?
文档切分通过TextToChunks函数实现,chunkSize和chunkOverlap参数化以控制块的大小和重叠。
如何将切分后的文本块存储到向量数据库?
使用storeDocs函数将文档存储到向量数据库中,确保文档数组长度大于0。
如何从向量数据库中检索相关文档?
通过useRetriaver函数进行检索,设置分数阈值并获取与用户输入相关的文档。
如何调用大语言模型获取最终答案?
使用GetAnswer函数,将检索到的文档和用户的Prompt传入,模型将返回最终答案。
调优在rag应用中有什么重要性?
调优可以提高结果的预期值,确保最终结果更接近用户的实际需求。