在写RAG结合LLM时,如果你读了我前面写的文章,你应该对里面的技术原理及流程有了很详细的了解。在上一篇文章讲了如何在通义千问中使用 function 的方式来完成LLM与RAG的结合。其实LLM结合RAG的方式可以有很多种,但是原理都是上一节介绍的,其实本质上就是要LLM知道,哪一类问题‘我’的回答是满足提问者要求的,哪一类问题‘我’可能回答的没有RAG好,‘我’可以借助‘RAG’,并将答案修饰形成提问者需要的风格进行转述回答。多的不说,还是直接上干货。上一篇文章举例的通义千问固然好用,但是模型以后可能按照tokens收费。因为毕竟整体的控制在LLM手上,但LLM如果不是部署在本地,那么你可能很难掌控他的内部逻辑,只能根据他目前的运作流程和开发的API进行开发。另外你除了担心模型按照 token 收费,可能还会担心安全性及稳定性问题,万幸的是,RAG可以部署到本地,当LLM请求发现自己能力不足以回答好非常专业的问题时,他可以以 function 的方式调用本地 RAG知识,从而很好的完成用户问题。当然,你如果要做的更好,你可能会把这个RAG中检索出的答案,交给LLM,让他对你RAG的retrieve进行二次更新和润色。举个例子,你的RAG存储了很多数学试卷题目解题思路。搜索问题的是一群小朋友,虽然你的RAG能给出更优秀和专业的回答,但是答案可能过于术语,专业化,小朋友可能没法完全理解。这时你可以透过设置 message 模版的 system 角色,告诉 LLM, ‘请以小朋友能读懂的口吻将答案润色’。这时RAG的答案重新交给LLM后,会经过LLM以小朋友的口吻发送给提问者。这也是LLM相对于RAG除了知识广阔性以外的一个重要魅力。但是你可能会担心将你的答案交给LLM后,LLM也会学到相关知识,当下一次你再提问时,可能LLM不需要借助RAG一样会有很好的表现。这要看LLM 背后的训练逻辑,是否会根据新增问题及外部答案,进行二次更新,参数调优等。当然这又会涉及到背后的商务考量,这不是本次文章我想描述的重点,但他确实有这样的问题。下面我还是直接展示干货,通过ollama+ langchain 打造属于自己的本地RAG+LLM,这对于有安全性,主控性的项目有着较好的启示作用。下面直接上 python 代码实现本地的RAG+LLM,并解释其实现:
你首先要下载 langchain 的相关包,包括如下:
pip install langchain
pip install langchain-community
pip install docarray
前两个是 langchain 核心库相关的,主要是用作分词和词向量化
docarray主要是完成 词向量化的数据库保存与检索
另外,为了进行词向量编码,需要采用一
标签:RAG,答案,langchain,---,LLM,小朋友,提问者 From: https://blog.csdn.net/talentyiyy/article/details/139879300