如何用LangChain实现LLM查询向量食谱数据库列出全部文档?
基于LangChain的食谱向量库全量查询实现
一、数据预处理与存储流程
因为数据集最多10条,无需复杂分块处理,核心是为每条食谱生成结构化元数据:
- 对每条原始食谱内容,调用LLM生成简短标题和1-2句话的摘要,将这两个字段作为文档的元数据
- 将原始食谱内容作为Document的
page_content,附带生成的元数据,存入轻量向量数据库(如FAISS,适合小数据集)
具体实现逻辑:
- 初始化OpenAI LLM实例,用于生成元数据
- 编写Prompt模板,引导LLM从食谱内容中提取标题和摘要
- 遍历每条食谱,生成元数据后构造Document对象
- 使用LangChain的
FAISS.from_documents方法完成向量存储
二、全量查询逻辑
当收到“你有哪些食谱?”这类查询时,无需执行相似性检索,直接从向量库中取出所有文档的元数据,再通过LLM整理成清晰的列表格式:
- 从向量库中加载所有文档,提取每条的标题和摘要
- 构造Prompt,让LLM将这些元数据整理成自然语言的食谱列表
- 调用LLM返回最终结果
三、完整代码示例
from langchain.llms import OpenAI from langchain.schema import Document from langchain.vectorstores import FAISS from langchain.embeddings import OpenAIEmbeddings from langchain.prompts import PromptTemplate from langchain.chains import LLMChain # 初始化LLM和嵌入模型 llm = OpenAI(temperature=0) embeddings = OpenAIEmbeddings() # 1. 生成食谱元数据的Prompt模板 metadata_prompt = PromptTemplate( input_variables=["recipe_content"], template="请为以下食谱生成一个简短标题和1句话的摘要:\n{recipe_content}\n输出格式:标题:XXX\n摘要:XXX" ) metadata_chain = LLMChain(llm=llm, prompt=metadata_prompt) # 2. 存储食谱到向量库 def store_recipes(recipes): documents = [] for recipe in recipes: # 生成元数据 metadata_result = metadata_chain.run(recipe) title = metadata_result.split("标题:")[1].split("\n")[0].strip() summary = metadata_result.split("摘要:")[1].strip() # 构造Document对象 doc = Document(page_content=recipe, metadata={"title": title, "summary": summary}) documents.append(doc) # 存入FAISS向量库 db = FAISS.from_documents(documents, embeddings) db.save_local("recipe_faiss_db") return db # 示例食谱数据 sample_recipes = [ "番茄炒蛋:准备2个番茄,3个鸡蛋,热锅倒油,打散鸡蛋煎熟盛出,再炒番茄出汁,加入鸡蛋翻炒,加盐调味即可。", "酸辣土豆丝:土豆切丝泡水去淀粉,热锅爆香干辣椒和蒜末,倒入土豆丝快炒,加醋、盐、糖调味,翻炒均匀出锅。" ] # 执行存储 store_recipes(sample_recipes) # 3. 全量查询食谱 def list_all_recipes(): # 加载向量库 db = FAISS.load_local("recipe_faiss_db", embeddings) # 获取所有文档 all_docs = db.get_all_documents() # 提取元数据列表 recipe_metadata = [f"标题:{doc.metadata['title']},摘要:{doc.metadata['summary']}" for doc in all_docs] # 构造整理列表的Prompt list_prompt = PromptTemplate( input_variables=["metadata_list"], template="请将以下食谱信息整理成清晰的列表形式:\n{metadata_list}\n输出用中文,每条食谱占一行。" ) list_chain = LLMChain(llm=llm, prompt=list_prompt) # 生成结果 result = list_chain.run("\n".join(recipe_metadata)) return result # 测试查询 print(list_all_recipes())
四、优化说明
- 因为数据集仅10条,直接全量读取元数据的效率远高于向量检索,无需做相似性匹配
- 若后续数据量增大,可在元数据中加入标签字段(如“家常菜”“甜品”),支持按标签筛选后再返回列表
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

