OpenAI 是如何一步一步把RAG做到98%的准确性得

参考OpenAI的官方演讲,如何做好RAG。本文整理的内容,均来源于此演讲内容。

【OpenAI演讲-自制中文字幕】干货-如何提升大模型表现?-提示工程、RAG与Fine-Tuning技巧详解_哔哩哔哩_bilibili

45% 的准确性

普通搜索不做任何处理的效果,OpenAI基准测试的准确性只有45% 。搜索并不是简单的切分,然后做embedding就能有不错的检索效果。

假设性问题和HyDE 提升到65%

另一个方法是让LLM为每个块生成一个假设性问题,并将这些问题以向量形式嵌入。在运行时,针对这个问题向量的索引进行查询搜索(用问题向量替换我们索引中的块向量),检索后将原始文本块作为上下文发送给LLM以获取答案。这种方法由于查询和假设性问题之间的语义相似性更高,从而提高了搜索质量。

还有一种反向逻辑的方法叫做HyDE——您可以让LLM根据查询生成一个假设性回答,然后将该回答的向量与查询向量一起用来提高搜索质量。

从65%提升到85%

尝试调整文本的切分规则,尝试不同大小的切分逻辑;尝试提取更多的内容信息;rerank 召回的数据;尝试使用模型对文本数据进行分类,不同的领域信息进行分类。将问题也进行分类,最后决定哪些数据最优意义。最后效果提升到了85%

从85%提升到98%

将数字类型的数据提取出来放在关系型数据库,因为模型通常对数据是不敏感的,并且数据检索,对检索来说也是一件很有压力的事情。

查询扩展,将一个问题拆分成问题列表。然后分别取执行查询,然后获取到结果,最后将结果合并。

关于要不要微调

OpenAI 也尝试了去微调文本嵌入模型,但是最后放弃了,因为成本高,时间长,收益小。就像OpenAI所说的,任何问题都想着去用微调来解决问题,就是浪费时间浪费金钱。

那什么时候去做微调有意义呢?通常是模型能够接受的token太小,不能满足我们的业务需求时。还有就是模型有严重的性能问题,回答太慢。再有就是将更大的模型优化成跟小的模型,但是有一样的效果,因为这样可以节省资源,也就是省钱。

### OpenAI LangChain RAG介绍 OpenAI LangChain中的RAG(Retrieval-Augmented Generation)是一种结合检索和生成的方法,旨在提高自然语言处理任务的效果。这种方法不仅依赖于预训练的语言模型本身的知识,还利用外部数据源的信息来增强响应的质量和准确性[^1]。 对于希望构建基于文本的应用程序开发者来说,采用Weaviate作为向量数据库可以极大地简化这一过程。通过集成这些组件,能够实现高效的数据索引、查询以及上下文感知的回答生成。这使得即使面对复杂多变的需求也能够迅速调整并部署解决方案。 ### 使用教程 为了更好地理解和运用LangChain框架下的RAG功能,在实际操作前需先熟悉几个关键概念和技术栈: #### 安装必要的库文件 首先安装所需的Python包,包括但不限于`langchain`, `weaviate-client`等。 ```bash pip install langchain weaviate-client openai streamlit ``` #### 初始化Weaviate客户端连接 创建一个到Weaviate实例的链接用于后续的操作,比如加载文档或执行相似度搜索。 ```python import weaviate client = weaviate.Client("http://localhost:8080") # 替换成自己的服务器地址 ``` #### 构建知识图谱 将结构化或非结构化的信息导入至Weaviate中形成可供检索的知识库。 ```python class_obj = { "class": "Document", "properties": [ {"name": "content", "dataType": ["text"]} ] } client.schema.create_class(class_obj) ``` #### 实现问答系统的核心逻辑 定义函数接收用户输入的问题字符串,经过编码转换成向量形式后传给Weaviate做近邻查找;接着把找到的结果连同原始问题一起送入大型语言模型以获取最终答案。 ```python from langchain import PromptTemplate, LLMChain template = """Based on the following context {context}, answer this question:{question}""" prompt = PromptTemplate(template=template, input_variables=["context", "question"]) llm_chain = LLMChain(prompt=prompt) def get_answer(question): nearText = {"concepts": [question]} response = client.query.get("Document", "content").with_near_text(nearText).do() contexts = [item['content'] for item in response['data']['Get']['Document']] combined_context = "\n".join(contexts[:3]) # 取前三条记录的内容拼接起来当作背景信息 result = llm_chain.run({"context": combined_context, "question": question}) return result ``` 以上代码片段展示了如何搭建一个简单的基于LangChain与Weaviate的合作平台来进行RAG式的交互式问答服务[^4]。 ### 最佳实践 当涉及到具体应用场景时,除了上述基础流程外还需要考虑更多细节方面的问题,例如性能优化、安全性保障及用户体验提升等方面的工作。以下是几点建议: - **持续迭代改进**:随着项目的发展不断收集反馈意见并对算法参数做出相应调整,从而达到更好的效果; - **保护隐私安全**:确保所有敏感数据都得到妥善保管,并遵循当地法律法规的要求; - **注重效率平衡**:既要保证回复速度又要兼顾质量,合理配置计算资源分配比例; - **加强可解释性建设**:让用户清楚知道决策背后的原因是什么样的依据支持着给出的答案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值