当前位置:   article > 正文

langchain 链式写法-使用本地 embedding 模型,Faiss 检索_langchain embedding

langchain embedding

目录

示例代码1

示例代码2


示例代码1

使用本地下载的 embedding 模型去做 embedding,然后从中查相似的

  1. import os
  2. from dotenv import load_dotenv
  3. from langchain_community.llms import Tongyi
  4. load_dotenv('key.env') # 指定加载 env 文件
  5. key = os.getenv('DASHSCOPE_API_KEY') # 获得指定环境变量
  6. DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"] # 获得指定环境变量
  7. model = Tongyi(temperature=1)
  8. from langchain_core.prompts import ChatPromptTemplate, PromptTemplate, format_document
  9. from langchain_core.output_parsers import StrOutputParser
  10. from langchain_core.runnables import RunnablePassthrough
  11. from langchain_community.vectorstores.faiss import FAISS
  12. from langchain_community.document_loaders import ArxivLoader
  13. from langchain.text_splitter import RecursiveCharacterTextSplitter
  14. from langchain.embeddings import HuggingFaceEmbeddings
  15. # 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
  16. loader = ArxivLoader(query="2210.03629", load_max_docs=1)
  17. docs = loader.load()
  18. # 把文本分割成 200 字一组的切片
  19. text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
  20. chunks = text_splitter.split_documents(docs)
  21. embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
  22. # 构建 FAISS 向量存储和对应的 retriever
  23. vs = FAISS.from_documents(chunks[:10], embedding)
  24. # vs.similarity_search("What is ReAct")
  25. retriever = vs.as_retriever()
  26. # 构建 Document 转文本段落的工具函数
  27. DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}")
  28. def _combine_documents(
  29. docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator="\n\n"
  30. ):
  31. doc_strings = [format_document(doc, document_prompt) for doc in docs]
  32. return document_separator.join(doc_strings)
  33. # 准备 Model I/O 三元组
  34. template = """Answer the question based only on the following context:
  35. {context}
  36. Question: {question}
  37. """
  38. prompt = ChatPromptTemplate.from_template(template)
  39. # 构建 RAG 链
  40. chain = (
  41. {
  42. "context": retriever | _combine_documents,
  43. "question": RunnablePassthrough() # 直接作为 question 的值,不做任何操作
  44. }
  45. | prompt
  46. | model
  47. | StrOutputParser()
  48. )
  49. print(chain.invoke("什么是 ReAct?"))

示例代码2

txt 有多行,我的这份数据有 67 行,样例如下:

字段1\t值1\n

字段2\t值2\n

...

从中先检索最相似的,在传给大模型去选择,减少一次性传传入太多,不相关得到信息

  1. import os
  2. from dotenv import load_dotenv
  3. from langchain_community.llms import Tongyi
  4. from langchain_core.prompts import ChatPromptTemplate, PromptTemplate, format_document
  5. from langchain_core.output_parsers import StrOutputParser
  6. from langchain_core.runnables import RunnablePassthrough
  7. from langchain.embeddings import HuggingFaceEmbeddings
  8. from langchain_community.document_loaders import TextLoader
  9. from langchain_community.vectorstores import FAISS
  10. from langchain.text_splitter import CharacterTextSplitter
  11. # 使用通义千问 api
  12. load_dotenv('key.env') # 指定加载 env 文件
  13. key = os.getenv('DASHSCOPE_API_KEY') # 获得指定环境变量
  14. DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"] # 获得指定环境变量
  15. model = Tongyi(temperature=1)
  16. # 检索的文本
  17. content = '采用强酸型阳离子树脂为交换剂的离子交换柱,和经组氨酸基团修饰的强碱型阴离子树脂为交换剂的离子交换层析柱串联,以氯化钠溶液为洗脱剂,对透明质酸粗品进行分离和纯化.得到的透明质酸精品的蛋白质含量低于0.075%,平均分子量大于9.41×105,纯化收率为58%~61%.并对洗脱剂的流速、浓度、pH等条件进行比较,确定了最佳洗脱条件.'
  18. # 加载外部数据
  19. filepath = 'data/专业描述.txt'
  20. raw_documents = TextLoader(filepath, encoding='utf8').load()
  21. # 按行分割块
  22. text_splitter = CharacterTextSplitter(
  23. chunk_size=100,
  24. chunk_overlap=20,
  25. separator="\n",
  26. length_function=len,
  27. is_separator_regex=True,
  28. )
  29. documents = text_splitter.split_documents(raw_documents)
  30. # 加载本地 embedding 模型
  31. embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
  32. # 判断向量数据库是否已经创建,创建则加载,否则创建
  33. embedding_db = "./faiss_index"
  34. if os.path.exists(embedding_db):
  35. print('加载已存在向量数据库')
  36. db = FAISS.load_local(embedding_db, embedding, allow_dangerous_deserialization=True)
  37. else:
  38. print('创建向量数据库')
  39. # 创建向量数据库,把外部数据向量化,保存为数据库到本地
  40. db = FAISS.from_documents(documents, embedding)
  41. # 保存
  42. db.save_local("./faiss_index")
  43. # 构建检索器检索,mmr 检索
  44. retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 10}) # 构建检索器
  45. # 构建检索回来后的处理函数
  46. # 构建 Document 转文本段落的工具函数
  47. DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}")
  48. def _combine_documents(docs, document_prompt=DEFAULT_DOCUMENT_PROMPT):
  49. doc_strings = [format_document(doc, document_prompt) for doc in docs]
  50. docs = [d.split('\t')[0] for d in doc_strings]
  51. return docs
  52. # 准备 Model I/O 三元组
  53. template = """找最相关的专业。
  54. 请根据以下已知条件:
  55. - 描述:{content}
  56. - 专业列表:{labels}
  57. 请遵循以下决策规则:
  58. - 给出的专业必须来自于专业列表中列出的专业。
  59. - 仔细分析描述中出现的专业名词,判断它们是否指向特定的专业。
  60. - 让我们一步一步来思考
  61. 请直接回答你认为最相关的专业名称,无需解释说明。
  62. 请按照以下格式回答:
  63. - 输出:[专业]
  64. 注意:
  65. - 您必须给出回答,不能拒绝回答问题。
  66. - 回答必须简明扼要,不能超出问题所涉及的范围。
  67. """
  68. prompt = ChatPromptTemplate.from_template(template)
  69. # 构建 RAG 链
  70. chain = (
  71. {
  72. "labels": retriever | _combine_documents, # 把检索回来结果给 _combine_documents 函数处理,提取内容
  73. "content": RunnablePassthrough() # 直接作为 content 的值,不做任何操作
  74. }
  75. | prompt
  76. | model
  77. | StrOutputParser()
  78. )
  79. print(chain.invoke(content))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/853607
推荐阅读
相关标签
  

闽ICP备14008679号