前途科技前途科技
  • 洞察
  • 服务
  • 关于
  • AI 资讯
    • 快讯
    • 产品
    • 技术
    • 商业
    • 政策
    • 初创
  • 洞察
  • 资源中心
    • 深度研究
      • AI 前沿
      • 案例研究
      • AI 知识库
    • 行业报告
      • 白皮书
      • 行业报告
      • 研究报告
      • 技术分享
      • 专题报告
    • 精选案例
      • 金融行业
      • 医疗行业
      • 教育行业
      • 零售行业
      • 制造行业
  • 服务
  • 关于
联系我们

手把手搭建Flutter文档RAG问答系统

技术2026年6月13日· 5 分钟阅读0 阅读

本文详解如何用LangChain、ChromaDB和TinyLlama构建一个检索增强生成(RAG)系统,让Flutter文档问答更准确、减少幻觉,并分享实操中的教训与优化方向。

为什么需要RAG?

直接问大模型(比如ChatGPT)Flutter相关问题,可能会遇到知识过时、文档更新快、幻觉等问题。RAG(检索增强生成)通过先检索相关文档片段,再让大模型基于这些片段生成答案,有效解决上述痛点。架构很简单:用户问题→嵌入向量→向量数据库搜索→Top-K相关片段→大模型→答案。

项目目标

构建一个能回答Flutter相关问题的系统,覆盖widget、导航、状态管理等主题,检索官方文档后由LLM生成回答,而非依赖模型内部的知识。

技术栈

  • LangChain
  • ChromaDB
  • Hugging Face
  • TinyLlama
  • all-MiniLM-L6-v2
  • Google Colab
  • Python

系统架构

整个流水线如下:

Flutter文档(网页) → WebBaseLoader(爬取) → 文本清洗 → 文本分割 → 嵌入生成 → ChromaDB存储 → 检索器(Top-3相似搜索) → Prompt构建 → TinyLlama生成答案

架构图

数据采集

使用LangChain的WebBaseLoader爬取Flutter官方文档的精选页面,包括安装、codelab、UI widgets、cookbook和状态管理等。

from langchain_community.document_loaders import WebBaseLoader

links = [
 "https://docs.flutter.dev/get-started/install",
 "https://docs.flutter.dev/get-started/codelab",
 "https://docs.flutter.dev/ui",
 "https://docs.flutter.dev/ui/widgets",
 "https://docs.flutter.dev/cookbook",
 "https://docs.flutter.dev/cookbook/navigation/navigation-basics",
 "https://docs.flutter.dev/cookbook/networking/fetch-data",
 "https://docs.flutter.dev/data-and-backend/state-mgmt/intro",
]

loader = WebBaseLoader(web_paths=links)
docs = loader.load()
print(f"loaded {len(docs)} pages")

文本清洗

原始HTML文本含有大量空白和换行,需用正则清理。这一步很关键:脏数据导致脏chunk,进而影响检索质量。

清洗前后对比

文本分割

使用RecursiveCharacterTextSplitter,chunk_size设为1000字符,chunk_overlap设为200字符。这样的好处是每个chunk语义集中,同时跨边界信息不丢失。

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
 chunk_size=1000,
 chunk_overlap=200,
 separators=["\n\n", "\n", ". ", " ", ""]
)

splits = text_splitter.split_documents(clean_docs)
print(f"got {len(splits)} chunks")

嵌入生成

选用轻量级模型all-MiniLM-L6-v2,无需GPU即可运行,生成的嵌入足以支撑语义检索。

from langchain_huggingface import HuggingFaceEmbeddings

embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

向量数据库

使用ChromaDB存储嵌入,配置检索器返回Top-3最相关chunk。

from langchain_chroma import Chroma

vectorstore = Chroma.from_documents(documents=splits, embedding=embedding)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
print("vector store ready!")

答案生成

采用TinyLlama-1.1B-Chat,用float16降低显存占用,设置do_sample=False保证答案确定性。

from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
from langchain_huggingface import HuggingFacePipeline
import torch

model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
 model_id,
 torch_dtype=torch.float16,
 device_map="auto"
)

