File size: 2,776 Bytes
b2e325f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
1. 只有使用PyPDFLoader(from langchain_community.document_loaders import PyPDFLoader), 才能获得在metadata中获得page的信息。

"""

from langchain_community.vectorstores import FAISS
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
import streamlit as st
import re
from langchain.llms.base import LLM
from langchain.llms.utils import enforce_stop_tokens
from typing import Dict, List, Optional, Tuple, Union
import requests
import json

# embeddings = HuggingFaceEmbeddings(model_name='/Users/yunshi/Downloads/360Data/Data Center/Working-On Task/演讲与培训/2023ChatGPT/RAG/bge-large-zh/') ## 切换成BGE的embedding。

# from langchain.embeddings.openai import OpenAIEmbeddings
# embeddings = OpenAIEmbeddings(disallowed_special=()) ## 可能需要更新了。
# vector_store = FAISS.load_local("./faiss_index/", embeddings=embeddings) ## 加载vector store到本地。

## 在绝对路径中提取完整的文件名
def extract_document_name(path):
    # 路径分割
    path_segments = path.split("/")
    # 文件名提取
    document_name = path_segments[-1]
    return document_name

## 从一段话中提取 1 句完整的句子,且该句子的长度必须超过 5 个词,同时去除了换行符'\n\n'。
import re
def extract_sentence(text):
    """
    从一段话中提取 1 句完整的句子,且该句子的长度必须超过 5 个词。

    Args:
        text: 一段话。

    Returns:
        提取到的句子。
    """

    # 去除换行符。
    text = text.replace('\n\n', '')
    # 使用正则表达式匹配句子。
    sentences = re.split(r'[。?!;]', text)

    # 过滤掉长度小于 5 个词的句子。
    sentences = [sentence for sentence in sentences if len(sentence.split()) >= 5]

    # 返回第一句句子。
    return sentences[0] if sentences else None

### 综合source的输出内容。
##NOTE: 只有使用PyPDFLoader(from langchain_community.document_loaders import PyPDFLoader), 才能获得在metadata中获得page的信息。
def rag_source(docs):
    print('starting source function!')
    print('docs now:', docs)
    source = ""
    for i, doc in enumerate(docs):
    # for i, doc in enumerate(docs): ### original code here.
        source += f"**【信息来源 {i+1}】** " + extract_document_name(doc.metadata['source']) + ',' + f"第{docs[i].metadata['page']+1}页" + ',部分内容摘录:' + extract_sentence(doc.page_content) + '\n\n'
        # source += f"**【信息来源 {i+1}】** " + extract_document_name(doc.metadata['source']) + ',' + f"第{docs[i].metadata['page']+1}页" + ',部分内容摘录:' + extract_sentence(doc.page_content) + '\n\n' 
        ### original code here.
    print('source:', source)
    return source