LightRAG 是个开源的 RAG 框架,专门用来快速搭建模块化的检索增强生成管道。这个项目在 GitHub 上热度不低,我们今天来看看他到底怎么用
基础安装与环境配置
LightRAG 的安装过程很简单,几行命令就能搞定:
pip install "lightrag-hku[api]"
cp env.example .env # --->这个有很多参数 非常丰富
lightrag-server官方提供的 UI 界面做得还算不错,不过测试时基本没用上,因为更关注的是代码层面的实现。
环境搭好之后,可以先跑一下官方提供的示例代码(摘自 readme):
import os
import asyncio
from lightrag import LightRAG, QueryParam
from lightrag.llm.openai import gpt_4o_mini_complete, gpt_4o_complete, openai_embed
from lightrag.kg.shared_storage import initialize_pipeline_status
from lightrag.utils import setup_logger
setup_logger("lightrag", level="INFO")
WORKING_DIR = "./rag_storage"
if not os.path.exists(WORKING_DIR):
os.mkdir(WORKING_DIR)
async def initialize_rag():
rag = LightRAG(
working_dir=WORKING_DIR,
embedding_func=openai_embed,
llm_model_func=gpt_4o_mini_complete,
)
# IMPORTANT: Both initialization calls are required!
await rag.initialize_storages() # Initialize storage backends
await initialize_pipeline_status() # Initialize processing pipeline
return rag
async def main():
try:
# Initialize RAG instance
rag = await initialize_rag()
await rag.ainsert("Your text")
# Perform hybrid search
mode = "hybrid"
print(
await rag.aquery(
"What are the top themes in this story?",
param=QueryParam(mode=mode)
)
)
except Exception as e:
print(f"An error occurred: {e}")
finally:
if rag:
await rag.finalize_storages()
if __name__ == "__main__":
asyncio.run(main())官方示例里还有个基于 Gemini 的版本,看着比较简单就选了这个来测试:
# pip install -q -U google-genai to use gemini as a client
import os
import numpy as np
from google import genai
from google.genai import types
from dotenv import load_dotenv
from lightrag.utils import EmbeddingFunc
from lightrag import LightRAG, QueryParam
from sentence_transformers import SentenceTransformer
from lightrag.kg.shared_storage import initialize_pipeline_status
import asyncio
import nest_asyncio
# Apply nest_asyncio to solve event loop issues
nest_asyncio.apply()
load_dotenv()
gemini_api_key = os.getenv("GEMINI_API_KEY")
WORKING_DIR = "./dickens"
if os.path.exists(WORKING_DIR):
import shutil
shutil.rmtree(WORKING_DIR)
os.mkdir(WORKING_DIR)
async def llm_model_func(
prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs
) -> str:
# 1. Initialize the GenAI Client with your Gemini API Key
client = genai.Client(api_key=gemini_api_key)
# 2. Combine prompts: system prompt, history, and user prompt
if history_messages is None:
history_messages = []
combined_prompt = ""
if system_prompt:
combined_prompt += f"{system_prompt}\n"
for msg in history_messages:
# Each msg is expected to be a dict: {"role": "...", "content": "..."}
combined_prompt += f"{msg['role']}: {msg['content']}\n"
# Finally, add the new user prompt
combined_prompt += f"user: {prompt}"
# 3. Call the Gemini model
response = client.models.generate_content(
model="gemini-1.5-flash",
contents=[combined_prompt],
config=types.GenerateContentConfig(max_output_tokens=500, temperature=0.1),
)
# 4. Return the response text
return response.text
async def embedding_func(texts: list[str]) -> np.ndarray:
model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = model.encode(texts, convert_to_numpy=True)
return embeddings
async def initialize_rag():
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=llm_model_func,
embedding_func=EmbeddingFunc(
embedding_dim=384,
max_token_size=8192,
func=embedding_func,
),
)
await rag.initialize_storages()
await initialize_pipeline_status()
return rag
def main():
# Initialize RAG instance
rag = asyncio.run(initialize_rag())
file_path = "story.txt"
with open(file_path, "r") as file:
text = file.read()
rag.insert(text)
response = rag.query(
query="What is the main theme of the story?",
param=QueryParam(mode="hybrid", top_k=5, response_type="single line"),
)
print(response)
if __name__ == "__main__":
main().env配置文件的参数非常丰富,需要根据实际使用的工具链做适配。为了调用本地模型,我这里用Ollama 做了相应调整。
### This is sample file of .env
###########################
### Server Configuration
###########################
HOST=0.0.0.0
PORT=9621
WEBUI_TITLE='My Graph KB'
WEBUI_DESCRIPTION="Simple and Fast Graph Based RAG System"
# WORKERS=2
### gunicorn worker timeout(as default LLM request timeout if LLM_TIMEOUT is not set)
# TIMEOUT=150
# CORS_ORIGINS=http://localhost:3000,http://localhost:8080
### Optional SSL Configuration
# SSL=true
# SSL_CERTFILE=/path/to/cert.pem
# SSL_KEYFILE=/path/to/key.pem
### Directory Configuration (defaults to current working directory)
### Default value is ./inputs and ./rag_storage
# INPUT_DIR=<absolute_path_for_doc_input_dir>
# WORKING_DIR=<absolute_path_for_working_dir>
### Tiktoken cache directory (Store cached files in this folder for offline deployment)
# TIKTOKEN_CACHE_DIR=/app/data/tiktoken
### Ollama Emulating Model and Tag
# OLLAMA_EMULATING_MODEL_NAME=lightrag
OLLAMA_EMULATING_MODEL_TAG=latest
### Max nodes return from graph retrieval in webui
# MAX_GRAPH_NODES=1000
### Logging level
# LOG_LEVEL=INFO
# VERBOSE=False
# LOG_MAX_BYTES=10485760
# LOG_BACKUP_COUNT=5
### Logfile location (defaults to current working directory)
# LOG_DIR=/path/to/log/directory
#####################################
### Login and API-Key Configuration
#####################################
# AUTH_ACCOUNTS='admin:admin123,user1:pass456'
# TOKEN_SECRET=Your-Key-For-LightRAG-API-Server
# TOKEN_EXPIRE_HOURS=48
# GUEST_TOKEN_EXPIRE_HOURS=24
# JWT_ALGORITHM=HS256
### API-Key to access LightRAG Server API
# LIGHTRAG_API_KEY=your-secure-api-key-here
# WHITELIST_PATHS=/health,/api/*
######################################################################################
### Query Configuration
###
### How to control the context length sent to LLM:
### MAX_ENTITY_TOKENS + MAX_RELATION_TOKENS < MAX_TOTAL_TOKENS
### Chunk_Tokens = MAX_TOTAL_TOKENS - Actual_Entity_Tokens - Actual_Relation_Tokens
######################################################################################
# LLM response cache for query (Not valid for streaming response)
ENABLE_LLM_CACHE=true
# COSINE_THRESHOLD=0.2
### Number of entities or relations retrieved from KG
# TOP_K=40
### Maximum number or chunks for naive vector search
# CHUNK_TOP_K=20
### control the actual entities send to LLM
# MAX_ENTITY_TOKENS=6000
### control the actual relations send to LLM
# MAX_RELATION_TOKENS=8000
### control the maximum tokens send to LLM (include entities, relations and chunks)
# MAX_TOTAL_TOKENS=30000
### chunk selection strategies
### VECTOR: Pick KG chunks by vector similarity, delivered chunks to the LLM aligning more closely with naive retrieval
### WEIGHT: Pick KG chunks by entity and chunk weight, delivered more solely KG related chunks to the LLM
### If reranking is enabled, the impact of chunk selection strategies will be diminished.
# KG_CHUNK_PICK_METHOD=VECTOR
#########################################################
### Reranking configuration
### RERANK_BINDING type: null, cohere, jina, aliyun
### For rerank model deployed by vLLM use cohere binding
#########################################################
RERANK_BINDING=null
### Enable rerank by default in query params when RERANK_BINDING is not null
# RERANK_BY_DEFAULT=True
### rerank score chunk filter(set to 0.0 to keep all chunks, 0.6 or above if LLM is not strong enough)
# MIN_RERANK_SCORE=0.0
### For local deployment with vLLM
# RERANK_MODEL=BAAI/bge-reranker-v2-m3
# RERANK_BINDING_HOST=http://localhost:8000/v1/rerank
# RERANK_BINDING_API_KEY=your_rerank_api_key_here
### Default value for Cohere AI
# RERANK_MODEL=rerank-v3.5
# RERANK_BINDING_HOST=https://api.cohere.com/v2/rerank
# RERANK_BINDING_API_KEY=your_rerank_api_key_here
### Default value for Jina AI
# RERANK_MODEL=jina-reranker-v2-base-multilingual
# RERANK_BINDING_HOST=https://api.jina.ai/v1/rerank
# RERANK_BINDING_API_KEY=your_rerank_api_key_here
### Default value for Aliyun
# RERANK_MODEL=gte-rerank-v2
# RERANK_BINDING_HOST=https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank
# RERANK_BINDING_API_KEY=your_rerank_api_key_here
########################################
### Document processing configuration
########################################
ENABLE_LLM_CACHE_FOR_EXTRACT=true
### Document processing output language: English, Chinese, French, German ...
SUMMARY_LANGUAGE=English
### Entity types that the LLM will attempt to recognize
# ENTITY_TYPES='["Person", "Creature", "Organization", "Location", "Event", "Concept", "Method", "Content", "Data", "Artifact", "NaturalObject"]'
### Chunk size for document splitting, 500~1500 is recommended
# CHUNK_SIZE=1200
# CHUNK_OVERLAP_SIZE=100
### Number of summary segments or tokens to trigger LLM summary on entity/relation merge (at least 3 is recommended)
# FORCE_LLM_SUMMARY_ON_MERGE=8
### Max description token size to trigger LLM summary
# SUMMARY_MAX_TOKENS = 1200
### Recommended LLM summary output length in tokens
# SUMMARY_LENGTH_RECOMMENDED_=600
### Maximum context size sent to LLM for description summary
# SUMMARY_CONTEXT_SIZE=12000
### control the maximum chunk_ids stored in vector and graph db
# MAX_SOURCE_IDS_PER_ENTITY=300
# MAX_SOURCE_IDS_PER_RELATION=300
### control chunk_ids limitation method: FIFO, KEEP
### FIFO: First in first out
### KEEP: Keep oldest (less merge action and faster)
# SOURCE_IDS_LIMIT_METHOD=FIFO
# Maximum number of file paths stored in entity/relation file_path field (For displayed only, does not affect query performance)
# MAX_FILE_PATHS=100
### maximum number of related chunks per source entity or relation
### The chunk picker uses this value to determine the total number of chunks selected from KG(knowledge graph)
### Higher values increase re-ranking time
# RELATED_CHUNK_NUMBER=5
###############################
### Concurrency Configuration
###############################
### Max concurrency requests of LLM (for both query and document processing)
MAX_ASYNC=4
### Number of parallel processing documents(between 2~10, MAX_ASYNC/3 is recommended)
MAX_PARALLEL_INSERT=2
### Max concurrency requests for Embedding
# EMBEDDING_FUNC_MAX_ASYNC=8
### Num of chunks send to Embedding in single request
# EMBEDDING_BATCH_NUM=10
###########################################################
### LLM Configuration
### LLM_BINDING type: openai, ollama, lollms, azure_openai, aws_bedrock
###########################################################
### LLM request timeout setting for all llm (0 means no timeout for Ollma)
# LLM_TIMEOUT=180
LLM_BINDING=ollama
LLM_MODEL=granite4:latest
LLM_BINDING_HOST=http://localhost:11434
[#LLM](#LLM)_BINDING_API_KEY=your_api_key
### Optional for Azure
# AZURE_OPENAI_API_VERSION=2024-08-01-preview
# AZURE_OPENAI_DEPLOYMENT=gpt-4o
### Openrouter example
# LLM_MODEL=google/gemini-2.5-flash
# LLM_BINDING_HOST=https://openrouter.ai/api/v1
# LLM_BINDING_API_KEY=your_api_key
# LLM_BINDING=openai
### OpenAI Compatible API Specific Parameters
### Increased temperature values may mitigate infinite inference loops in certain LLM, such as Qwen3-30B.
# OPENAI_LLM_TEMPERATURE=0.9
### Set the max_tokens to mitigate endless output of some LLM (less than LLM_TIMEOUT * llm_output_tokens/second, i.e. 9000 = 180s * 50 tokens/s)
### Typically, max_tokens does not include prompt content, though some models, such as Gemini Models, are exceptions
### For vLLM/SGLang deployed models, or most of OpenAI compatible API provider
# OPENAI_LLM_MAX_TOKENS=9000
### For OpenAI o1-mini or newer modles
[#OPENAI](#OPENAI)_LLM_MAX_COMPLETION_TOKENS=9000
#### OpenAI's new API utilizes max_completion_tokens instead of max_tokens
# OPENAI_LLM_MAX_COMPLETION_TOKENS=9000
### use the following command to see all support options for OpenAI, azure_openai or OpenRouter
### lightrag-server --llm-binding openai --help
### OpenAI Specific Parameters
# OPENAI_LLM_REASONING_EFFORT=minimal
### OpenRouter Specific Parameters
# OPENAI_LLM_EXTRA_BODY='{"reasoning": {"enabled": false}}'
### Qwen3 Specific Parameters deploy by vLLM
# OPENAI_LLM_EXTRA_BODY='{"chat_template_kwargs": {"enable_thinking": false}}'
### use the following command to see all support options for Ollama LLM
### If LightRAG deployed in Docker uses host.docker.internal instead of localhost in LLM_BINDING_HOST
### lightrag-server --llm-binding ollama --help
### Ollama Server Specific Parameters
### OLLAMA_LLM_NUM_CTX must be provided, and should at least larger than MAX_TOTAL_TOKENS + 2000
OLLAMA_LLM_NUM_CTX=32768
### Set the max_output_tokens to mitigate endless output of some LLM (less than LLM_TIMEOUT * llm_output_tokens/second, i.e. 9000 = 180s * 50 tokens/s)
# OLLAMA_LLM_NUM_PREDICT=9000
### Stop sequences for Ollama LLM
# OLLAMA_LLM_STOP='["</s>", "<|EOT|>"]'
### Bedrock Specific Parameters
# BEDROCK_LLM_TEMPERATURE=1.0
####################################################################################
### Embedding Configuration (Should not be changed after the first file processed)
### EMBEDDING_BINDING: ollama, openai, azure_openai, jina, lollms, aws_bedrock
####################################################################################
# EMBEDDING_TIMEOUT=30
EMBEDDING_BINDING=ollama
EMBEDDING_MODEL=granite-embedding:latest
EMBEDDING_DIM=1024
EMBEDDING_BINDING_API_KEY=your_api_key
# If LightRAG deployed in Docker uses host.docker.internal instead of localhost
EMBEDDING_BINDING_HOST=http://localhost:11434
### OpenAI compatible (VoyageAI embedding openai compatible)
# EMBEDDING_BINDING=openai
# EMBEDDING_MODEL=text-embedding-3-large
# EMBEDDING_DIM=3072
# EMBEDDING_BINDING_HOST=https://api.openai.com/v1
# EMBEDDING_BINDING_API_KEY=your_api_key
### Optional for Azure
# AZURE_EMBEDDING_DEPLOYMENT=text-embedding-3-large
# AZURE_EMBEDDING_API_VERSION=2023-05-15
# AZURE_EMBEDDING_ENDPOINT=your_endpoint
# AZURE_EMBEDDING_API_KEY=your_api_key
### Jina AI Embedding
# EMBEDDING_BINDING=jina
# EMBEDDING_BINDING_HOST=https://api.jina.ai/v1/embeddings
# EMBEDDING_MODEL=jina-embeddings-v4
# EMBEDDING_DIM=2048
# EMBEDDING_BINDING_API_KEY=your_api_key
### Optional for Ollama embedding
OLLAMA_EMBEDDING_NUM_CTX=8192
### use the following command to see all support options for Ollama embedding
### lightrag-server --embedding-binding ollama --help
####################################################################
### WORKSPACE sets workspace name for all storage types
### for the purpose of isolating data from LightRAG instances.
### Valid workspace name constraints: a-z, A-Z, 0-9, and _
####################################################################
# WORKSPACE=space1
############################
### Data storage selection
############################
### Default storage (Recommended for small scale deployment)
# LIGHTRAG_KV_STORAGE=JsonKVStorage
# LIGHTRAG_DOC_STATUS_STORAGE=JsonDocStatusStorage
# LIGHTRAG_GRAPH_STORAGE=NetworkXStorage
# LIGHTRAG_VECTOR_STORAGE=NanoVectorDBStorage
### Redis Storage (Recommended for production deployment)
# LIGHTRAG_KV_STORAGE=RedisKVStorage
# LIGHTRAG_DOC_STATUS_STORAGE=RedisDocStatusStorage
### Vector Storage (Recommended for production deployment)
# LIGHTRAG_VECTOR_STORAGE=MilvusVectorDBStorage
# LIGHTRAG_VECTOR_STORAGE=QdrantVectorDBStorage
# LIGHTRAG_VECTOR_STORAGE=FaissVectorDBStorage
### Graph Storage (Recommended for production deployment)
# LIGHTRAG_GRAPH_STORAGE=Neo4JStorage
# LIGHTRAG_GRAPH_STORAGE=MemgraphStorage
### PostgreSQL
# LIGHTRAG_KV_STORAGE=PGKVStorage
# LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage
# LIGHTRAG_GRAPH_STORAGE=PGGraphStorage
# LIGHTRAG_VECTOR_STORAGE=PGVectorStorage
### MongoDB (Vector storage only available on Atlas Cloud)
# LIGHTRAG_KV_STORAGE=MongoKVStorage
# LIGHTRAG_DOC_STATUS_STORAGE=MongoDocStatusStorage
# LIGHTRAG_GRAPH_STORAGE=MongoGraphStorage
# LIGHTRAG_VECTOR_STORAGE=MongoVectorDBStorage
### PostgreSQL Configuration
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=your_username
POSTGRES_PASSWORD='your_password'
POSTGRES_DATABASE=your_database
POSTGRES_MAX_CONNECTIONS=12
# POSTGRES_WORKSPACE=forced_workspace_name
### PostgreSQL Vector Storage Configuration
### Vector storage type: HNSW, IVFFlat
POSTGRES_VECTOR_INDEX_TYPE=HNSW
POSTGRES_HNSW_M=16
POSTGRES_HNSW_EF=200
POSTGRES_IVFFLAT_LISTS=100
### PostgreSQL Connection Retry Configuration (Network Robustness)
### Number of retry attempts (1-10, default: 3)
### Initial retry backoff in seconds (0.1-5.0, default: 0.5)
### Maximum retry backoff in seconds (backoff-60.0, default: 5.0)
### Connection pool close timeout in seconds (1.0-30.0, default: 5.0)
# POSTGRES_CONNECTION_RETRIES=3
# POSTGRES_CONNECTION_RETRY_BACKOFF=0.5
# POSTGRES_CONNECTION_RETRY_BACKOFF_MAX=5.0
# POSTGRES_POOL_CLOSE_TIMEOUT=5.0
### PostgreSQL SSL Configuration (Optional)
# POSTGRES_SSL_MODE=require
# POSTGRES_SSL_CERT=/path/to/client-cert.pem
# POSTGRES_SSL_KEY=/path/to/client-key.pem
# POSTGRES_SSL_ROOT_CERT=/path/to/ca-cert.pem
# POSTGRES_SSL_CRL=/path/to/crl.pem
### PostgreSQL Server Settings (for Supabase Supavisor)
# Use this to pass extra options to the PostgreSQL connection string.
# For Supabase, you might need to set it like this:
# POSTGRES_SERVER_SETTINGS="options=reference%3D[project-ref]"
# Default is 100 set to 0 to disable
# POSTGRES_STATEMENT_CACHE_SIZE=100
### Neo4j Configuration
NEO4J_URI=neo4j+s://xxxxxxxx.databases.neo4j.io
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD='your_password'
NEO4J_DATABASE=neo4j
NEO4J_MAX_CONNECTION_POOL_SIZE=100
NEO4J_CONNECTION_TIMEOUT=30
NEO4J_CONNECTION_ACQUISITION_TIMEOUT=30
NEO4J_MAX_TRANSACTION_RETRY_TIME=30
NEO4J_MAX_CONNECTION_LIFETIME=300
NEO4J_LIVENESS_CHECK_TIMEOUT=30
NEO4J_KEEP_ALIVE=true
# NEO4J_WORKSPACE=forced_workspace_name
### MongoDB Configuration
MONGO_URI=mongodb://root:root@localhost:27017/
[#MONGO](#MONGO)_URI=mongodb+srv://xxxx
MONGO_DATABASE=LightRAG
# MONGODB_WORKSPACE=forced_workspace_name
### Milvus Configuration
MILVUS_URI=http://localhost:19530
MILVUS_DB_NAME=lightrag
# MILVUS_USER=root
# MILVUS_PASSWORD=your_password
# MILVUS_TOKEN=your_token
# MILVUS_WORKSPACE=forced_workspace_name
### Qdrant
QDRANT_URL=http://localhost:6333
# QDRANT_API_KEY=your-api-key
# QDRANT_WORKSPACE=forced_workspace_name
### Redis
REDIS_URI=redis://localhost:6379
REDIS_SOCKET_TIMEOUT=30
REDIS_CONNECT_TIMEOUT=10
REDIS_MAX_CONNECTIONS=100
REDIS_RETRY_ATTEMPTS=3
# REDIS_WORKSPACE=forced_workspace_name
### Memgraph Configuration
MEMGRAPH_URI=bolt://localhost:7687
MEMGRAPH_USERNAME=
MEMGRAPH_PASSWORD=
MEMGRAPH_DATABASE=memgraph
# MEMGRAPH_WORKSPACE=forced_workspace_name参考前面的 Gemini 示例,写了下面的代码包含了一些硬编码文本的测试代码:
# 准备环境
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install "lightrag-hku[api]"
pip install ollama import os
import asyncio
from functools import partial
from datetime import datetime
from lightrag import LightRAG, QueryParam
try:
from ollama import AsyncClient
except ImportError:
print("Warning: The 'ollama' Python package is required. Please run: pip install ollama")
class AsyncClient:
def __init__(self, host): pass
async def chat(self, **kwargs): raise NotImplementedError("ollama package not installed.")
from lightrag.llm.ollama import ollama_embed
from lightrag.utils import setup_logger, EmbeddingFunc
from lightrag.kg.shared_storage import initialize_pipeline_status
OLLAMA_BASE_URL = "http://localhost:11434"
LLM_MODEL = "granite4:latest"
EMBEDDING_MODEL = "granite-embedding:latest"
WORKING_DIR = "./rag_storage_ollama"
EMBEDDING_DIMENSION = 384
OUTPUT_DIR = "./output"
setup_logger("lightrag", level="INFO")
if not os.path.exists(WORKING_DIR):
os.mkdir(WORKING_DIR)
if not os.path.exists(OUTPUT_DIR):
os.mkdir(OUTPUT_DIR)
async def custom_ollama_llm_complete(prompt: str, system_prompt: str = None, **kwargs):
"""
A custom function that handles the Ollama client initialization and model/base_url
parameters that are injected via functools.partial, while robustly filtering out
unwanted internal keywords.
"""
model = kwargs.pop('model')
base_url = kwargs.pop('base_url')
client = AsyncClient(host=base_url)
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": prompt})
keys_to_filter = {
'host',
'hashing_kv',
'llm_model_name',
'history_messages',
'keyword_extraction',
'enable_cot',
'is_system_prompt_only',
'prompt_config'
}
cleaned_kwargs = {k: v for k, v in kwargs.items() if k not in keys_to_filter}
try:
response = await client.chat(
model=model,
messages=messages,
**cleaned_kwargs
)
return response['message']['content']
except Exception as e:
raise e
async def initialize_rag():
"""Initializes the LightRAG instance using standard Ollama configuration."""
configured_ollama_complete = partial(
custom_ollama_llm_complete,
model=LLM_MODEL,
base_url=OLLAMA_BASE_URL,
)
configured_ollama_embed = partial(
ollama_embed,
embed_model=EMBEDDING_MODEL,
base_url=OLLAMA_BASE_URL
)
wrapped_embedding_func = EmbeddingFunc(
embedding_dim=EMBEDDING_DIMENSION,
func=configured_ollama_embed,
)
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=configured_ollama_complete,
embedding_func=wrapped_embedding_func,
)
await rag.initialize_storages()
await initialize_pipeline_status()
return rag
async def main():
rag = None
query = "How does RAG solve the problem of LLM hallucination and what are its main use cases?"
try:
print("Checking if required Ollama models are pulled...")
# the knowledge source
sample_text = """
The concept of Retrieval-Augmented Generation (RAG) is a critical development
in the field of large language models (LLMs). It addresses the 'hallucination'
problem by grounding LLM responses in external, verified knowledge sources.
Instead of relying solely on the LLM's static training data, RAG first retrieves
relevant documents from a knowledge base (often a vector store) and then feeds
these documents, alongside the user's query, to the LLM for generation.
This two-step process significantly improves the accuracy, relevance, and
transparency of the generated output. Popular applications include enterprise
search, customer support, and domain-specific QA systems.
"""
print(f"--- 1. Initializing RAG with Ollama Models ---")
rag = await initialize_rag()
print(f"\n--- 2. Inserting Sample Text ({len(sample_text.split())} words) ---")
await rag.ainsert(sample_text)
print("Insertion complete. Data is ready for retrieval.")
mode = "hybrid"
print(f"\n--- 3. Querying the RAG System (Mode: {mode}) ---")
print(f"Query: '{query}'")
rag_result = await rag.aquery(
query,
param=QueryParam(mode=mode)
)
response_text = None
if hasattr(rag_result, 'get_response_text'):
response_text = rag_result.get_response_text()
elif isinstance(rag_result, str):
response_text = rag_result
print("\n" + "="*50)
print("FINAL RAG RESPONSE")
print("="*50)
output_content = "" # Prepare string for file output
if response_text and not str(response_text).strip().startswith("Error:"):
print(response_text)
output_content += f"# RAG Query Result\n\n"
output_content += f"## Query\n\n> {query}\n\n"
output_content += f"## LLM/Cache Response\n\n{response_text}\n\n"
print("\n" + "="*50)
print("\n--- Context Retrieved (Sources) ---")
output_content += f"## Retrieved Context (Sources)\n\n"
if not isinstance(rag_result, str) and rag_result.retriever_output and rag_result.retriever_output.docs:
for i, doc in enumerate(rag_result.retriever_output.docs):
source_text = doc.text
print(f"Source {i+1}: {source_text[:100]}...")
output_content += f"### Source {i+1}\n\n"
output_content += f"```text\n{source_text}\n```\n"
else:
print("No context documents were retrieved (or result was a cache hit string).")
output_content += "No context documents were retrieved (or result was a cache hit string).\n"
else:
error_message = "LLM failed to generate a response (Check Ollama logs for details)."
print(error_message)
output_content += f"# RAG Query Result\n\n## Error\n\n{error_message}\n\n"
if response_text:
print(f"\nError String from LightRAG: {response_text}")
output_content += f"**Error Detail:** {response_text}\n"
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"rag_query_output_{timestamp}.md"
output_filepath = os.path.join(OUTPUT_DIR, filename)
with open(output_filepath, 'w', encoding='utf-8') as f:
f.write(output_content)
print(f"\n--- Output Written to File ---")
print(f"Successfully wrote output to: {output_filepath}")
except Exception as e:
if "'str' object has no attribute 'retriever_output'" in str(e):
print("\n--- ERROR BYPASS: Detected Cache Hit String Result ---")
print("The response was successfully retrieved from the cache and written to the output file.")
else:
# For all other (real) exceptions, print the detailed error block
print("\n" + "="*50)
print("AN ERROR OCCURRED DURING RAG PROCESS")
print("="*50)
print(f"Error: {e}")
print(f"Please ensure Ollama is running and accessible at {OLLAMA_BASE_URL}, and the models '{LLM_MODEL}' and '{EMBEDDING_MODEL}' are pulled locally.")
print(f"To pull: 'ollama pull {LLM_MODEL}' and 'ollama pull {EMBEDDING_MODEL}'")
print("="*50 + "\n")
finally:
if rag:
print("\n--- Finalizing storages ---")
await rag.finalize_storages()
if __name__ == "__main__":
asyncio.run(main())虽然
.env文件里有参数可以配置 input 文件夹路径,但测试时直接在代码里写死了路径。
运行后的输出包括控制台日志和 markdown 格式的结果文件,结果太长我就不贴了。
接下来测试了更实际的场景:准备了几份 markdown 格式的文档(其他格式应该也支持,但没测),用这些文档构建了自己的 RAG 系统,继续用 Ollama 和 Granite 模型来验证效果,这次的代码就没那么硬编码了。
.env文件提供了 input 文件夹的配置选项,不过这里还是用的硬编码方式
import os
import asyncio
from functools import partial
from datetime import datetime
from lightrag import LightRAG, QueryParam
import glob
try:
from ollama import AsyncClient
except ImportError:
print("Warning: The 'ollama' Python package is required. Please run: pip install ollama")
class AsyncClient:
def __init__(self, host): pass
async def chat(self, **kwargs): raise NotImplementedError("ollama package not installed.")
from lightrag.llm.ollama import ollama_embed
from lightrag.utils import setup_logger, EmbeddingFunc
from lightrag.kg.shared_storage import initialize_pipeline_status
OLLAMA_BASE_URL = "http://localhost:11434"
LLM_MODEL = "granite4:latest"
EMBEDDING_MODEL = "granite-embedding:latest"
WORKING_DIR = "./rag_storage_ollama"
EMBEDDING_DIMENSION = 384
DOCUMENTS_DIR = "./documents" # Directory to read source files from
OUTPUT_DIR = "./output" # Directory to write RAG results to
setup_logger("lightrag", level="INFO")
if not os.path.exists(WORKING_DIR):
os.mkdir(WORKING_DIR)
print(f"Created working directory: {WORKING_DIR}")
if not os.path.exists(OUTPUT_DIR):
os.mkdir(OUTPUT_DIR)
print(f"Created output directory: {OUTPUT_DIR}")
if not os.path.exists(DOCUMENTS_DIR):
os.mkdir(DOCUMENTS_DIR)
print(f"Created documents directory: {DOCUMENTS_DIR}")
async def custom_ollama_llm_complete(prompt: str, system_prompt: str = None, **kwargs):
"""
A custom function that handles the Ollama client initialization and model/base_url
parameters that are injected via functools.partial, while robustly filtering out
unwanted internal keywords.
"""
model = kwargs.pop('model')
base_url = kwargs.pop('base_url')
client = AsyncClient(host=base_url)
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": prompt})
keys_to_filter = {
'host',
'hashing_kv',
'llm_model_name',
'history_messages',
'keyword_extraction',
'enable_cot',
'is_system_prompt_only',
'prompt_config'
}
cleaned_kwargs = {k: v for k, v in kwargs.items() if k not in keys_to_filter}
try:
response = await client.chat(
model=model,
messages=messages,
**cleaned_kwargs
)
return response['message']['content']
except Exception as e:
raise e
async def initialize_rag():
"""Initializes the LightRAG instance using standard Ollama configuration."""
configured_ollama_complete = partial(
custom_ollama_llm_complete,
model=LLM_MODEL,
base_url=OLLAMA_BASE_URL,
)
configured_ollama_embed = partial(
ollama_embed,
embed_model=EMBEDDING_MODEL,
base_url=OLLAMA_BASE_URL
)
wrapped_embedding_func = EmbeddingFunc(
embedding_dim=EMBEDDING_DIMENSION,
func=configured_ollama_embed,
)
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=configured_ollama_complete,
embedding_func=wrapped_embedding_func,
)
await rag.initialize_storages()
await initialize_pipeline_status()
return rag
async def load_and_insert_documents(rag: LightRAG):
"""
Reads files from the DOCUMENTS_DIR and inserts their content into the RAG system.
Fixed to use a more compatible method for document insertion.
"""
file_paths = glob.glob(os.path.join(DOCUMENTS_DIR, '*.[mM][dD]')) + \
glob.glob(os.path.join(DOCUMENTS_DIR, '*.[tT][xX][tT]'))
if not file_paths:
print("\n--- WARNING: No documents found in './documents' directory. ---")
print("Please add some Markdown (.md) or Text (.txt) files to populate the knowledge base.")
return False
print(f"\n--- 2. Inserting Documents ({len(file_paths)} file(s) found) ---")
insertion_succeeded = 0
for file_path in file_paths:
filename = os.path.basename(file_path)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
await rag.ainsert(content, doc_meta={'doc_id': filename})
print(f" > Successfully inserted: {filename} ({len(content.split())} words)")
insertion_succeeded += 1
except TypeError as te:
if "'doc_id'" in str(te) or "'doc_meta'" in str(te):
print(f" > FAILED (Type Error): {filename}. Attempting insertion without metadata to check compatibility.")
try:
await rag.ainsert(content)
print(f" > Successfully inserted (no metadata): {filename}")
insertion_succeeded += 1
except Exception as e:
print(f" > FAILED (General Error): {filename} - {e}")
else:
print(f" > FAILED to read or insert {filename} (Type Error): {te}")
except Exception as e:
print(f" > FAILED to read or insert {filename} (General Error): {e}")
if insertion_succeeded == 0:
print("Insertion complete, but no documents were successfully inserted. Please check LightRAG documentation for the correct argument name for source IDs.")
return False
print("Insertion complete. Data is ready for retrieval.")
return True
async def main():
rag = None
query = "Describe Quantum-Safe cryptography?"
try:
print("Checking if required Ollama models are pulled...")
print(f"--- 1. Initializing RAG with Ollama Models ---")
rag = await initialize_rag()
documents_inserted = await load_and_insert_documents(rag)
if not documents_inserted:
return
mode = "hybrid"
print(f"\n--- 3. Querying the RAG System (Mode: {mode}) ---")
print(f"Query: '{query}'")
rag_result = await rag.aquery(
query,
param=QueryParam(mode=mode)
)
response_text = None
if hasattr(rag_result, 'get_response_text'):
response_text = rag_result.get_response_text()
elif isinstance(rag_result, str):
response_text = rag_result
print("\n" + "="*50)
print("FINAL RAG RESPONSE")
print("="*50)
output_content = "" # Prepare string for file output
if response_text and not str(response_text).strip().startswith("Error:"):
print(response_text)
output_content += f"# RAG Query Result\n\n"
output_content += f"## Query\n\n> {query}\n\n"
output_content += f"## LLM/Cache Response\n\n{response_text}\n\n"
print("\n" + "="*50)
print("\n--- Context Retrieved (Sources) ---")
output_content += f"## Retrieved Context (Sources)\n\n"
if not isinstance(rag_result, str) and rag_result.retriever_output and rag_result.retriever_output.docs:
unique_sources = set()
for i, doc in enumerate(rag_result.retriever_output.docs):
source_text = doc.text
source_id = doc.doc_id if hasattr(doc, 'doc_id') and doc.doc_id else (
doc.doc_meta.get('doc_id') if hasattr(doc, 'doc_meta') and isinstance(doc.doc_meta, dict) else 'Unknown Source'
)
unique_sources.add(source_id)
print(f"Source {i+1} (File: {source_id}): {source_text[:100]}...")
output_content += f"### Source {i+1} (File: `{source_id}`)\n\n"
output_content += f"```text\n{source_text}\n```\n"
print(f"\nAnswer Grounded in: {', '.join(sorted(list(unique_sources)))}")
else:
print("No context documents were retrieved (or result was a cache hit string).")
output_content += "No context documents were retrieved (or result was a cache hit string).\n"
else:
error_message = "LLM failed to generate a response (Check Ollama logs for details)."
print(error_message)
output_content += f"# RAG Query Result\n\n## Error\n\n{error_message}\n\n"
if response_text:
print(f"\nError String from LightRAG: {response_text}")
output_content += f"**Error Detail:** {response_text}\n"
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"rag_query_output_{timestamp}.md"
output_filepath = os.path.join(OUTPUT_DIR, filename)
with open(output_filepath, 'w', encoding='utf-8') as f:
f.write(output_content)
print(f"\n--- Output Written to File ---")
print(f"Successfully wrote output to: {output_filepath}")
except Exception as e:
if "'str' object has no attribute 'retriever_output'" in str(e):
print("\n--- ERROR BYPASS: Detected Cache Hit String Result ---")
print("The response was successfully retrieved from the cache and written to the output file.")
else:
print("\n" + "="*50)
print("AN ERROR OCCURRED DURING RAG PROCESS")
print("="*50)
print(f"Error: {e}")
print(f"Please ensure Ollama is running and accessible at {OLLAMA_BASE_URL}, and the models '{LLM_MODEL}' and '{EMBEDDING_MODEL}' are pulled locally.")
print(f"To pull: 'ollama pull {LLM_MODEL}' and 'ollama pull {EMBEDDING_MODEL}'")
print("="*50 + "\n")
finally:
if rag:
print("\n--- Finalizing storages ---")
await rag.finalize_storages()
if __name__ == "__main__":
asyncio.run(main())实际的查询输出示例:
RAG Query Result
## Query
> Describe Quantum-Safe cryptography?
## LLM/Cache Response
### What is Quantum-Safe Cryptography?
Quantum-safe cryptography, also known as post‑quantum cryptography (PQC), refers to cryptographic algorithms and protocols designed to remain secure even against attacks by a sufficiently powerful quantum computer. Traditional public-key cryptosystems like RSA, ECC, Diffie‑Hellman, and elliptic curve variants are vulnerable to Shor’s algorithm, which could efficiently factor large integers and compute discrete logarithms—tasks that form the basis of these cryptographic schemes.知识图谱生成
LightRAG 自带知识图谱生成功能,这点比较实用。
为了把生成的图谱文件展示出来,我还用用 Streamlit 写了个简单的可视化应用。代码比较粗糙,后续可以继续优化。
https://zq.zhaopin.com/moment/67375989
https://zq.zhaopin.com/moment/67376141
https://zq.zhaopin.com/moment/67376183
https://zq.zhaopin.com/moment/67376375
https://zq.zhaopin.com/moment/67376217
https://zq.zhaopin.com/moment/67376388
https://zq.zhaopin.com/moment/67376708
https://zq.zhaopin.com/moment/67376503
https://zq.zhaopin.com/moment/67376754
https://zq.zhaopin.com/moment/67376948
https://zq.zhaopin.com/moment/67376741
https://zq.zhaopin.com/moment/67376483
https://zq.zhaopin.com/moment/67376502
https://zq.zhaopin.com/moment/67376699
https://zq.zhaopin.com/moment/67376691
https://zq.zhaopin.com/moment/67377209
https://zq.zhaopin.com/moment/67376956
https://zq.zhaopin.com/moment/67376961
https://zq.zhaopin.com/moment/67377181
https://zq.zhaopin.com/moment/67377144
https://zq.zhaopin.com/moment/67377019
https://zq.zhaopin.com/moment/67377146
https://zq.zhaopin.com/moment/67377430
https://zq.zhaopin.com/moment/67377418
https://zq.zhaopin.com/moment/67377634
https://zq.zhaopin.com/moment/67377471
https://zq.zhaopin.com/moment/67377407
https://zq.zhaopin.com/moment/67377240
https://zq.zhaopin.com/moment/67377438
https://zq.zhaopin.com/moment/67377601
https://zq.zhaopin.com/moment/67377592
https://zq.zhaopin.com/moment/67377716
https://zq.zhaopin.com/moment/67377935
https://zq.zhaopin.com/moment/67377874
https://zq.zhaopin.com/moment/67377882
https://zq.zhaopin.com/moment/67377921
https://zq.zhaopin.com/moment/67377645
https://zq.zhaopin.com/moment/67378074
https://zq.zhaopin.com/moment/67378075
https://zq.zhaopin.com/moment/67378120
https://zq.zhaopin.com/moment/67378135
https://zq.zhaopin.com/moment/67378328
https://zq.zhaopin.com/moment/67378269
https://zq.zhaopin.com/moment/67378268
https://zq.zhaopin.com/moment/67378383
https://zq.zhaopin.com/moment/67378476
https://zq.zhaopin.com/moment/67378525
https://zq.zhaopin.com/moment/67378518
https://zq.zhaopin.com/moment/67378663
https://zq.zhaopin.com/moment/67378482
https://zq.zhaopin.com/moment/67378677
https://zq.zhaopin.com/moment/67378707
https://zq.zhaopin.com/moment/67378523
https://zq.zhaopin.com/moment/67378709
https://zq.zhaopin.com/moment/67378852
https://zq.zhaopin.com/moment/67378981
https://zq.zhaopin.com/moment/67378964
https://zq.zhaopin.com/moment/67378946
https://zq.zhaopin.com/moment/67379136
https://zq.zhaopin.com/moment/67379152
https://zq.zhaopin.com/moment/67379157
https://zq.zhaopin.com/moment/67379322
https://zq.zhaopin.com/moment/67379361
https://zq.zhaopin.com/moment/67379168
https://zq.zhaopin.com/moment/67379176
https://zq.zhaopin.com/moment/67379332
https://zq.zhaopin.com/moment/67379344
https://zq.zhaopin.com/moment/67379357
https://zq.zhaopin.com/moment/67379495
https://zq.zhaopin.com/moment/67379514
https://zq.zhaopin.com/moment/67379515
https://zq.zhaopin.com/moment/67379570
https://zq.zhaopin.com/moment/67379718
https://zq.zhaopin.com/moment/67379564
https://zq.zhaopin.com/moment/67379737
https://zq.zhaopin.com/moment/67379816
https://zq.zhaopin.com/moment/67379917
https://zq.zhaopin.com/moment/67379761
https://zq.zhaopin.com/moment/67379738
https://zq.zhaopin.com/moment/67380015
https://zq.zhaopin.com/moment/67379956
https://zq.zhaopin.com/moment/67379954
https://zq.zhaopin.com/moment/67380423
https://zq.zhaopin.com/moment/67380155
https://zq.zhaopin.com/moment/67380018
https://zq.zhaopin.com/moment/67380153
https://zq.zhaopin.com/moment/67380665
https://zq.zhaopin.com/moment/67380401
https://zq.zhaopin.com/moment/67380580
https://zq.zhaopin.com/moment/67380225
https://zq.zhaopin.com/moment/67380404
https://zq.zhaopin.com/moment/67380156
https://zq.zhaopin.com/moment/67380218
https://zq.zhaopin.com/moment/67380385
https://zq.zhaopin.com/moment/67380408
https://zq.zhaopin.com/moment/67380637
https://zq.zhaopin.com/moment/67380531
https://zq.zhaopin.com/moment/67380581
https://zq.zhaopin.com/moment/67380818
https://zq.zhaopin.com/moment/67380787
https://zq.zhaopin.com/moment/67380817
https://zq.zhaopin.com/moment/67380850
https://zq.zhaopin.com/moment/67381232
https://zq.zhaopin.com/moment/67380995
https://zq.zhaopin.com/moment/67380993
https://zq.zhaopin.com/moment/67380976
https://zq.zhaopin.com/moment/67380825
https://zq.zhaopin.com/moment/67381068
https://zq.zhaopin.com/moment/67381073
https://zq.zhaopin.com/moment/67381257
https://zq.zhaopin.com/moment/67381259
https://zq.zhaopin.com/moment/67381430
https://zq.zhaopin.com/moment/67381239
https://zq.zhaopin.com/moment/67381651
https://zq.zhaopin.com/moment/67381436
https://zq.zhaopin.com/moment/67381244
https://zq.zhaopin.com/moment/67381438
https://zq.zhaopin.com/moment/67381638
https://zq.zhaopin.com/moment/67381808
https://zq.zhaopin.com/moment/67381449
https://zq.zhaopin.com/moment/67381451
https://zq.zhaopin.com/moment/67381658
https://zq.zhaopin.com/moment/67381809
https://zq.zhaopin.com/moment/67381640
https://zq.zhaopin.com/moment/67381634
https://zq.zhaopin.com/moment/67381815
https://zq.zhaopin.com/moment/67382388
https://zq.zhaopin.com/moment/67382054
https://zq.zhaopin.com/moment/67381819
https://zq.zhaopin.com/moment/67382208
https://zq.zhaopin.com/moment/67382089
https://zq.zhaopin.com/moment/67381822
https://zq.zhaopin.com/moment/67382015
https://zq.zhaopin.com/moment/67382025
https://zq.zhaopin.com/moment/67382042
https://zq.zhaopin.com/moment/67382205
https://zq.zhaopin.com/moment/67382216
https://zq.zhaopin.com/moment/67382369
https://zq.zhaopin.com/moment/67382395
https://zq.zhaopin.com/moment/67382215
https://zq.zhaopin.com/moment/67382215
https://zq.zhaopin.com/moment/67382625
https://zq.zhaopin.com/moment/67382560
https://zq.zhaopin.com/moment/67382567
https://zq.zhaopin.com/moment/67382397
https://zq.zhaopin.com/moment/67382699
https://zq.zhaopin.com/moment/67382571
https://zq.zhaopin.com/moment/67382569
https://zq.zhaopin.com/moment/67382420
https://zq.zhaopin.com/moment/67382715
https://zq.zhaopin.com/moment/67382723
https://zq.zhaopin.com/moment/67382826
https://zq.zhaopin.com/moment/67382822
https://zq.zhaopin.com/moment/67382757
https://zq.zhaopin.com/moment/67382810
https://zq.zhaopin.com/moment/67382887
https://zq.zhaopin.com/moment/67382845
https://zq.zhaopin.com/moment/67382823
https://zq.zhaopin.com/moment/67382903
https://zq.zhaopin.com/moment/67382881
https://zq.zhaopin.com/moment/67382919
https://zq.zhaopin.com/moment/67382884
https://zq.zhaopin.com/moment/67382901
https://zq.zhaopin.com/moment/67382888
https://zq.zhaopin.com/moment/67382917
https://zq.zhaopin.com/moment/67382892
https://zq.zhaopin.com/moment/67382899
https://zq.zhaopin.com/moment/67382915
https://zq.zhaopin.com/moment/67382904
https://zq.zhaopin.com/moment/67382918
https://zq.zhaopin.com/moment/67382923
https://zq.zhaopin.com/moment/67382921
https://zq.zhaopin.com/moment/67382927
https://zq.zhaopin.com/moment/67382929
https://zq.zhaopin.com/moment/67382936
https://zq.zhaopin.com/moment/67382932
https://zq.zhaopin.com/moment/67382926
https://zq.zhaopin.com/moment/67382924
https://zq.zhaopin.com/moment/67382925
https://zq.zhaopin.com/moment/67382931
https://zq.zhaopin.com/moment/67382938
https://zq.zhaopin.com/moment/67382935
https://zq.zhaopin.com/moment/67382933
https://zq.zhaopin.com/moment/67382948
https://zq.zhaopin.com/moment/67382949
https://zq.zhaopin.com/moment/67382945
https://zq.zhaopin.com/moment/67382939
https://zq.zhaopin.com/moment/67382944
https://zq.zhaopin.com/moment/67382946
https://zq.zhaopin.com/moment/67382942
https://zq.zhaopin.com/moment/67382954
https://zq.zhaopin.com/moment/67382947
https://zq.zhaopin.com/moment/67382950
https://zq.zhaopin.com/moment/67382952
https://zq.zhaopin.com/moment/67382990
https://zq.zhaopin.com/moment/67382951
https://zq.zhaopin.com/moment/67382975
https://zq.zhaopin.com/moment/67382965
https://zq.zhaopin.com/moment/67382966
https://zq.zhaopin.com/moment/67383001
https://zq.zhaopin.com/moment/67383027
https://zq.zhaopin.com/moment/67383062
https://zq.zhaopin.com/moment/67383088
https://zq.zhaopin.com/moment/67383089
https://zq.zhaopin.com/moment/67383015
https://zq.zhaopin.com/moment/67383037
https://zq.zhaopin.com/moment/67383104
https://zq.zhaopin.com/moment/67383105
https://zq.zhaopin.com/moment/67383095
https://zq.zhaopin.com/moment/67383085
https://zq.zhaopin.com/moment/67383100
https://zq.zhaopin.com/moment/67383092
https://zq.zhaopin.com/moment/67383111
https://zq.zhaopin.com/moment/67383119
https://zq.zhaopin.com/moment/67383109
https://zq.zhaopin.com/moment/67383122
https://zq.zhaopin.com/moment/67383120
https://zq.zhaopin.com/moment/67383115
https://zq.zhaopin.com/moment/67383134
https://zq.zhaopin.com/moment/67383127
https://zq.zhaopin.com/moment/67383125
https://zq.zhaopin.com/moment/67383190
https://zq.zhaopin.com/moment/67383176
https://zq.zhaopin.com/moment/67383256
https://zq.zhaopin.com/moment/67383179
https://zq.zhaopin.com/moment/67383224
https://zq.zhaopin.com/moment/67383228
https://zq.zhaopin.com/moment/67383216
https://zq.zhaopin.com/moment/67383218
https://zq.zhaopin.com/moment/67383220
https://zq.zhaopin.com/moment/67383229
https://zq.zhaopin.com/moment/67383303
https://zq.zhaopin.com/moment/67383250
https://zq.zhaopin.com/moment/67383233
https://zq.zhaopin.com/moment/67383304
https://zq.zhaopin.com/moment/67383237
https://zq.zhaopin.com/moment/67383292
https://zq.zhaopin.com/moment/67383331
https://zq.zhaopin.com/moment/67383240
https://zq.zhaopin.com/moment/67383252
https://zq.zhaopin.com/moment/67383241
https://zq.zhaopin.com/moment/67383246
https://zq.zhaopin.com/moment/67383249
https://zq.zhaopin.com/moment/65796902
https://zq.zhaopin.com/moment/65796904
https://zq.zhaopin.com/moment/65796903
https://zq.zhaopin.com/moment/65796906
https://zq.zhaopin.com/moment/65796909
https://zq.zhaopin.com/moment/65796915
https://zq.zhaopin.com/moment/65796917
https://zq.zhaopin.com/moment/65796921
https://zq.zhaopin.com/moment/65796920
https://zq.zhaopin.com/moment/65796923
https://zq.zhaopin.com/moment/65796933
https://zq.zhaopin.com/moment/65796925
https://zq.zhaopin.com/moment/65796934
https://zq.zhaopin.com/moment/65796935
https://zq.zhaopin.com/moment/65796937
https://zq.zhaopin.com/moment/65796939
https://zq.zhaopin.com/moment/65796940
https://zq.zhaopin.com/moment/65796945
https://zq.zhaopin.com/moment/65796950
https://zq.zhaopin.com/moment/65796952
https://zq.zhaopin.com/moment/65796956
https://zq.zhaopin.com/moment/65796948
https://zq.zhaopin.com/moment/65796958
https://zq.zhaopin.com/moment/65796966
https://zq.zhaopin.com/moment/65796964
https://zq.zhaopin.com/moment/65796968
https://zq.zhaopin.com/moment/65796967
https://zq.zhaopin.com/moment/65796970
https://zq.zhaopin.com/moment/65796980
https://zq.zhaopin.com/moment/65796995
https://zq.zhaopin.com/moment/65796993
https://zq.zhaopin.com/moment/65796997
https://zq.zhaopin.com/moment/65796996
https://zq.zhaopin.com/moment/65796999
https://zq.zhaopin.com/moment/65797003
https://zq.zhaopin.com/moment/65797012
https://zq.zhaopin.com/moment/65797014
https://zq.zhaopin.com/moment/65797015
https://zq.zhaopin.com/moment/65797021
https://zq.zhaopin.com/moment/65797016
https://zq.zhaopin.com/moment/65797018
https://zq.zhaopin.com/moment/65797025
https://zq.zhaopin.com/moment/65797031
https://zq.zhaopin.com/moment/65797030
https://zq.zhaopin.com/moment/65797033
https://zq.zhaopin.com/moment/65797034
https://zq.zhaopin.com/moment/65797037
https://zq.zhaopin.com/moment/65797041
https://zq.zhaopin.com/moment/65797044
https://zq.zhaopin.com/moment/65797050
https://zq.zhaopin.com/moment/65797047
https://zq.zhaopin.com/moment/65797053
https://zq.zhaopin.com/moment/65797059
https://zq.zhaopin.com/moment/65797064
https://zq.zhaopin.com/moment/65797060
https://zq.zhaopin.com/moment/65797065
https://zq.zhaopin.com/moment/65797074
https://zq.zhaopin.com/moment/65797077
https://zq.zhaopin.com/moment/65797080
https://zq.zhaopin.com/moment/65797082
https://zq.zhaopin.com/moment/65797084
https://zq.zhaopin.com/moment/65797088
https://zq.zhaopin.com/moment/65797092
https://zq.zhaopin.com/moment/65797095
https://zq.zhaopin.com/moment/65797098
https://zq.zhaopin.com/moment/65797101
https://zq.zhaopin.com/moment/65797103
https://zq.zhaopin.com/moment/65797110
https://zq.zhaopin.com/moment/65797111
https://zq.zhaopin.com/moment/65797113
https://zq.zhaopin.com/moment/65797114
https://zq.zhaopin.com/moment/65797118
https://zq.zhaopin.com/moment/65797128
https://zq.zhaopin.com/moment/65797125
https://zq.zhaopin.com/moment/65797126
https://zq.zhaopin.com/moment/65797142
https://zq.zhaopin.com/moment/65797135
https://zq.zhaopin.com/moment/65797141
https://zq.zhaopin.com/moment/65797143
https://zq.zhaopin.com/moment/65797144
https://zq.zhaopin.com/moment/65797154
https://zq.zhaopin.com/moment/65797167
https://zq.zhaopin.com/moment/65797173
https://zq.zhaopin.com/moment/65797170
https://zq.zhaopin.com/moment/65797183
https://zq.zhaopin.com/moment/65797180
https://zq.zhaopin.com/moment/65797174
https://zq.zhaopin.com/moment/65797181
https://zq.zhaopin.com/moment/65797186
https://zq.zhaopin.com/moment/65797187
https://zq.zhaopin.com/moment/65797188
https://zq.zhaopin.com/moment/65797190
https://zq.zhaopin.com/moment/65797191
https://zq.zhaopin.com/moment/65797197
https://zq.zhaopin.com/moment/65797204
https://zq.zhaopin.com/moment/65797203
https://zq.zhaopin.com/moment/65797212
https://zq.zhaopin.com/moment/65797213
https://zq.zhaopin.com/moment/65797206
https://zq.zhaopin.com/moment/65797225
https://zq.zhaopin.com/moment/65797219
https://zq.zhaopin.com/moment/65797224
https://zq.zhaopin.com/moment/65797229
https://zq.zhaopin.com/moment/65797241
https://zq.zhaopin.com/moment/65797233
https://zq.zhaopin.com/moment/65797240
https://zq.zhaopin.com/moment/65797242
https://zq.zhaopin.com/moment/65797247
https://zq.zhaopin.com/moment/65797246
https://zq.zhaopin.com/moment/65797254
https://zq.zhaopin.com/moment/65797255
https://zq.zhaopin.com/moment/65797256
https://zq.zhaopin.com/moment/65797267
https://zq.zhaopin.com/moment/65797270
https://zq.zhaopin.com/moment/65797275
https://zq.zhaopin.com/moment/65797272
https://zq.zhaopin.com/moment/65797276
https://zq.zhaopin.com/moment/65797278
https://zq.zhaopin.com/moment/65797282
https://zq.zhaopin.com/moment/65797283
https://zq.zhaopin.com/moment/65797291
https://zq.zhaopin.com/moment/65797286
https://zq.zhaopin.com/moment/65797290
https://zq.zhaopin.com/moment/65797293
https://zq.zhaopin.com/moment/65797295
https://zq.zhaopin.com/moment/65797296
https://zq.zhaopin.com/moment/65797299
https://zq.zhaopin.com/moment/65797305
https://zq.zhaopin.com/moment/65797304
https://zq.zhaopin.com/moment/65797306
https://zq.zhaopin.com/moment/65797308
https://zq.zhaopin.com/moment/65797309
https://zq.zhaopin.com/moment/65797314
https://zq.zhaopin.com/moment/65797326
https://zq.zhaopin.com/moment/65797320
https://zq.zhaopin.com/moment/65797321
https://zq.zhaopin.com/moment/65797319
https://zq.zhaopin.com/moment/65797325
https://zq.zhaopin.com/moment/65797330
https://zq.zhaopin.com/moment/65797335
https://zq.zhaopin.com/moment/65797336
https://zq.zhaopin.com/moment/65797338
https://zq.zhaopin.com/moment/65797342
https://zq.zhaopin.com/moment/65797345
https://zq.zhaopin.com/moment/65797349
https://zq.zhaopin.com/moment/65797348
https://zq.zhaopin.com/moment/65797350
https://zq.zhaopin.com/moment/65797357
https://zq.zhaopin.com/moment/65797356
https://zq.zhaopin.com/moment/65797362
https://zq.zhaopin.com/moment/65797360
https://zq.zhaopin.com/moment/65797369
https://zq.zhaopin.com/moment/65797376
https://zq.zhaopin.com/moment/65797364
https://zq.zhaopin.com/moment/65797377
https://zq.zhaopin.com/moment/65797379
https://zq.zhaopin.com/moment/65797378
https://zq.zhaopin.com/moment/65797388
https://zq.zhaopin.com/moment/65797386
https://zq.zhaopin.com/moment/65797395
https://zq.zhaopin.com/moment/65797400
https://zq.zhaopin.com/moment/65797404
https://zq.zhaopin.com/moment/65797401
https://zq.zhaopin.com/moment/65797402
https://zq.zhaopin.com/moment/65797403
https://zq.zhaopin.com/moment/65797415
https://zq.zhaopin.com/moment/65797410
https://zq.zhaopin.com/moment/65797417
https://zq.zhaopin.com/moment/65797416
https://zq.zhaopin.com/moment/65797423
https://zq.zhaopin.com/moment/65797437
https://zq.zhaopin.com/moment/65797431
https://zq.zhaopin.com/moment/65797424
https://zq.zhaopin.com/moment/65797438
https://zq.zhaopin.com/moment/65797439
https://zq.zhaopin.com/moment/65797442
https://zq.zhaopin.com/moment/65797444
https://zq.zhaopin.com/moment/65797448
https://zq.zhaopin.com/moment/65797451
https://zq.zhaopin.com/moment/65797449
https://zq.zhaopin.com/moment/65797450
https://zq.zhaopin.com/moment/65797457
https://zq.zhaopin.com/moment/65797458
https://zq.zhaopin.com/moment/65797463
https://zq.zhaopin.com/moment/65797466
https://zq.zhaopin.com/moment/65797467
https://zq.zhaopin.com/moment/65797468
https://zq.zhaopin.com/moment/65797479
https://zq.zhaopin.com/moment/65797476
https://zq.zhaopin.com/moment/65797474
https://zq.zhaopin.com/moment/65797482
https://zq.zhaopin.com/moment/65797483
https://zq.zhaopin.com/moment/65797484
https://zq.zhaopin.com/moment/65797488
https://zq.zhaopin.com/moment/65797490
https://zq.zhaopin.com/moment/65797502
https://zq.zhaopin.com/moment/65797506
https://zq.zhaopin.com/moment/65797495
https://zq.zhaopin.com/moment/65797508
https://zq.zhaopin.com/moment/65797503
https://zq.zhaopin.com/moment/65797515
https://zq.zhaopin.com/moment/65797521
https://zq.zhaopin.com/moment/65797522
https://zq.zhaopin.com/moment/65797523
https://zq.zhaopin.com/moment/65797528
https://zq.zhaopin.com/moment/65797534
https://zq.zhaopin.com/moment/65797539
https://zq.zhaopin.com/moment/65797538
https://zq.zhaopin.com/moment/65797540
https://zq.zhaopin.com/moment/65797542
https://zq.zhaopin.com/moment/65797545
https://zq.zhaopin.com/moment/65797547
https://zq.zhaopin.com/moment/65797553
https://zq.zhaopin.com/moment/65797554
https://zq.zhaopin.com/moment/65797555
https://zq.zhaopin.com/moment/65797558
https://zq.zhaopin.com/moment/65797559
https://zq.zhaopin.com/moment/65797563
https://zq.zhaopin.com/moment/65797569
https://zq.zhaopin.com/moment/65797568
https://zq.zhaopin.com/moment/65797567
https://zq.zhaopin.com/moment/65797572
https://zq.zhaopin.com/moment/65797576
https://zq.zhaopin.com/moment/65797578
https://zq.zhaopin.com/moment/65797586
https://zq.zhaopin.com/moment/65797588
https://zq.zhaopin.com/moment/65797587
https://zq.zhaopin.com/moment/65797601
https://zq.zhaopin.com/moment/65797595
https://zq.zhaopin.com/moment/65797591
https://zq.zhaopin.com/moment/65797589
https://zq.zhaopin.com/moment/65797602
https://zq.zhaopin.com/moment/65797612
https://zq.zhaopin.com/moment/65797608
https://zq.zhaopin.com/moment/65797617
https://zq.zhaopin.com/moment/65797614
https://zq.zhaopin.com/moment/65797621
https://zq.zhaopin.com/moment/65797627
https://zq.zhaopin.com/moment/65797622
https://zq.zhaopin.com/moment/65797623
https://zq.zhaopin.com/moment/65797625
https://zq.zhaopin.com/moment/65797633
https://zq.zhaopin.com/moment/65797636
https://zq.zhaopin.com/moment/65797640
https://zq.zhaopin.com/moment/65797642
https://zq.zhaopin.com/moment/65797643
https://zq.zhaopin.com/moment/65797650
https://zq.zhaopin.com/moment/65797651
https://zq.zhaopin.com/moment/65797646
https://zq.zhaopin.com/moment/65797649
https://zq.zhaopin.com/moment/65797653
https://zq.zhaopin.com/moment/65797656
https://zq.zhaopin.com/moment/65797659
https://zq.zhaopin.com/moment/65797664
https://zq.zhaopin.com/moment/65797667
https://zq.zhaopin.com/moment/65797677
https://zq.zhaopin.com/moment/65797674
https://zq.zhaopin.com/moment/65797680
https://zq.zhaopin.com/moment/65797681
https://zq.zhaopin.com/moment/65797682
https://zq.zhaopin.com/moment/65797684
https://zq.zhaopin.com/moment/65797686
https://zq.zhaopin.com/moment/65797690
https://zq.zhaopin.com/moment/65797698
https://zq.zhaopin.com/moment/65797700
https://zq.zhaopin.com/moment/65797702
https://zq.zhaopin.com/moment/65797703
https://zq.zhaopin.com/moment/65797710
https://zq.zhaopin.com/moment/65797704
https://zq.zhaopin.com/moment/65797713
https://zq.zhaopin.com/moment/65797714
https://zq.zhaopin.com/moment/65797715
https://zq.zhaopin.com/moment/65797717
https://zq.zhaopin.com/moment/65797719
https://zq.zhaopin.com/moment/65797726
https://zq.zhaopin.com/moment/65797722
https://zq.zhaopin.com/moment/65797729
https://zq.zhaopin.com/moment/65797732
https://zq.zhaopin.com/moment/65797731
https://zq.zhaopin.com/moment/65797738
https://zq.zhaopin.com/moment/65797735
https://zq.zhaopin.com/moment/65797740
https://zq.zhaopin.com/moment/65797742
https://zq.zhaopin.com/moment/65797744
https://zq.zhaopin.com/moment/65797759
https://zq.zhaopin.com/moment/65797758
https://zq.zhaopin.com/moment/65797760
https://zq.zhaopin.com/moment/65797761
https://zq.zhaopin.com/moment/65797762
https://zq.zhaopin.com/moment/65797765
https://zq.zhaopin.com/moment/65797777
https://zq.zhaopin.com/moment/65797778
https://zq.zhaopin.com/moment/65797779
https://zq.zhaopin.com/moment/65797780
https://zq.zhaopin.com/moment/65797781
https://zq.zhaopin.com/moment/65797789
https://zq.zhaopin.com/moment/65797790
https://zq.zhaopin.com/moment/65797793
https://zq.zhaopin.com/moment/65797791
https://zq.zhaopin.com/moment/65797795
https://zq.zhaopin.com/moment/65797803
https://zq.zhaopin.com/moment/65797804
https://zq.zhaopin.com/moment/65797806
https://zq.zhaopin.com/moment/65797809
https://zq.zhaopin.com/moment/65797810
https://zq.zhaopin.com/moment/65797822
https://zq.zhaopin.com/moment/65797820
https://zq.zhaopin.com/moment/65797823
https://zq.zhaopin.com/moment/65797812
https://zq.zhaopin.com/moment/65797826
https://zq.zhaopin.com/moment/65797828
https://zq.zhaopin.com/moment/65797838
https://zq.zhaopin.com/moment/65797839
https://zq.zhaopin.com/moment/65797842
https://zq.zhaopin.com/moment/65797840
https://zq.zhaopin.com/moment/65797844
https://zq.zhaopin.com/moment/65797854
https://zq.zhaopin.com/moment/65797855
https://zq.zhaopin.com/moment/65797856
https://zq.zhaopin.com/moment/65797859
https://zq.zhaopin.com/moment/65797860
https://zq.zhaopin.com/moment/65797861
https://zq.zhaopin.com/moment/65797866
https://zq.zhaopin.com/moment/65797869
https://zq.zhaopin.com/moment/65797870
https://zq.zhaopin.com/moment/65797867
https://zq.zhaopin.com/moment/65797868
https://zq.zhaopin.com/moment/65797871
https://zq.zhaopin.com/moment/65797877
https://zq.zhaopin.com/moment/65797883
https://zq.zhaopin.com/moment/65797878
https://zq.zhaopin.com/moment/65797879
https://zq.zhaopin.com/moment/65797885
https://zq.zhaopin.com/moment/65797894
https://zq.zhaopin.com/moment/65797895
https://zq.zhaopin.com/moment/65797887
https://zq.zhaopin.com/moment/65797900
https://zq.zhaopin.com/moment/65797898
https://zq.zhaopin.com/moment/65797897
https://zq.zhaopin.com/moment/65797901
https://zq.zhaopin.com/moment/65797906
https://zq.zhaopin.com/moment/65797909
https://zq.zhaopin.com/moment/65797912
https://zq.zhaopin.com/moment/65797915
https://zq.zhaopin.com/moment/65797916
https://zq.zhaopin.com/moment/65797921
https://zq.zhaopin.com/moment/65797920
https://zq.zhaopin.com/moment/65797923
https://zq.zhaopin.com/moment/65797928
https://zq.zhaopin.com/moment/65797926
https://zq.zhaopin.com/moment/65797929
https://zq.zhaopin.com/moment/65797932
https://zq.zhaopin.com/moment/65797933
https://zq.zhaopin.com/moment/65797934
https://zq.zhaopin.com/moment/65798025
https://zq.zhaopin.com/moment/65797942
https://zq.zhaopin.com/moment/65797939
https://zq.zhaopin.com/moment/65797985
https://zq.zhaopin.com/moment/65797943
https://zq.zhaopin.com/moment/65798066
https://zq.zhaopin.com/moment/65798070
https://zq.zhaopin.com/moment/65798190
https://zq.zhaopin.com/moment/65798207
https://zq.zhaopin.com/moment/65798228
https://zq.zhaopin.com/moment/65798260
https://zq.zhaopin.com/moment/65798440
https://zq.zhaopin.com/moment/65798333
https://zq.zhaopin.com/moment/65798343
https://zq.zhaopin.com/moment/65798445
https://zq.zhaopin.com/moment/65798451
https://zq.zhaopin.com/moment/65798494
https://zq.zhaopin.com/moment/65798565
https://zq.zhaopin.com/moment/65798566
https://zq.zhaopin.com/moment/65798684
https://zq.zhaopin.com/moment/65798752
https://zq.zhaopin.com/moment/65798830
https://zq.zhaopin.com/moment/65798689
https://zq.zhaopin.com/moment/65798823
https://zq.zhaopin.com/moment/65798939
https://zq.zhaopin.com/moment/65798943
https://zq.zhaopin.com/moment/65798980
https://zq.zhaopin.com/moment/65798966
https://zq.zhaopin.com/moment/65799082
https://zq.zhaopin.com/moment/65799231
https://zq.zhaopin.com/moment/65799193
https://zq.zhaopin.com/moment/65799198
https://zq.zhaopin.com/moment/65799250
https://zq.zhaopin.com/moment/65799352
https://zq.zhaopin.com/moment/65799355
https://zq.zhaopin.com/moment/65799448
https://zq.zhaopin.com/moment/65799450
https://zq.zhaopin.com/moment/65799501
https://zq.zhaopin.com/moment/65799502
https://zq.zhaopin.com/moment/65799727
https://zq.zhaopin.com/moment/65799719
https://zq.zhaopin.com/moment/65799631
https://zq.zhaopin.com/moment/65799627
https://zq.zhaopin.com/moment/65799772
https://zq.zhaopin.com/moment/65799901
https://zq.zhaopin.com/moment/65799900
https://zq.zhaopin.com/moment/65799952
https://zq.zhaopin.com/moment/65800011
https://zq.zhaopin.com/moment/65800127
https://zq.zhaopin.com/moment/65799999
https://zq.zhaopin.com/moment/65800135
https://zq.zhaopin.com/moment/65800222
https://zq.zhaopin.com/moment/65800180
https://zq.zhaopin.com/moment/65800185
https://zq.zhaopin.com/moment/65800230
https://zq.zhaopin.com/moment/65800346
https://zq.zhaopin.com/moment/65800402
https://zq.zhaopin.com/moment/65800341
https://zq.zhaopin.com/moment/65800401
https://zq.zhaopin.com/moment/65800430
https://zq.zhaopin.com/moment/65800431
https://zq.zhaopin.com/moment/65800571
https://zq.zhaopin.com/moment/65800608
https://zq.zhaopin.com/moment/65800569
https://zq.zhaopin.com/moment/65800642
https://zq.zhaopin.com/moment/65800607
https://zq.zhaopin.com/moment/65800649
https://zq.zhaopin.com/moment/65800779
https://zq.zhaopin.com/moment/65800790
https://zq.zhaopin.com/moment/65800826
https://zq.zhaopin.com/moment/65800834
https://zq.zhaopin.com/moment/65800868
https://zq.zhaopin.com/moment/65801000
https://zq.zhaopin.com/moment/65800877
https://zq.zhaopin.com/moment/65801041
https://zq.zhaopin.com/moment/65801013
https://zq.zhaopin.com/moment/65801047
https://zq.zhaopin.com/moment/65801099
https://zq.zhaopin.com/moment/65801232
https://zq.zhaopin.com/moment/65801064
https://zq.zhaopin.com/moment/65801253
https://zq.zhaopin.com/moment/65801240
https://zq.zhaopin.com/moment/65801263
https://zq.zhaopin.com/moment/65801264
https://zq.zhaopin.com/moment/65801305
https://zq.zhaopin.com/moment/65801460
https://zq.zhaopin.com/moment/65801450
https://zq.zhaopin.com/moment/65801488
https://zq.zhaopin.com/moment/65801475
https://zq.zhaopin.com/moment/65801494
https://zq.zhaopin.com/moment/65801511
https://zq.zhaopin.com/moment/65801658
https://zq.zhaopin.com/moment/65801689
https://zq.zhaopin.com/moment/65801667
https://zq.zhaopin.com/moment/65801708
https://zq.zhaopin.com/moment/65801702
https://zq.zhaopin.com/moment/65801720
https://zq.zhaopin.com/moment/65801880
https://zq.zhaopin.com/moment/65801886
https://zq.zhaopin.com/moment/65801901
https://zq.zhaopin.com/moment/65801912
https://zq.zhaopin.com/moment/65801924
https://zq.zhaopin.com/moment/65801941
https://zq.zhaopin.com/moment/65802105
https://zq.zhaopin.com/moment/65802119
https://zq.zhaopin.com/moment/65802124
https://zq.zhaopin.com/moment/65802132
https://zq.zhaopin.com/moment/65802151
https://zq.zhaopin.com/moment/65802154
https://zq.zhaopin.com/moment/65802327
https://zq.zhaopin.com/moment/65802350
https://zq.zhaopin.com/moment/65802329
https://zq.zhaopin.com/moment/65802348
https://zq.zhaopin.com/moment/65802356
https://zq.zhaopin.com/moment/65802549
https://zq.zhaopin.com/moment/65802374
https://zq.zhaopin.com/moment/65802560
https://zq.zhaopin.com/moment/65802562
https://zq.zhaopin.com/moment/65802578
https://zq.zhaopin.com/moment/65802579
https://zq.zhaopin.com/moment/65802589
https://zq.zhaopin.com/moment/65802766
https://zq.zhaopin.com/moment/65802762
https://zq.zhaopin.com/moment/65802769
https://zq.zhaopin.com/moment/65802783
https://zq.zhaopin.com/moment/65802790
https://zq.zhaopin.com/moment/65802793
https://zq.zhaopin.com/moment/65802988
https://zq.zhaopin.com/moment/65802992
https://zq.zhaopin.com/moment/65803002
https://zq.zhaopin.com/moment/65803021
https://zq.zhaopin.com/moment/65803008
https://zq.zhaopin.com/moment/65803014
https://zq.zhaopin.com/moment/65803230
https://zq.zhaopin.com/moment/65803234
https://zq.zhaopin.com/moment/65803245
https://zq.zhaopin.com/moment/65803252
https://zq.zhaopin.com/moment/65803256
https://zq.zhaopin.com/moment/65803263
https://zq.zhaopin.com/moment/65803477
https://zq.zhaopin.com/moment/65803479
https://zq.zhaopin.com/moment/65803487
https://zq.zhaopin.com/moment/65803490
https://zq.zhaopin.com/moment/65803494
https://zq.zhaopin.com/moment/65803667
https://zq.zhaopin.com/moment/65803676
https://zq.zhaopin.com/moment/65803686
https://zq.zhaopin.com/moment/65803719
https://zq.zhaopin.com/moment/65803722
https://zq.zhaopin.com/moment/65803878
https://zq.zhaopin.com/moment/65803728
https://zq.zhaopin.com/moment/65803900
https://zq.zhaopin.com/moment/65803905
https://zq.zhaopin.com/moment/65803950
https://zq.zhaopin.com/moment/65803952
https://zq.zhaopin.com/moment/65804105
https://zq.zhaopin.com/moment/65804135
https://zq.zhaopin.com/moment/65804132
https://zq.zhaopin.com/moment/65804164
https://zq.zhaopin.com/moment/65804170
https://zq.zhaopin.com/moment/65804167
https://zq.zhaopin.com/moment/65804344
https://zq.zhaopin.com/moment/65804357
https://zq.zhaopin.com/moment/65804363
https://zq.zhaopin.com/moment/65804380
https://zq.zhaopin.com/moment/65804381
https://zq.zhaopin.com/moment/65804421
https://zq.zhaopin.com/moment/65804567
https://zq.zhaopin.com/moment/65804572
https://zq.zhaopin.com/moment/65804593
https://zq.zhaopin.com/moment/65804631
https://zq.zhaopin.com/moment/65804627
https://zq.zhaopin.com/moment/65804773
https://zq.zhaopin.com/moment/65804645
https://zq.zhaopin.com/moment/65804826
https://zq.zhaopin.com/moment/65804816
https://zq.zhaopin.com/moment/65804834
https://zq.zhaopin.com/moment/65804853
https://zq.zhaopin.com/moment/65805023
https://zq.zhaopin.com/moment/65804878
https://zq.zhaopin.com/moment/65805028
https://zq.zhaopin.com/moment/65805053
https://zq.zhaopin.com/moment/65805090
https://zq.zhaopin.com/moment/65805073
https://zq.zhaopin.com/moment/65805103
https://zq.zhaopin.com/moment/65805251
https://zq.zhaopin.com/moment/65805248
https://zq.zhaopin.com/moment/65805282
https://zq.zhaopin.com/moment/65805291
https://zq.zhaopin.com/moment/65805339
https://zq.zhaopin.com/moment/65805474
https://zq.zhaopin.com/moment/65805478
https://zq.zhaopin.com/moment/65805511
https://zq.zhaopin.com/moment/65805526
https://zq.zhaopin.com/moment/65805565
https://zq.zhaopin.com/moment/65805585
https://zq.zhaopin.com/moment/65805713
https://zq.zhaopin.com/moment/65805716
https://zq.zhaopin.com/moment/65805733
https://zq.zhaopin.com/moment/65805767
https://zq.zhaopin.com/moment/65805781
https://zq.zhaopin.com/moment/65805835
https://zq.zhaopin.com/moment/65805942
https://zq.zhaopin.com/moment/65805956
https://zq.zhaopin.com/moment/65805951
https://zq.zhaopin.com/moment/65805969
https://zq.zhaopin.com/moment/65806014
https://zq.zhaopin.com/moment/65806054
https://zq.zhaopin.com/moment/65806136
https://zq.zhaopin.com/moment/65806134
https://zq.zhaopin.com/moment/65806142
https://zq.zhaopin.com/moment/65806150
https://zq.zhaopin.com/moment/65806162
https://zq.zhaopin.com/moment/65806170
https://zq.zhaopin.com/moment/65806163
https://zq.zhaopin.com/moment/65806186
https://zq.zhaopin.com/moment/65806184
https://zq.zhaopin.com/moment/65806172
https://zq.zhaopin.com/moment/65806187
https://zq.zhaopin.com/moment/65806190
https://zq.zhaopin.com/moment/65806191
https://zq.zhaopin.com/moment/65806201
https://zq.zhaopin.com/moment/65806203
https://zq.zhaopin.com/moment/65806204
https://zq.zhaopin.com/moment/65806207
https://zq.zhaopin.com/moment/65806208
https://zq.zhaopin.com/moment/65806211
https://zq.zhaopin.com/moment/65806212
https://zq.zhaopin.com/moment/65806216
https://zq.zhaopin.com/moment/65806214
https://zq.zhaopin.com/moment/65806215
https://zq.zhaopin.com/moment/65806217
https://zq.zhaopin.com/moment/65806229
https://zq.zhaopin.com/moment/65806224
https://zq.zhaopin.com/moment/65806231
https://zq.zhaopin.com/moment/65806233
https://zq.zhaopin.com/moment/65806232
https://zq.zhaopin.com/moment/65806241
https://zq.zhaopin.com/moment/65806234
https://zq.zhaopin.com/moment/65806244
https://zq.zhaopin.com/moment/65806245
https://zq.zhaopin.com/moment/65806246
https://zq.zhaopin.com/moment/65806249
https://zq.zhaopin.com/moment/65806254
https://zq.zhaopin.com/moment/65806248
https://zq.zhaopin.com/moment/65806258
https://zq.zhaopin.com/moment/65806256
https://zq.zhaopin.com/moment/65806262
https://zq.zhaopin.com/moment/65806260
https://zq.zhaopin.com/moment/65806261
https://zq.zhaopin.com/moment/65806266
https://zq.zhaopin.com/moment/65806269
https://zq.zhaopin.com/moment/65806271
https://zq.zhaopin.com/moment/65806272
https://zq.zhaopin.com/moment/65806275
https://zq.zhaopin.com/moment/65806286
https://zq.zhaopin.com/moment/65806291
https://zq.zhaopin.com/moment/65806290
https://zq.zhaopin.com/moment/65806287
https://zq.zhaopin.com/moment/65806294
https://zq.zhaopin.com/moment/65806292
https://zq.zhaopin.com/moment/65806302
https://zq.zhaopin.com/moment/65806306
https://zq.zhaopin.com/moment/65806305
https://zq.zhaopin.com/moment/65806307
https://zq.zhaopin.com/moment/65806310
https://zq.zhaopin.com/moment/65806323
https://zq.zhaopin.com/moment/65806314
https://zq.zhaopin.com/moment/65806324
https://zq.zhaopin.com/moment/65806325
https://zq.zhaopin.com/moment/65806327
https://zq.zhaopin.com/moment/65806338
https://zq.zhaopin.com/moment/65806336
https://zq.zhaopin.com/moment/65806340
https://zq.zhaopin.com/moment/65806342
https://zq.zhaopin.com/moment/65806341
https://zq.zhaopin.com/moment/65806343
https://zq.zhaopin.com/moment/65806380
https://zq.zhaopin.com/moment/65806387
https://zq.zhaopin.com/moment/65806390
https://zq.zhaopin.com/moment/65806407
https://zq.zhaopin.com/moment/65806396
https://zq.zhaopin.com/moment/65806448
https://zq.zhaopin.com/moment/65806453
https://zq.zhaopin.com/moment/65806462
https://zq.zhaopin.com/moment/65806460
https://zq.zhaopin.com/moment/65806468
https://zq.zhaopin.com/moment/65806515
https://zq.zhaopin.com/moment/65806471
https://zq.zhaopin.com/moment/65806523
https://zq.zhaopin.com/moment/65806529
https://zq.zhaopin.com/moment/65806536
https://zq.zhaopin.com/moment/65806540
https://zq.zhaopin.com/moment/65806546
https://zq.zhaopin.com/moment/65806589
https://zq.zhaopin.com/moment/65806581
https://zq.zhaopin.com/moment/65806593
https://zq.zhaopin.com/moment/65806599
https://zq.zhaopin.com/moment/65806600
https://zq.zhaopin.com/moment/65806640
https://zq.zhaopin.com/moment/65806601
https://zq.zhaopin.com/moment/65806649
https://zq.zhaopin.com/moment/65806653
https://zq.zhaopin.com/moment/65806655
https://zq.zhaopin.com/moment/65806659
https://zq.zhaopin.com/moment/65806699
https://zq.zhaopin.com/moment/65806664
https://zq.zhaopin.com/moment/65806706
https://zq.zhaopin.com/moment/65806707
https://zq.zhaopin.com/moment/65806715
https://zq.zhaopin.com/moment/65806713
https://zq.zhaopin.com/moment/65806719
https://zq.zhaopin.com/moment/65806749
https://zq.zhaopin.com/moment/65806752
https://zq.zhaopin.com/moment/65806754
https://zq.zhaopin.com/moment/65806757
https://zq.zhaopin.com/moment/65806758
https://zq.zhaopin.com/moment/65806759
https://zq.zhaopin.com/moment/65806767
https://zq.zhaopin.com/moment/65806769
https://zq.zhaopin.com/moment/65806771
https://zq.zhaopin.com/moment/65806775
https://zq.zhaopin.com/moment/65806779
https://zq.zhaopin.com/moment/65806774
https://zq.zhaopin.com/moment/65806783
https://zq.zhaopin.com/moment/65806786
https://zq.zhaopin.com/moment/65806787
https://zq.zhaopin.com/moment/65806789
https://zq.zhaopin.com/moment/65806807
https://zq.zhaopin.com/moment/65806793
https://zq.zhaopin.com/moment/65806819
https://zq.zhaopin.com/moment/65806817
https://zq.zhaopin.com/moment/65806827
https://zq.zhaopin.com/moment/65806896
https://zq.zhaopin.com/moment/65806840
https://zq.zhaopin.com/moment/65806897
https://zq.zhaopin.com/moment/65806907
https://zq.zhaopin.com/moment/65806904
https://zq.zhaopin.com/moment/65806921
https://zq.zhaopin.com/moment/65806968
https://zq.zhaopin.com/moment/65806978
https://zq.zhaopin.com/moment/65806976
https://zq.zhaopin.com/moment/65806990
https://zq.zhaopin.com/moment/65807003
https://zq.zhaopin.com/moment/65807050
https://zq.zhaopin.com/moment/65807057
https://zq.zhaopin.com/moment/65807055
https://zq.zhaopin.com/moment/65807066
https://zq.zhaopin.com/moment/65807075
https://zq.zhaopin.com/moment/65807085
https://zq.zhaopin.com/moment/65807142
https://zq.zhaopin.com/moment/65807144
https://zq.zhaopin.com/moment/65807153
https://zq.zhaopin.com/moment/65807219
https://zq.zhaopin.com/moment/65807227
https://zq.zhaopin.com/moment/65807225
https://zq.zhaopin.com/moment/65807233
https://zq.zhaopin.com/moment/65807246
https://zq.zhaopin.com/moment/65807266
https://zq.zhaopin.com/moment/65807237
https://zq.zhaopin.com/moment/65807269
https://zq.zhaopin.com/moment/65807272
https://zq.zhaopin.com/moment/65807274
https://zq.zhaopin.com/moment/65807282
https://zq.zhaopin.com/moment/65807304
https://zq.zhaopin.com/moment/65807307
https://zq.zhaopin.com/moment/65807309
https://zq.zhaopin.com/moment/65807338
https://zq.zhaopin.com/moment/65807311
https://zq.zhaopin.com/moment/65807319
https://zq.zhaopin.com/moment/65807314
https://zq.zhaopin.com/moment/65807343
https://zq.zhaopin.com/moment/65807344
https://zq.zhaopin.com/moment/65807354
https://zq.zhaopin.com/moment/65807352
https://zq.zhaopin.com/moment/65807359
https://zq.zhaopin.com/moment/65807377
https://zq.zhaopin.com/moment/65807382
https://zq.zhaopin.com/moment/65807388
https://zq.zhaopin.com/moment/65807383
https://zq.zhaopin.com/moment/65807395
https://zq.zhaopin.com/moment/65807400
https://zq.zhaopin.com/moment/65807401
https://zq.zhaopin.com/moment/65807404
https://zq.zhaopin.com/moment/65807405
https://zq.zhaopin.com/moment/65807408
https://zq.zhaopin.com/moment/65807420
https://zq.zhaopin.com/moment/65807422
https://zq.zhaopin.com/moment/65807426
https://zq.zhaopin.com/moment/65807428
https://zq.zhaopin.com/moment/65807439
https://zq.zhaopin.com/moment/65807430
https://zq.zhaopin.com/moment/65807438
https://zq.zhaopin.com/moment/65807443
https://zq.zhaopin.com/moment/65807451
https://zq.zhaopin.com/moment/65807444
https://zq.zhaopin.com/moment/65807446
https://zq.zhaopin.com/moment/65807454
https://zq.zhaopin.com/moment/65807458
https://zq.zhaopin.com/moment/65807460
https://zq.zhaopin.com/moment/65807459
https://zq.zhaopin.com/moment/65807462
https://zq.zhaopin.com/moment/65807469
https://zq.zhaopin.com/moment/65807471
https://zq.zhaopin.com/moment/65807473
https://zq.zhaopin.com/moment/65807474
https://zq.zhaopin.com/moment/65807476
https://zq.zhaopin.com/moment/65807481
https://zq.zhaopin.com/moment/65807486
https://zq.zhaopin.com/moment/65807487
https://zq.zhaopin.com/moment/65807493
https://zq.zhaopin.com/moment/65807491
https://zq.zhaopin.com/moment/65807494
https://zq.zhaopin.com/moment/65807501
https://zq.zhaopin.com/moment/65807503
https://zq.zhaopin.com/moment/65807505
https://zq.zhaopin.com/moment/65807504
https://zq.zhaopin.com/moment/65807508
https://zq.zhaopin.com/moment/65807519
https://zq.zhaopin.com/moment/65807509
https://zq.zhaopin.com/moment/65807522
https://zq.zhaopin.com/moment/65807521
https://zq.zhaopin.com/moment/65807526
https://zq.zhaopin.com/moment/65807523
https://zq.zhaopin.com/moment/65807534
https://zq.zhaopin.com/moment/65807529
https://zq.zhaopin.com/moment/65807536
https://zq.zhaopin.com/moment/65807538
https://zq.zhaopin.com/moment/65807541
https://zq.zhaopin.com/moment/65807545
https://zq.zhaopin.com/moment/65807553
https://zq.zhaopin.com/moment/65807555
https://zq.zhaopin.com/moment/65807560
https://zq.zhaopin.com/moment/65807563
https://zq.zhaopin.com/moment/65807564
https://zq.zhaopin.com/moment/65807568
https://zq.zhaopin.com/moment/65807567
https://zq.zhaopin.com/moment/65807571
https://zq.zhaopin.com/moment/65807577
https://zq.zhaopin.com/moment/65807574
https://zq.zhaopin.com/moment/65807591
https://zq.zhaopin.com/moment/65807589
https://zq.zhaopin.com/moment/65807579
https://zq.zhaopin.com/moment/65807586
https://zq.zhaopin.com/moment/65807595
https://zq.zhaopin.com/moment/65807594
https://zq.zhaopin.com/moment/65807600
https://zq.zhaopin.com/moment/65807596
https://zq.zhaopin.com/moment/65807601
https://zq.zhaopin.com/moment/65807602
https://zq.zhaopin.com/moment/65807607
https://zq.zhaopin.com/moment/65807606
https://zq.zhaopin.com/moment/65807618
https://zq.zhaopin.com/moment/65807608
https://zq.zhaopin.com/moment/65807620
https://zq.zhaopin.com/moment/65807619
https://zq.zhaopin.com/moment/65807622
https://zq.zhaopin.com/moment/65807635
https://zq.zhaopin.com/moment/65807626
https://zq.zhaopin.com/moment/65807624
https://zq.zhaopin.com/moment/65807636
https://zq.zhaopin.com/moment/65807643
https://zq.zhaopin.com/moment/65807641
https://zq.zhaopin.com/moment/65807637
https://zq.zhaopin.com/moment/65807647
https://zq.zhaopin.com/moment/65807651
https://zq.zhaopin.com/moment/65807652
https://zq.zhaopin.com/moment/65807654
https://zq.zhaopin.com/moment/65807658
https://zq.zhaopin.com/moment/65807661
https://zq.zhaopin.com/moment/65807662
https://zq.zhaopin.com/moment/65807666
https://zq.zhaopin.com/moment/65807667
https://zq.zhaopin.com/moment/65807669
https://zq.zhaopin.com/moment/65807672
https://zq.zhaopin.com/moment/65807678
https://zq.zhaopin.com/moment/65807680
https://zq.zhaopin.com/moment/65807683
https://zq.zhaopin.com/moment/65807686
https://zq.zhaopin.com/moment/65807692
https://zq.zhaopin.com/moment/65807695
https://zq.zhaopin.com/moment/65807704
https://zq.zhaopin.com/moment/65807705
https://zq.zhaopin.com/moment/65807708
https://zq.zhaopin.com/moment/65807714
https://zq.zhaopin.com/moment/65807711
https://zq.zhaopin.com/moment/65807712
https://zq.zhaopin.com/moment/65807721
https://zq.zhaopin.com/moment/65807719
https://zq.zhaopin.com/moment/65807722
https://zq.zhaopin.com/moment/65807725
https://zq.zhaopin.com/moment/65807728
https://zq.zhaopin.com/moment/65807730
https://zq.zhaopin.com/moment/65807736
https://zq.zhaopin.com/moment/65807745
https://zq.zhaopin.com/moment/65807743
https://zq.zhaopin.com/moment/65807740
https://zq.zhaopin.com/moment/65807750
https://zq.zhaopin.com/moment/65807751
https://zq.zhaopin.com/moment/65807755
https://zq.zhaopin.com/moment/65807754
https://zq.zhaopin.com/moment/65807759
https://zq.zhaopin.com/moment/65807766
https://zq.zhaopin.com/moment/65807767
https://zq.zhaopin.com/moment/65807769
https://zq.zhaopin.com/moment/65807773
https://zq.zhaopin.com/moment/65807772
https://zq.zhaopin.com/moment/65807783
https://zq.zhaopin.com/moment/65807779
https://zq.zhaopin.com/moment/65807784
https://zq.zhaopin.com/moment/65807791
https://zq.zhaopin.com/moment/65807789
https://zq.zhaopin.com/moment/65807792
https://zq.zhaopin.com/moment/65807796
https://zq.zhaopin.com/moment/65807801
https://zq.zhaopin.com/moment/65807799
https://zq.zhaopin.com/moment/65807805
https://zq.zhaopin.com/moment/65807807
https://zq.zhaopin.com/moment/65807815
https://zq.zhaopin.com/moment/65807818
https://zq.zhaopin.com/moment/65807817
https://zq.zhaopin.com/moment/65807821
https://zq.zhaopin.com/moment/65807824
https://zq.zhaopin.com/moment/65807823
https://zq.zhaopin.com/moment/65807831
https://zq.zhaopin.com/moment/65807832
https://zq.zhaopin.com/moment/65807833
https://zq.zhaopin.com/moment/65807835
https://zq.zhaopin.com/moment/65807838
https://zq.zhaopin.com/moment/65807843
https://zq.zhaopin.com/moment/65807848
https://zq.zhaopin.com/moment/65807851
https://zq.zhaopin.com/moment/65807855

