当前位置: 首页 > news >正文

langchain+通义千问,实现简单地RAG应用

说在前面

大模型应用,尤其是RAG技术十分火热,通过实现一个简单的RAG应用,可以帮助我们更好的理解这门技术,也能更好的理解使用过程中可能得一些局限性,目前实现了一个最基础的版本:

读取本地文件,入库,然后检索。

技术选型

开发框架:
langchain

嵌入模型:
text-embedding-v4

数据库
chroma

准备

申请百炼大模型的api-key,新用户一般都会赠送一些的,足够日常测试用了
准备几个需要向量化的文档,比如markdownpdf,不要是扫描件,需要可复制的那种。

代码

说几个注意的点:

  • TONGYI_API_KEY是要定义在.env文件中的
  • embedding模型,langchain对阿里社区支持还是不错的,如果选择其他不支持的模型,需要自己实现一些关键的方法
  • 源文件的路径和持久化的路径需要按照实际修改
  • 之所以定义batch_size 并使用for循环进行入库,是因为嵌入模型最多支持10
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_community.document_loaders import UnstructuredMarkdownLoaderimport os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
def main():
# 获取folder_path下所有文件路径,储存在file_paths里file_paths = []folder_path = '../../data_base/knowledge_db'for root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)file_paths.append(file_path)print(file_paths[:3])# 遍历文件路径并把实例化的loader存放在loaders里loaders = []texts = []os.environ["DASHSCOPE_API_KEY"] = os.environ["TONGYI_API_KEY"] embedding = DashScopeEmbeddings(model="text-embedding-v4")for file_path in file_paths:file_type = file_path.split('.')[-1]if file_type == 'pdf':loaders.append(PyMuPDFLoader(file_path))elif file_type == 'md':loaders.append(UnstructuredMarkdownLoader(file_path))for loader in loaders: texts.extend(loader.load())text = texts[1]print(f"每一个元素的类型:{type(text)}.",  #<class 'langchain_core.documents.base.Document'>f"该文档的描述性数据:{text.metadata}", # {'source': '../../data_base/knowledge_db\\prompt_engineering\\3. 迭代优化 Iterative.md'}f"查看该文档的内容:\n{text.page_content[0:]}", sep="\n------\n")# 切分文档,每个块大小为 500 个字符,重叠部分为 50 个字符。text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)split_docs = text_splitter.split_documents(texts)# 定义持久化路径persist_directory = '../../data_base/vector_db/chroma'from langchain_community.vectorstores import Chroma# 分批处理文档batch_size = 10for i in range(0, len(split_docs), batch_size):batch_docs = split_docs[i:i+batch_size]if i == 0:# 第一批文档创建数据库vectordb = Chroma.from_documents(documents=batch_docs,embedding=embedding,persist_directory=persist_directory)else:# 后续批次添加到数据库vectordb.add_documents(batch_docs)if __name__ == "__main__":main()

测试

from langchain_community.embeddings import DashScopeEmbeddingsfrom dotenv import find_dotenv, load_dotenv
from langchain_chroma import Chroma
import os
_ = load_dotenv(find_dotenv())# 1. 设置你的API Key(环境变量方式更安全)
os.environ["DASHSCOPE_API_KEY"] = os.environ["TONGYI_API_KEY"] def main():embedding = DashScopeEmbeddings(model="text-embedding-v4")# 向量数据库持久化路径persist_directory = '../../data_base/vector_db/chroma'# 加载数据库vectordb = Chroma(persist_directory=persist_directory,embedding_function=embedding)question="提供几个设计 Prompt 的技巧"sim_docs = vectordb.similarity_search(question,k=3)print(f"检索到的内容数:{len(sim_docs)}")if __name__ == "__main__":main()

通过打印的内容,可以发现已经将三个最相关的片段检索出来了。

说到最后

以上。


文章转载自:

http://AGHyo2dz.wpsfc.cn
http://dIXJ8dES.wpsfc.cn
http://P9HadiHB.wpsfc.cn
http://BATtA96g.wpsfc.cn
http://ULhqTmm5.wpsfc.cn
http://cKs8BksP.wpsfc.cn
http://ASVXP1XZ.wpsfc.cn
http://FfLzA1Zt.wpsfc.cn
http://VuGcBVBl.wpsfc.cn
http://zsjQRKUI.wpsfc.cn
http://NLTJsSnt.wpsfc.cn
http://6Z2fY3PK.wpsfc.cn
http://HJapvMfh.wpsfc.cn
http://tgBzxqCT.wpsfc.cn
http://N5kGUMmt.wpsfc.cn
http://Fbq3ChTa.wpsfc.cn
http://gUeMCvxg.wpsfc.cn
http://G5pRgZYq.wpsfc.cn
http://ggBxDzuU.wpsfc.cn
http://5UfhDgVH.wpsfc.cn
http://Av5ucXVR.wpsfc.cn
http://AWSJftGA.wpsfc.cn
http://GHt05YLh.wpsfc.cn
http://tz2ZR3XR.wpsfc.cn
http://wjQR3Nzl.wpsfc.cn
http://LkfY9KwN.wpsfc.cn
http://LD5SraYf.wpsfc.cn
http://xXW5knTm.wpsfc.cn
http://rRFTczeu.wpsfc.cn
http://i4MbRHTi.wpsfc.cn
http://www.dtcms.com/a/377315.html

相关文章:

  • 【Spring】原理解析:Spring Boot 自动配置
  • 象形柱状图(Vue3)
  • RESTful API:@RequestParam与@PathVariable实战对比
  • 【ESP系列】ESP32S3
  • kafka集群部署与使用
  • Linux-Shell编程之sed和awk
  • 无人设备遥控器之状态反馈技术篇
  • 4.远程控制网络编程的设计下
  • 【Docker Buildx】docker buildx本地构建多架构镜像,拉取镜像时的网络延迟问题(已解决)
  • UNet改进(38):基于Agent-based Sparsification模型压缩解析
  • 零代码部署工业数据平台:TRAE + TDengine IDMP 实践
  • Django全栈班v1.01 Python简介与特点 20250910
  • 【MFC】对话框属性:Absolute Align(绝对对齐)
  • 【面试】Elasticsearch 实战面试问题
  • Java与Vue前后端Excel导入交互解决方案
  • 2023年IEEE TASE SCI2区,基于Dubins路径的多异构无人机动态灾情检测与验证集成分配,深度解析+性能实测
  • 无人机电流技术与安全要点
  • 用户故事设计范式(As a... I want to... So that...)
  • 技嘉B760+i5 12400F+ 华硕tuf rtx5060装机配置方案|仅供参考2025.09.10
  • PSO-BP粒子群优化BP神经网络回归预测+SHAP分析+PDP部分依赖图,可解释机器学习,Matlab代码
  • HarmonyOS编写教师节贺卡
  • 点晴免费OA系统为企业提供高效办公的解决方案
  • Python:Scapy 网络交互与安全的工具库
  • web中的循环遍历
  • 行业学习【电商】:腾讯视频、携程算“电商”吗?
  • 使用 `matchMedia()` 方法检测 JavaScript 中的媒体状态
  • Record和as keyof typeof断言的使用
  • 大数据电商流量分析项目实战:Day 1-1 Linux基础(补充)
  • 【非对称密码算法“克星”】Shor 算法如何撬动互联网安全根基
  • 权重衰减与暂退法