You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LangChain实现LLM查询向量食谱数据库列出全部文档?

基于LangChain的食谱向量库全量查询实现

一、数据预处理与存储流程

因为数据集最多10条,无需复杂分块处理,核心是为每条食谱生成结构化元数据:

  • 对每条原始食谱内容,调用LLM生成简短标题和1-2句话的摘要,将这两个字段作为文档的元数据
  • 将原始食谱内容作为Document的page_content,附带生成的元数据,存入轻量向量数据库(如FAISS,适合小数据集)

具体实现逻辑:

  1. 初始化OpenAI LLM实例,用于生成元数据
  2. 编写Prompt模板,引导LLM从食谱内容中提取标题和摘要
  3. 遍历每条食谱,生成元数据后构造Document对象
  4. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:45:15