下面是Langchain ,并调用Openai编码器与大模型接口实现一个检索增强生成功能的示例
from langchain_community.document_loaders import PyPDFLoader
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
load_dotenv()
###文档加载
loader = PyPDFLoader("/root/autodl-tmp/ragtest/langchain_rag/Transformer_interview.pdf")
pages = loader.load_and_split()
#print(f"第0页:\n{pages[0]}") ## 也可通过pages[0].page_content只获取本页内容
###文档切分
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=200,
chunk_overlap=100,
length_function=len,
add_start_index=True,
)
#定义向量嵌入模型
embeddings_model = OpenAIEmbeddings(
model="text-embedding-3-small",
openai_api_key=openai_api_key=os.getenv("OPENAI_API_KEY"),
openai_api_base="https://abc" # <— 指定 base
) ##OpenAI文本向量化模型接口的封装
paragraphs = []
for page in pages:
paragraphs.extend(text_splitter.create_documents([page.page_content]))
#print(paragraphs)
###文档向量化,向量数据库存储
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
db = Chroma.from_documents(paragraphs, embeddings_model)
query="如何降低 Transformer 的 Feedforward 层的参数数量?"
# docs=db.similarity_search(query)#一行代码症
# for doc in docs:
# print(f"{doc.page_content}\n-------\n")
#设置检索器
#retriever = db.as_retriever()
#retriever = db.as_retriever(search_kwargs={"k": 3}) #指定相似度前三的
retriever = db.as_retriever(
#指定相似度
search_type="similarity_score_threshold",search_kwargs={"score_threshold":0.5}
)
docs = retriever.invoke(query)
# for doc in docs:
# print(f"{doc.page_content}\n-------\n")
##5.组装Prompt模板
import os
#加载.env 到环境变量
from dotenv import load_dotenv
load_dotenv()
from langchain_openai import ChatOpenAI
#定义大语言模型
llm = chat_model = ChatOpenAI(
model_name="gpt-3.5-turbo",
openai_api_key=openai_api_key=os.getenv("OPENAI_API_KEY"),
openai_api_base="https://abc" # <— 指定 base
) #默认是gpt-3.5-turbo
prompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题”。
已知信息:
{info}
用户问:
{question}
请用中文回答用户问题。
"""
from langchain.prompts import PromptTemplate
template = PromptTemplate.from_template(prompt_template)
print(template)
print("+"*50)
#注意下面的问题query是第二次调用了,上面用来查找过相似文档docs
prompt = template.format(info=docs[2].page_content, question = '如何降低 Transformer 的 Feedforward 层的参数数量?')
print(prompt)
##6. 调用LLM
response = llm.invoke(prompt)
print(response.content)