什么是Query Construction
典型的RAG方法将用户query转换为向量表示,然后将该向量与源文档的向量表示进行比较,找到具有最相似的向量表示的源文档。这种方式对非结构化数据相当有效,但对结构化数据呢?
世界上大部分数据都有一定的结构,这些数据大多存储在关系数据库(例如SQL)或图形数据库中,甚至非结构化数据也经常与结构化元数据(例如,作者、流派、发布时间等)相关联。许多用户query的最佳答案不仅是通过在embedding空间中找到相似的文档或数据,而且还利用数据中固有的以及在用户query中表达的结构。
例如,对于“what are movies about aliens in the year 1980”这个查询,一部分(aliens )可能要从语义上查找,但也有一部分("year == 1980")我们想以精确的方式查找。Query construction就是将自然语言查询转换为与之交互的数据库的查询语言。
下面我们将介绍三种典型的Query Construction的示例。
Text-to-metadata-filter
将query转换为合适的结构化语言,一以便进行有效地搜索和过滤。
Text-to-SQL
关系型数据库是结构化数据的重要来源,将自然语言转化为SQL请求存在以下挑战:
- 幻觉:LLM容易对虚构的表或字段产生“幻觉”,从而创建无效的查询。需要确保LLM生成与实际数据库schema一致的有效SQL。
- 用户错误:Text-to-SQL方法应该对用户拼写错误或用户输入中可能导致无效查询的其他不规则性具有鲁棒性。
为了应对这些挑战,下面是一些实用的技巧:
- 数据库描述:要生成SQL查询,必须向LLM提供数据库的准确描述。
- Few-shot样例:在prompt中添加question-query的几个样例可以提高query生成的准确性。在prompt中简单的添加标准的静态示例指导agent如何基于question创建query。
- 错误处理:当遇到错误时,利用工具(例如SQL agent)修复错误。
- 查找专有名词中的拼写错误:当查询名称等专有名词时,用户可能会不小心写错。我们允许agent根据向量库搜索正确的名称,向量库在SQL数据库中存储相关专有名词的正确拼写。
Text-to-Cypher
利用图数据库和LLM来处理复杂的数据查询需求。与关系型数据库通常使用SQL一样,图数据库通常使用Cypher进行查询。自然语言到Cypher的转换用GraphCypherQAChain