橙云 php网站建设,室内设计快速培训班,公司管理系统网站模板下载,中山市建设局网站窗口电话号码6. EmbeddingEmbedding#xff08;嵌入向量#xff09; 是一种把文字、图像、音频等“非数值信息”转换成 可计算的数字向量 的技术。在自然语言处理中#xff0c;它最常见的用途是把 句子、段落或单词 转换成一串浮点数列表#xff08;通常是几百或几千维的向量#xff0…6. EmbeddingEmbedding嵌入向量是一种把文字、图像、音频等“非数值信息”转换成可计算的数字向量的技术。在自然语言处理中它最常见的用途是把句子、段落或单词转换成一串浮点数列表通常是几百或几千维的向量以便计算机能理解和比较它们之间的语义关系。举个例子假设有三句话“我喜欢苹果”“我爱吃水果”“我今天去跑步了”模型会将它们转换成如下向量示意[0.12, -0.34, 0.56, ...] # 我喜欢苹果 [0.10, -0.32, 0.60, ...] # 我爱吃水果 [-0.45, 0.22, 0.11, ...] # 我今天去跑步了前两条的向量在空间上“更接近”说明它们语义相似都与“吃水果”相关而第三条则比较远语义差别大。Embedding 常见用途场景说明 文本相似度判断两句话或文档的语义是否接近比如检索问答 向量数据库将大量文本嵌入向量后存入数据库用于 RAG 检索增强生成 聚类与分类用向量表示样本再进行聚类或分类️ 语义搜索用户输入一句话系统找出语义最相近的文本 推荐系统计算物品或用户的向量相似度进行推荐文本向量化工具代码实例通过环境变量动态选择 OpenAI 或国产免费 API如硅基流动将文本转换为机器可理解的数字向量以便进行后续的语义搜索或文档匹配。注该代码需要去https://cloud.siliconflow.cn/注意账号获取密钥这次用他的向量模型免费的。.env配置如下DEEPSEEK_API_KEY yourkey DEEPSEEK_BASE_URL https://api.deepseek.com OPENAI_API_KEY yourkey OPENAI_BASE_URL https://api.aigc369.com/v1 # 向量嵌入用 硅基流动 (免费) EMBEDDING_API_KEYyourkey EMBEDDING_BASE_URLhttps://api.siliconflow.cn/v1 EMBEDDING_MODELBAAI/bge-m3具体代码如下import os from dotenv import load_dotenv from langchain_openai import OpenAIEmbeddings # 1. 加载环境变量 load_dotenv() # 2. 逻辑开关True 用 OpenAI 官方False 用硅基流动(或其他兼容接口) use_openai os.getenv(USE_OPENAI, false).lower() true if use_openai: config { api_key: os.getenv(OPENAI_API_KEY), base_url: os.getenv(OPENAI_BASE_URL), # 默认是 https://api.openai.com/v1 model: text-embedding-3-large } else: # 硅基流动配置 (免费使用 BAAI 系列模型) config { api_key: os.getenv(EMBEDDING_API_KEY), base_url: os.getenv(EMBEDDING_BASE_URL), # 例如 https://api.siliconflow.cn/v1 model: BAAI/bge-m3 # 推荐模型中文支持极好 } # 3. 初始化嵌入模型 embeddings OpenAIEmbeddings( modelconfig[model], openai_api_keyconfig[api_key], openai_api_baseconfig[base_url] ) # 4. 要嵌入的文本 texts [狗, 猫, 你好, 你好啊, 你叫什么名字, 我叫王大锤, 很高兴认识你大锤] # 5. 计算并输出 try: results embeddings.embed_documents(texts) print(f--- 当前模型: {config[model]} ---) print(f向量条数: {len(results)}) print(f维度: {len(results[0])}) print(f前 5 个数值: {results[0][:5]}) except Exception as e: print(f运行失败请检查 API Key 或 Base URL。错误信息: {e})6.1 检索增强生成系统代码实例它先利用向量数据库从本地文档中“捞出”相关线索再交给 DeepSeek 模型进行逻辑筛选和总结从而确保即使检索结果存在细微偏差也能给出精准、不被干扰的最终答案。注这里由于向量模型质量不好采用了模型纠偏把检索结果给了模型让他来帮我选择。具体代码import os from dotenv import load_dotenv from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain.docstore.document import Document from langchain_community.vectorstores import FAISS from langchain.prompts import ChatPromptTemplate # 1. 加载环境变量 load_dotenv() # --- 配置向量模型使用硅基流动对话模型使用 DeepSeek --- # 向量配置 emb_config { api_key: os.getenv(EMBEDDING_API_KEY), base_url: os.getenv(EMBEDDING_BASE_URL), model: BAAI/bge-m3 } # 对话配置 llm_config { api_key: os.getenv(DEEPSEEK_API_KEY), base_url: os.getenv(DEEPSEEK_BASE_URL), model: deepseek-chat } # 2. 初始化模型 embeddings OpenAIEmbeddings( modelemb_config[model], openai_api_keyemb_config[api_key], openai_api_baseemb_config[base_url] ) llm ChatOpenAI( modelllm_config[model], openai_api_keyllm_config[api_key], openai_api_basellm_config[base_url] ) # 3. 原始文本库 texts [ 我的个人爱好是去看电影。, 《带我飞往月球》是我最喜欢的歌曲之一。, 凯尔特人队是我最喜欢的球队。, 这是一篇关于波士顿凯尔特人的文件资料。, 篮球是一项伟大的竞技活动。, 波士顿凯尔特人队以20分的优势赢得了比赛, 《艾尔登之环》是过去15年最好的游戏之一。, 拉里·伯德是一位标志性的NBA球员。 ] documents [Document(page_contenttext) for text in texts] db FAISS.from_documents(documents, embeddings) # 4. 核心 RAG 流程 def rag_answer(query): print(f\\n[用户提问]: {query}) # 第一步检索为了确保搜到我们取前 3 名 # BGE 模型建议加上指令前缀 processed_query f为这个句子生成表示以用于检索相关文章{query} retrieved_docs db.similarity_search(processed_query, k3) # 打印一下捞上来的鱼 print(f[检索到的线索]: {[d.page_content for d in retrieved_docs]}) # 第二步构造 Prompt 将线索喂给 DeepSeek context \\n.join([f- {d.page_content} for d in retrieved_docs]) prompt ChatPromptTemplate.from_template( 你是一个严谨的助手。请仅基于以下提供的【参考资料】来回答用户的问题。 如果资料中没有相关信息请直接回答“不知道”。 【参考资料】 {context} 【用户问题】 {question} ) # 第三步LLM 生成答案 chain prompt | llm response chain.invoke({context: context, question: query}) print(f[DeepSeek 回答]: {response.content}) print(- * 60) # 5. 运行测试 if __name__ __main__: rag_answer(关于我的爱好你知道些什么) rag_answer(我最喜欢的歌曲是什么)6.2 重写问题Rephraserephrase_prompt hub.pull(langchain-ai/chat-langchain-rephrase)是LangChain Hub的用法。它的作用是从官方或社区的「提示词模板仓库LangChain Hub」中下载一个标准 Prompt 模板。具体解释LangChain Hub 是一个集中存放常用 Prompt 的平台类似于“Prompt 代码仓库”。上面那行代码rephrase_prompt hub.pull(langchain-ai/chat-langchain-rephrase)等价于做了这件事从 langchain-ai 的仓库里拉取一个名为 chat-langchain-rephrase 的提示模板用于 重写用户输入的问题。1.为什么要重写问题在RAG 对话系统中我们希望模型能结合上下文理解用户提问。举个例子用户RAG之父是谁 上文问过“中国大模型RAG之父是谁”如果你直接把这个问题送去检索Retriever 不知道“RAG之父”指谁。所以我们要用一个 Prompt 让模型改写把用户的问题改写成包含上下文的独立问题 RAG之父是谁 ➜ 中国大模型RAG之父是谁这就是chat-langchain-rephrasePrompt 的功能。代码实例具体代码import os from dotenv import load_dotenv from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import FAISS from langchain import hub from langchain.chains import create_history_aware_retriever, create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain.prompts import ChatPromptTemplate # 1. 加载环境变量 load_dotenv() # --- 配置DeepSeek 对话 硅基流动向量 --- emb_config { api_key: os.getenv(EMBEDDING_API_KEY), base_url: os.getenv(EMBEDDING_BASE_URL), model: BAAI/bge-m3 } llm_config { api_key: os.getenv(DEEPSEEK_API_KEY), base_url: os.getenv(DEEPSEEK_BASE_URL), model: deepseek-chat } # 2. 加载与分块 loader TextLoader(rD:\\python object\\DeepSeek\\LangChain\\RAG\\demo.txt, encodingutf-8) docs loader.load() text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap40) texts text_splitter.split_documents(docs) print(f✅ 文档加载完成共分割 {len(texts)} 段) # 3. 初始化 Embedding (兼容 OpenAI 格式的硅基流动) embeddings OpenAIEmbeddings( modelemb_config[model], openai_api_keyemb_config[api_key], openai_api_baseemb_config[base_url] ) db FAISS.from_documents(texts, embeddings) # 4. 检索器 (k3 表示检索最相关的3个片段) retriever db.as_retriever(search_kwargs{k: 3}) # 5. 初始化 DeepSeek 作为 LLM llm ChatOpenAI( modelllm_config[model], openai_api_keyllm_config[api_key], openai_api_basellm_config[base_url] ) # 6. 加载重写问题提示模板 (从历史对话中提炼独立问题) rephrase_prompt hub.pull(langchain-ai/chat-langchain-rephrase) # 7. 创建具备“历史感知”的检索器 # 注意这里由 DeepSeek 负责将“他毕业于哪”改写为“XX(人名)毕业于哪” history_aware_retriever create_history_aware_retriever( llmllm, retrieverretriever, promptrephrase_prompt ) # 8. 回答用 Prompt 模板 qa_prompt ChatPromptTemplate.from_template( 你是一个专业的知识问答助手。请基于以下【参考资料】回答用户问题。 如果你在资料中找不到答案请诚实回答不知道不要胡乱猜测。 【参考资料】 {context} 【当前对话历史】 {chat_history} 【用户问题】 {input} ) # 9. 构建文档处理链 document_chain create_stuff_documents_chain(llm, qa_prompt) # 10. 构建最终 RAG 对话链 rag_chain create_retrieval_chain(history_aware_retriever, document_chain) # 11. 对话循环测试 chat_history [] def ask(question, chat_history): # 调用对话链 response rag_chain.invoke({ input: question, chat_history: chat_history }) answer response.get(answer, ) context_docs response.get(context, []) print(f\\n 问题{question}) print(f 答案{answer}) # 输出引用来源 if context_docs: print( 参考片段) for i, doc in enumerate(context_docs, 1): print(f [{i}] {doc.page_content.strip()[:100]}...) # 这一步至关重要手动更新对话历史到列表中 chat_history.append({role: user, content: question}) chat_history.append({role: assistant, content: answer}) if __name__ __main__: ask(中国大模型RAG之父是谁, chat_history) ask(他毕业于哪所学校, chat_history)6.3 chain_type在 LangChain 中chain_type是构建文档问答RAG时的关键参数之一。它决定了检索到的文档如何与 LLM 结合使用。下面是一张完整的对比表格帮你清楚理解常见的chain_type类型及其差异1.LangChain 中常见的chain_type类型对比表chain_type 名称核心逻辑工作方式适用场景优点缺点是否支持多文档stuff直接“塞入”所有检索结果将所有文档拼接成一个大字符串一次性喂给 LLM小规模文档、短上下文简单高效、实现最容易超出上下文窗口容易截断无法处理长文档✅ 是map_reduce分段总结再汇总“map”阶段每个文档单独生成回答“reduce”阶段合并结果长文本、需要汇总总结的任务可处理超长内容节省上下文结构复杂、速度慢✅ 是refine逐步优化答案先用第1篇文档生成初稿之后每篇文档依次优化答案文档之间互相关联、需要累积推理输出更完整连贯耗时长对Prompt设计要求高✅ 是map_rerank并行生成并评分每个文档单独回答并附带分数最后选出最高分答案需要最可靠答案、检索结果差异大精确、可控性高计算量大、慢✅ 是self_query模型自生成检索条件模型先生成检索查询再检索文档智能RAG自动选择检索内容语义匹配强依赖模型能力✅ 是contextual_compression压缩冗余上下文先用LLM压缩冗余信息再进入问答链冗长文档或重复内容较多降低token消耗需要额外LLM调用✅ 是retrieval_qa通用封装自动将检索器与问答链拼接快速构建RAG原型一行构建、简单易用细节控制少✅ 是2.举个例子from langchain.chains import RetrievalQA qa_chain RetrievalQA.from_chain_type( llmChatOpenAI(), retrievermy_retriever, chain_typestuff # 可改为 map_reduce、refine、map_rerank 等 )示例说明stuff把检索到的3段文字拼接成一个输入直接问LLMmap_reduce每段文字分别回答后再总结最终答案refine先看第1段答一遍然后依次用后面几段改进答案map_rerank每段文字答一遍并评分取分数最高的那个答案3.推荐选择建议使用场景推荐 chain_type理由简单问答、短文档stuff最快、最稳文档很长map_reduce能处理超长文本逻辑性强、答案需完善refine输出连贯、逐步优化检索质量参差不齐map_rerank通过评分自动筛选最优答案6.4 RAGFromPDF运行代码python -m streamlit run D:\\python object\\DeepSeek\\LangChain\\RAG\\RAGFromPDF\\main.py解析PDF项目代码如有需求请私信。