pipe = pipeline(
 "text-generation",
 model=model,
 tokenizer=tokenizer,
 max_new_tokens=300,
 do_sample=False,
 return_full_text=False
)

llm = HuggingFacePipeline(pipeline=pipe)
print("model loaded - good to go!")

组装RAG链

把检索器和LLM通过Prompt模板串联起来:

from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate.from_template("""<|system|>
You are a Flutter documentation assistant. Answer ONLY using the context below. Be concise.
</s>
<|user|>
Context:
{context}

Question: {question}
</s>
<|assistant|>""")

from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

def format_docs(docs):
 return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
 {"context": retriever | format_docs, "question": RunnablePassthrough()}
 | prompt
 | llm
 | StrOutputParser()
)

测试查询

问“What is Flutter and what can you build with it?”,模型基于检索到的文档正确回答。

遇到的问题

  1. chunk大小选择:太小丢失上下文,太大引入噪音,经过实验确定为1000/200。
  2. 上下文与延迟平衡:检索chunk数越多答案越好,但推理变慢。
  3. 硬件资源限制:免费Colab T4内存有限,选用小模型和float16。
  4. 检索相关性:文本清洗不干净导致嵌入效果差,必须做好预处理。

经验教训

  • 检索质量比模型大小更重要:小模型配上优质上下文,效果优于大模型裸回答。
  • 嵌入是地基:语义相似的文本如果没有在向量空间聚集,后续全白搭。
  • 分块策略直接影响结果:重叠和大小不是细节,直接决定模型看到的内容。
  • RAG有效减少幻觉:将模型约束在提供的上下文内。

未来改进方向

  • 扩大文档覆盖范围
  • 尝试混合搜索(关键词+语义)
  • 使用更大或更专业的嵌入模型
  • 换用更强的指令微调模型
  • 搭建Streamlit或Gradio Web界面
  • 评估检索精度

项目指标

指标表

总结

本文完成了RAG全流程:从加载、清洗、分块、嵌入、存储到检索和生成。这套架构不仅适用于Flutter文档,也可迁移到任何文档或知识库的问答系统。

标签:FlutterRAGLangChainChromaDBTinyLlama

想了解 AI 如何助力您的企业?

免费获取企业 AI 成熟度诊断报告,发现转型机会

//

24小时热榜

宝可梦GO玩家数据被用于训练军用无人机
TOP1

宝可梦GO玩家数据被用于训练军用无人机

OpenAI与Oracle合作,云客户可用信用积分访问模型
TOP2

OpenAI与Oracle合作,云客户可用信用积分访问模型

3

天体物理学家用Codex模拟黑洞

9小时前
天体物理学家用Codex模拟黑洞
4

Anthropic首份AI公众态度调查出炉

1小时前
Anthropic首份AI公众态度调查出炉
5

AI写的代码没毛病,但系统却读不懂了

1小时前
AI写的代码没毛病,但系统却读不懂了
6

理性落幕,AI开启的新觉醒时代

1小时前
7

TCS与Anthropic合作,将Claude引入受监管行业

1小时前
TCS与Anthropic合作,将Claude引入受监管行业
8

AI梯子是钟:七级成熟度背后的真相

1小时前
AI梯子是钟:七级成熟度背后的真相
热门标签
大模型AgentRAG微调私有化部署Prompt EngineeringChatGPTClaudeDeepSeek智能客服知识管理内容生成代码辅助数据分析金融零售制造医疗教育AI 战略数字化转型ROI 分析OpenAIAnthropicGoogle

关注公众号

前途科技微信公众号

扫码关注,获取最新 AI 资讯

免费获取 AI 落地指南

3 步完成企业诊断,获取专属转型建议

已有 200+ 企业完成诊断

前途科技前途科技
服务关于快讯技术商业报告
前途科技微信公众号

微信公众号

扫码关注

Copyright © 2026 AccessPath.com, 前途国际科技咨询(北京)有限公司,版权所有。|京ICP备17045010号-1|京公网安备 11010502033860号|隐私政策|服务条款